xlsx
npx skills add https://github.com/marcelleon/skills-zh --skill xlsx
Agent 安装分布
Skill 文档
è¾åºè¦æ±
ææ Excel æä»¶
é¶å ¬å¼é误
- æ¯ä¸ª Excel 模åå¿ é¡»ä»¥é¶å ¬å¼é误交ä»ï¼#REF!ã#DIV/0!ã#VALUE!ã#N/Aã#NAME?ï¼
ä¿çç°ææ¨¡æ¿ï¼æ´æ°æ¨¡æ¿æ¶ï¼
- ä¿®æ¹æä»¶æ¶ç ç©¶å¹¶å®å ¨å¹é ç°ææ ¼å¼ãæ ·å¼å约å®
- ç»ä¸å¯¹å ·ææ¢å®æ¨¡å¼çæä»¶å¼ºå æ ååæ ¼å¼
- ç°ææ¨¡æ¿çº¦å®å§ç»è¦çè¿äºæå
è´¢å¡æ¨¡å
é¢è²ç¼ç æ å
é¤éç¨æ·æç°ææ¨¡æ¿å¦æè¯´æ
è¡ä¸æ åé¢è²çº¦å®
- èè²ææ¬ (RGB: 0,0,255)ï¼ç¡¬ç¼ç è¾å ¥ï¼ä»¥åç¨æ·å°ä¸ºåºæ¯æ´æ¹çæ°å
- é»è²ææ¬ (RGB: 0,0,0)ï¼ææå ¬å¼å计ç®
- ç»¿è²ææ¬ (RGB: 0,128,0)ï¼ä»åä¸å·¥ä½ç°¿ä¸çå ¶ä»å·¥ä½è¡¨æåç龿¥
- çº¢è²ææ¬ (RGB: 255,0,0)ï¼å°å ¶ä»æä»¶çå¤é¨é¾æ¥
- é»è²èæ¯ (RGB: 255,255,0)ï¼éè¦æ³¨æçå ³é®å设æéè¦æ´æ°çåå æ ¼
æ°åæ ¼å¼æ å
å¿ éçæ ¼å¼è§å
- å¹´ä»½ï¼æ ¼å¼åä¸ºææ¬å符串ï¼ä¾å¦ï¼”2024″ è䏿¯ “2,024”ï¼
- è´§å¸ï¼ä½¿ç¨ $#,##0 æ ¼å¼ï¼å§ç»å¨æ é¢ä¸æå®åä½ï¼”æ¶å ¥ï¼ç¾ä¸ç¾å ï¼”ï¼
- é¶ï¼ä½¿ç¨æ°åæ ¼å¼ä½¿ææé¶ä¸º “-“ï¼å æ¬ç¾åæ¯ï¼ä¾å¦ï¼”$#,##0;($#,##0);-“ï¼
- ç¾åæ¯ï¼é»è®¤ä¸º 0.0% æ ¼å¼ï¼ä¸ä½å°æ°ï¼
- åæ°ï¼æ ¼å¼å为 0.0x ç¨äºä¼°å¼åæ°ï¼EV/EBITDAãP/Eï¼
- è´æ°ï¼ä½¿ç¨æ¬å· (123) è䏿¯åå· -123
å ¬å¼æå»ºè§å
å设æ¾ç½®
- å°ææå设ï¼å¢é¿çã婿¶¦çãåæ°çï¼æ¾å¨åç¬çå设åå æ ¼ä¸
- å¨å ¬å¼ä¸ä½¿ç¨åå æ ¼å¼ç¨è䏿¯ç¡¬ç¼ç å¼
- 示ä¾ï¼ä½¿ç¨ =B5*(1+$B$6) è䏿¯ =B5*1.05
å ¬å¼é误é¢é²
- éªè¯ææåå æ ¼å¼ç¨æ¯å¦æ£ç¡®
- æ£æ¥èå´ä¸çåç§»ä¸ä¸ªé误
- ç¡®ä¿ææé¢æµæé´çå ¬å¼ä¸è´
- 使ç¨è¾¹ç¼æ¡ä¾æµè¯ï¼é¶å¼ãè´æ°ï¼
- éªè¯æ²¡ææå¤ç循ç¯å¼ç¨
硬ç¼ç çææ¡£è¦æ±
- å¨åå æ ¼æè¾¹ï¼å¦ææ¯è¡¨æ ¼æ«å°¾ï¼æ³¨éæè¯´æãæ ¼å¼ï¼”æ¥æºï¼[ç³»ç»/ææ¡£]ã[æ¥æ]ã[å ·ä½åè]ã[URLï¼å¦æéç¨ï¼]”
- 示ä¾ï¼
- “æ¥æºï¼å ¬å¸ 10-Kï¼2024 财年ï¼ç¬¬ 45 é¡µï¼æ¶å ¥è¯´æï¼[SEC EDGAR URL]”
- “æ¥æºï¼å ¬å¸ 10-Qï¼2025 年第äºå£åº¦ï¼éä»¶ 99.1ï¼[SEC EDGAR URL]”
- “æ¥æºï¼å½åç»ç«¯ï¼2025/8/15ï¼AAPL US Equity”
- “æ¥æºï¼FactSetï¼2025/8/20ï¼å ±è¯ä¼°è®¡å±å¹”
XLSX å建ãç¼è¾ååæ
æ¦è¿°
ç¨æ·å¯è½ä¼è¦æ±æ¨å建ãç¼è¾æåæ .xlsx æä»¶çå å®¹ãæ¨æä¸åçå·¥å ·å工使µç¨å¯ç¨äºä¸åçä»»å¡ã
éè¦è¦æ±
LibreOffice ç¨äºå
¬å¼éæ°è®¡ç®æ¯å¿
éçï¼æ¨å¯ä»¥å设已å®è£
LibreOfficeï¼ä»¥ä½¿ç¨ recalc.py èæ¬éæ°è®¡ç®å
¬å¼å¼ãèæ¬å¨é¦æ¬¡è¿è¡æ¶èªå¨é
ç½® LibreOffice
读åååææ°æ®
ä½¿ç¨ pandas è¿è¡æ°æ®åæ
å¯¹äºæ°æ®åæãå¯è§åååºæ¬æä½ï¼ä½¿ç¨ pandasï¼å®æä¾å¼ºå¤§çæ°æ®æä½åè½ï¼
import pandas as pd
# 读å Excel
df = pd.read_excel('file.xlsx') # é»è®¤ï¼ç¬¬ä¸ä¸ªå·¥ä½è¡¨
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # ææå·¥ä½è¡¨ä½ä¸ºåå
¸
# åæ
df.head() # é¢è§æ°æ®
df.info() # åä¿¡æ¯
df.describe() # ç»è®¡
# åå
¥ Excel
df.to_excel('output.xlsx', index=False)
Excel æä»¶å·¥ä½æµç¨
å ³é®ï¼ä½¿ç¨å ¬å¼ï¼èé硬ç¼ç å¼
å§ç»ä½¿ç¨ Excel å ¬å¼è䏿¯å¨ Python ä¸è®¡ç®å¼å¹¶ç¡¬ç¼ç å®ä»¬ã è¿ç¡®ä¿çµåè¡¨æ ¼ä¿æå¨æå坿´æ°ã
â é误 – 硬ç¼ç 计ç®å¼
# ä¸å¥½ï¼å¨ Python ä¸è®¡ç®å¹¶ç¡¬ç¼ç ç»æ
total = df['Sales'].sum()
sheet['B10'] = total # 硬ç¼ç 5000
# ä¸å¥½ï¼å¨ Python ä¸è®¡ç®å¢é¿ç
growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
sheet['C5'] = growth # 硬ç¼ç 0.15
# ä¸å¥½ï¼Python 计ç®å¹³åå¼
avg = sum(values) / len(values)
sheet['D20'] = avg # 硬ç¼ç 42.5
â æ£ç¡® – ä½¿ç¨ Excel å ¬å¼
# 好ï¼è®© Excel è®¡ç®æ»å
sheet['B10'] = '=SUM(B2:B9)'
# 好ï¼å¢é¿çä½ä¸º Excel å
¬å¼
sheet['C5'] = '=(C4-C2)/C2'
# 好ï¼ä½¿ç¨ Excel 彿°çå¹³åå¼
sheet['D20'] = '=AVERAGE(D2:D19)'
è¿éç¨äºææè®¡ç® – æ»è®¡ãç¾åæ¯ãæ¯çãå·®å¼çãçµåè¡¨æ ¼åºè¯¥è½å¤å¨æºæ°æ®æ´æ¹æ¶éæ°è®¡ç®ã
常è§å·¥ä½æµç¨
- éæ©å·¥å ·ï¼pandas ç¨äºæ°æ®ï¼openpyxl ç¨äºå ¬å¼/æ ¼å¼
- å建/å è½½ï¼å建æ°å·¥ä½ç°¿æå è½½ç°ææä»¶
- ä¿®æ¹ï¼æ·»å /ç¼è¾æ°æ®ãå ¬å¼åæ ¼å¼
- ä¿åï¼åå ¥æä»¶
- éæ°è®¡ç®å
¬å¼ï¼å¦æä½¿ç¨å
¬å¼åå¿
éï¼ï¼ä½¿ç¨ recalc.py èæ¬
python recalc.py output.xlsx - éªè¯å¹¶ä¿®å¤ä»»ä½é误ï¼
- èæ¬è¿å带æé误详ç»ä¿¡æ¯ç JSON
- 妿
status为errors_foundï¼æ£æ¥error_summary以è·åç¹å®é误类ååä½ç½® - ä¿®å¤è¯å«çéè¯¯å¹¶åæ¬¡éæ°è®¡ç®
- è¦ä¿®å¤ç常è§é误ï¼
#REF!ï¼æ æçåå æ ¼å¼ç¨#DIV/0!ï¼é¤ä»¥é¶#VALUE!ï¼å ¬å¼ä¸çéè¯¯æ°æ®ç±»å#NAME?ï¼æ æ³è¯å«çå ¬å¼åç§°
åå»ºæ° Excel æä»¶
# ä½¿ç¨ openpyxl å¤çå
¬å¼åæ ¼å¼
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
sheet = wb.active
# æ·»å æ°æ®
sheet['A1'] = 'Hello'
sheet['B1'] = 'World'
sheet.append(['Row', 'of', 'data'])
# æ·»å å
¬å¼
sheet['B2'] = '=SUM(A1:A10)'
# æ ¼å¼
sheet['A1'].font = Font(bold=True, color='FF0000')
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
sheet['A1'].alignment = Alignment(horizontal='center')
# å宽
sheet.column_dimensions['A'].width = 20
wb.save('output.xlsx')
ç¼è¾ç°æ Excel æä»¶
# ä½¿ç¨ openpyxl ä¿çå
¬å¼åæ ¼å¼
from openpyxl import load_workbook
# å è½½ç°ææä»¶
wb = load_workbook('existing.xlsx')
sheet = wb.active # æ wb['SheetName'] ç¨äºç¹å®å·¥ä½è¡¨
# 使ç¨å¤ä¸ªå·¥ä½è¡¨
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
print(f"å·¥ä½è¡¨ï¼{sheet_name}")
# ä¿®æ¹åå
æ ¼
sheet['A1'] = 'æ°å¼'
sheet.insert_rows(2) # å¨ä½ç½® 2 æå
¥è¡
sheet.delete_cols(3) # å é¤å 3
# æ·»å æ°å·¥ä½è¡¨
new_sheet = wb.create_sheet('NewSheet')
new_sheet['A1'] = 'Data'
wb.save('modified.xlsx')
éæ°è®¡ç®å ¬å¼
ç± openpyxl å建æä¿®æ¹ç Excel æä»¶å
å«å符串形å¼çå
¬å¼ï¼ä½ä¸å
å«è®¡ç®å¼ãä½¿ç¨æä¾ç recalc.py èæ¬éæ°è®¡ç®å
¬å¼ï¼
python recalc.py <excel_file> [timeout_seconds]
示ä¾ï¼
python recalc.py output.xlsx 30
èæ¬ï¼
- 馿¬¡è¿è¡æ¶èªå¨è®¾ç½® LibreOffice å®
- éæ°è®¡ç®ææå·¥ä½è¡¨ä¸çææå ¬å¼
- æ«æææåå æ ¼ä»¥æ¥æ¾ Excel é误ï¼#REF!ã#DIV/0! çï¼
- è¿å带æè¯¦ç»é误ä½ç½®å计æ°ç JSON
- å¨ Linux å macOS ä¸åå¯å·¥ä½
å ¬å¼éªè¯æ£æ¥æ¸ å
å¿«éæ£æ¥ä»¥ç¡®ä¿å ¬å¼æ£å¸¸å·¥ä½ï¼
åºæ¬éªè¯
- æµè¯ 2-3 个示ä¾å¼ç¨ï¼å¨æå»ºå®æ´æ¨¡åä¹åéªè¯å®ä»¬æåæ£ç¡®çå¼
- åæ å°ï¼ç¡®è®¤ Excel åå¹é ï¼ä¾å¦ï¼å 64 = BLï¼ä¸æ¯ BKï¼
- è¡åç§»ï¼è®°ä½ Excel è¡æ¯ 1 ç´¢å¼çï¼DataFrame è¡ 5 = Excel è¡ 6ï¼
常è§é·é±
- NaN å¤çï¼ä½¿ç¨
pd.notna()æ£æ¥ç©ºå¼ - æå³ä¾§åï¼FY æ°æ®éå¸¸å¨ 50+ å
- å¤ä¸ªå¹é ï¼æç´¢ææåºç°ï¼èä¸ä» ä» æ¯ç¬¬ä¸ä¸ª
- é¤ä»¥é¶ï¼å¨å
¬å¼ä¸ä½¿ç¨
/ä¹åæ£æ¥åæ¯ï¼#DIV/0!ï¼ - é误å¼ç¨ï¼éªè¯ææåå æ ¼å¼ç¨æå颿çåå æ ¼ï¼#REF!ï¼
- 跨工ä½è¡¨å¼ç¨ï¼ä½¿ç¨æ£ç¡®æ ¼å¼ï¼Sheet1!A1ï¼é¾æ¥å·¥ä½è¡¨
å ¬å¼æµè¯çç¥
- ä»å°å¤å¼å§ï¼å¨å¹¿æ³åºç¨ä¹åå¨ 2-3 个åå æ ¼ä¸æµè¯å ¬å¼
- éªè¯ä¾èµé¡¹ï¼æ£æ¥å ¬å¼ä¸å¼ç¨çææåå æ ¼æ¯å¦åå¨
- æµè¯è¾¹ç¼æ¡ä¾ï¼å æ¬é¶ãè´æ°åé常大çå¼
è§£é recalc.py è¾åº
èæ¬è¿å带æé误详ç»ä¿¡æ¯ç JSONï¼
{
"status": "success", // æ "errors_found"
"total_errors": 0, // æ»é误计æ°
"total_formulas": 42, // æä»¶ä¸çå
¬å¼æ°é
"error_summary": { // ä»
å¨åç°é误æ¶åºç°
"#REF!": {
"count": 2,
"locations": ["Sheet1!B5", "Sheet1!C10"]
}
}
}
æä½³å®è·µ
åºéæ©
- pandasï¼æéåæ°æ®åæãæ¹éæä½åç®åæ°æ®å¯¼åº
- openpyxlï¼æéåå¤ææ ¼å¼ãå ¬å¼å Excel ç¹å®åè½
ä½¿ç¨ openpyxl
- åå æ ¼ç´¢å¼æ¯ 1 åºçï¼row=1ï¼column=1 æåå æ ¼ A1ï¼
- 使ç¨
data_only=True读å计ç®å¼ï¼load_workbook('file.xlsx', data_only=True) - è¦åï¼å¦æä½¿ç¨
data_only=Trueæå¼å¹¶ä¿åï¼å ¬å¼å°è¢«å¼æ¿æ¢å¹¶æ°¸ä¹ 丢失 - 对äºå¤§æä»¶ï¼ä½¿ç¨
read_only=Trueè¿è¡è¯»åæwrite_only=Trueè¿è¡åå ¥ - å ¬å¼è¢«ä¿çä½ä¸è¢«è¯ä¼° – ä½¿ç¨ recalc.py æ´æ°å¼
ä½¿ç¨ pandas
- æå®æ°æ®ç±»å以é¿å
æ¨æé®é¢ï¼
pd.read_excel('file.xlsx', dtype={'id': str}) - 对äºå¤§æä»¶ï¼è¯»åç¹å®åï¼
pd.read_excel('file.xlsx', usecols=['A', 'C', 'E']) - æ£ç¡®å¤çæ¥æï¼
pd.read_excel('file.xlsx', parse_dates=['date_column'])
代ç 飿 ¼æå
éè¦ï¼ä¸º Excel æä½çæ Python ä»£ç æ¶ï¼
- ç¼åæå°ãç®æ´ç Python 代ç ï¼æ ä¸å¿ è¦ç注é
- é¿å åé¿çåéååå使ä½
- é¿å ä¸å¿ è¦ç print è¯å¥
å¯¹äº Excel æä»¶æ¬èº«ï¼
- ä¸ºå ·æå¤æå ¬å¼æéè¦å设çåå æ ¼æ·»å 注é
- è®°å½ç¡¬ç¼ç å¼çæ°æ®æº
- å å«å ³é®è®¡ç®å模åé¨åç说æ