xlsx
npx skills add https://github.com/lingxling/awesome-skills-cn --skill xlsx
Agent 安装分布
Skill 文档
è¾åºè¦æ±
ææ Excel æä»¶
ä¸ä¸åä½
- é¤éç¨æ·å¦æè¯´æï¼å¦åææäº¤ä»ç©ä½¿ç¨ä¸è´çä¸ä¸åä½ï¼ä¾å¦ï¼ArialãTimes New Romanï¼
é¶å ¬å¼é误
- æ¯ä¸ª 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]”
- “æ¥æºï¼Bloombergç»ç«¯ï¼2025å¹´8æ15æ¥ï¼AAPLç¾å½è¡ç¥¨”
- “æ¥æºï¼FactSetï¼2025å¹´8æ20æ¥ï¼ä¸è´é¢æå±å¹”
XLSX å建ãç¼è¾ååæ
æ¦è¿°
ç¨æ·å¯è½è¦æ±ä½ å建ãç¼è¾æåæ.xlsxæä»¶çå 容ã对äºä¸åçä»»å¡ï¼ä½ æä¸åçå·¥å ·å工使µç¨ã
éè¦è¦æ±
LibreOffice å
¬å¼éæ°è®¡ç®æéï¼ä½ å¯ä»¥å设å®è£
äºLibreOfficeï¼ç¨äºä½¿ç¨scripts/recalc.pyèæ¬éæ°è®¡ç®å
¬å¼å¼ãè¯¥èæ¬å¨é¦æ¬¡è¿è¡æ¶èªå¨é
ç½®LibreOfficeï¼å
æ¬å¨Unix奿¥ååéçæ²çç¯å¢ä¸ï¼ç±scripts/office/soffice.pyå¤çï¼
读åååææ°æ®
使ç¨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ç¨äºå ¬å¼/æ ¼å¼å
- å建/å è½½ï¼å建æ°å·¥ä½ç°¿æå è½½ç°ææä»¶
- ä¿®æ¹ï¼æ·»å /ç¼è¾æ°æ®ãå ¬å¼åæ ¼å¼
- ä¿åï¼åå ¥æä»¶
- éæ°è®¡ç®å
¬å¼ï¼å¦æä½¿ç¨å
¬å¼åå¿
é¡»ï¼ï¼ä½¿ç¨scripts/recalc.pyèæ¬
python scripts/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'] = 'New Value'
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æä»¶å
å«ä½ä¸ºå符串çå
¬å¼ä½æ²¡æè®¡ç®å¼ãä½¿ç¨æä¾çscripts/recalc.pyèæ¬éæ°è®¡ç®å
¬å¼ï¼
python scripts/recalc.py <excel_file> [timeout_seconds]
示ä¾ï¼
python scripts/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()æ£æ¥ç©ºå¼ - æå³åï¼è´¢å¹´æ°æ®é常å¨ç¬¬50+åä¸
- å¤ä¸ªå¹é ï¼æç´¢ææåºç°ï¼èä¸ä» ä» æ¯ç¬¬ä¸ä¸ª
- é¤ä»¥é¶ï¼å¨å
¬å¼ä¸ä½¿ç¨
/ä¹åæ£æ¥åæ¯ï¼#DIV/0!ï¼ - é误å¼ç¨ï¼éªè¯ææåå æ ¼å¼ç¨æå颿çåå æ ¼ï¼#REF!ï¼
- 跨工ä½è¡¨å¼ç¨ï¼ä½¿ç¨æ£ç¡®çæ ¼å¼ï¼Sheet1!A1ï¼é¾æ¥å·¥ä½è¡¨
å ¬å¼æµè¯çç¥
- ä»å°å¼å§ï¼å¨å¹¿æ³åºç¨ä¹åå¨2-3个åå æ ¼ä¸æµè¯å ¬å¼
- éªè¯ä¾èµé¡¹ï¼æ£æ¥å ¬å¼ä¸å¼ç¨çææåå æ ¼é½åå¨
- æµè¯è¾¹ç¼æ åµï¼å æ¬é¶ãè´æ°åé常大çå¼
è§£éscripts/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åå ¥ - å ¬å¼è¢«ä¿çä½ä¸è¢«è¯ä¼° – 使ç¨scripts/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æä»¶æ¬èº«ï¼
- åå ·æå¤æå ¬å¼æéè¦å设çåå æ ¼æ·»å 注é
- è®°å½ç¡¬ç¼ç å¼çæ°æ®æº
- å å«å ³é®è®¡ç®å模åé¨åçæ³¨é