document-xlsx by vasilyu1983/ai-agents-public
npx skills add https://github.com/vasilyu1983/ai-agents-public --skill document-xlsx此技能支持以编程方式创建、编辑和分析 Excel 电子表格。当用户需要生成数据报告、财务模型、自动化 Excel 工作流或处理电子表格数据时,Claude 应应用这些模式。
现代最佳实践(2026年1月):
| 任务 | 工具/库 | 语言 | 使用时机 |
|---|---|---|---|
| 创建 XLSX | ExcelJS | Node.js | 报告、数据导出 |
| 创建 XLSX | openpyxl | Python | 读取/写入、修改现有文件 |
| 创建 XLSX | XlsxWriter | Python | 仅写入、丰富的格式、图表 |
| 数据分析 | pandas + openpyxl | Python |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 带格式的 DataFrame 到 Excel |
| 读取 XLSX | xlsx (SheetJS) | Node.js | 解析电子表格 |
| 图表 | openpyxl/XlsxWriter | Python | 嵌入式可视化 |
| 样式 | ExcelJS/openpyxl | 两者 | 条件格式 |
| 自动化 | xlwings | Python | 已安装 Excel、交互式工作流 |
keep_vba=True),但不能编写宏;切勿从未受信任的输入生成或执行宏。formula 字段;将它们作为文本值写入,并验证/清理用于导出的用户提供数据。import ExcelJS from 'exceljs';
const workbook = new ExcelJS.Workbook();
const sheet = workbook.addWorksheet('Sales Report');
// 带样式的表头
sheet.columns = [
{ header: 'Product', key: 'product', width: 20 },
{ header: 'Quantity', key: 'qty', width: 12 },
{ header: 'Price', key: 'price', width: 12 },
{ header: 'Total', key: 'total', width: 15 },
];
// 样式化表头行
sheet.getRow(1).font = { bold: true };
sheet.getRow(1).fill = {
type: 'pattern',
pattern: 'solid',
fgColor: { argb: 'FF4472C4' }
};
// 添加数据
const data = [
{ product: 'Widget A', qty: 100, price: 10 },
{ product: 'Widget B', qty: 50, price: 25 },
];
data.forEach((item, index) => {
sheet.addRow({
product: item.product,
qty: item.qty,
price: item.price,
total: { formula: `B${index + 2}*C${index + 2}` }
});
});
// 添加总计行
const lastRow = sheet.rowCount + 1;
sheet.addRow({
product: 'TOTAL',
total: { formula: `SUM(D2:D${lastRow - 1})` }
});
// 货币格式化
sheet.getColumn('price').numFmt = '$#,##0.00';
sheet.getColumn('total').numFmt = '$#,##0.00';
await workbook.xlsx.writeFile('report.xlsx');
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
wb = Workbook()
ws = wb.active
ws.title = 'Sales Report'
// 表头
headers = ['Product', 'Quantity', 'Price', 'Total']
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
// 数据
data = [
('Widget A', 100, 10),
('Widget B', 50, 25),
('Widget C', 75, 15),
]
for row_idx, (product, qty, price) in enumerate(data, 2):
ws.cell(row=row_idx, column=1, value=product)
ws.cell(row=row_idx, column=2, value=qty)
ws.cell(row=row_idx, column=3, value=price)
ws.cell(row=row_idx, column=4, value=f'=B{row_idx}*C{row_idx}')
// 总计行
total_row = len(data) + 2
ws.cell(row=total_row, column=1, value='TOTAL')
ws.cell(row=total_row, column=4, value=f'=SUM(D2:D{total_row-1})')
// 数字格式化
for row in range(2, total_row + 1):
ws.cell(row=row, column=3).number_format = '$#,##0.00'
ws.cell(row=row, column=4).number_format = '$#,##0.00'
wb.save('report.xlsx')
import pandas as pd
// 读取 Excel 文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
// 分析
summary = df.groupby('Category').agg({
'Sales': 'sum',
'Quantity': 'mean'
}).round(2)
// 写入 Excel 并格式化
with pd.ExcelWriter('analysis.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='Raw Data', index=False)
summary.to_excel(writer, sheet_name='Summary')
// 自动调整列宽
for sheet in writer.sheets.values():
for column in sheet.columns:
max_length = max(len(str(cell.value)) for cell in column)
sheet.column_dimensions[column[0].column_letter].width = max_length + 2
from openpyxl.chart import BarChart, Reference
chart = BarChart()
chart.title = 'Sales by Product'
chart.x_axis.title = 'Product'
chart.y_axis.title = 'Sales'
// 数据范围(假设 D 列包含系列,第 1 行是表头)
max_row = ws.max_row
data_ref = Reference(ws, min_col=4, min_row=1, max_row=max_row, max_col=4)
categories = Reference(ws, min_col=1, min_row=2, max_row=max_row)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(categories)
chart.shape = 4
ws.add_chart(chart, 'F2')
from openpyxl.formatting.rule import ColorScaleRule, FormulaRule
from openpyxl.styles import PatternFill
// 色阶(热力图)
ws.conditional_formatting.add(
'D2:D100',
ColorScaleRule(
start_type='min', start_color='FF0000',
end_type='max', end_color='00FF00'
)
)
// 高亮超过阈值的单元格
red_fill = PatternFill(start_color='FFCCCC', fill_type='solid')
ws.conditional_formatting.add(
'D2:D100',
FormulaRule(formula=['D2>1000'], fill=red_fill)
)
| 用途 | 公式 | 示例 |
|---|---|---|
| 求和 | =SUM(range) | =SUM(A1:A10) |
| 平均值 | =AVERAGE(range) | =AVERAGE(B2:B100) |
| 计数 | =COUNT(range) | =COUNT(C:C) |
| 条件求和 | =SUMIF(range,criteria,sum_range) | =SUMIF(A:A,"Widget",B:B) |
| 查找 | =VLOOKUP(value,range,col,FALSE) | =VLOOKUP(A2,Data!A:C,3,FALSE) |
| 条件判断 | =IF(condition,true,false) | =IF(B2>100,"High","Low") |
| 百分比 | =value/total | =B2/SUM(B:B) |
Excel Task: [What do you need?]
├─ Create new spreadsheet?
│ ├─ Simple data export → pandas to_excel()
│ ├─ Formatted report → exceljs or openpyxl
│ └─ With charts → openpyxl charts module
│
├─ Read/analyze existing?
│ ├─ Data analysis → pandas read_excel()
│ ├─ Preserve formatting → openpyxl load_workbook()
│ └─ Fast parsing → xlsx (SheetJS)
│
├─ Modify existing?
│ ├─ Add data → openpyxl (preserves formatting)
│ └─ Update formulas → openpyxl
│
└─ Complex features?
├─ Pivot tables → pandas summary tables or xlwings (native pivots)
├─ Data validation → openpyxl DataValidation
└─ Macros → preserve only; use xlwings for Excel automation
#REF!、损坏的命名范围或隐藏在公式中的硬编码常量。assets/spreadsheet-model-review-checklist.md 进行独立审查。仅在明确请求且符合政策时使用。
资源
模板
相关技能
每周安装数
190
仓库
GitHub 星标数
46
首次出现
2026年1月23日
安全审计
安装于
gemini-cli168
opencode167
cursor164
codex163
github-copilot156
cline148
This skill enables creation, editing, and analysis of Excel spreadsheets programmatically. Claude should apply these patterns when users need to generate data reports, financial models, automate Excel workflows, or process spreadsheet data.
Modern Best Practices (Jan 2026) :
| Task | Tool/Library | Language | When to Use |
|---|---|---|---|
| Create XLSX | ExcelJS | Node.js | Reports, data exports |
| Create XLSX | openpyxl | Python | Read/write, modify existing files |
| Create XLSX | XlsxWriter | Python | Write-only, rich formatting, charts |
| Data analysis | pandas + openpyxl | Python | DataFrame to Excel with formatting |
| Read XLSX | xlsx (SheetJS) | Node.js | Parse spreadsheets |
| Charts | openpyxl/XlsxWriter | Python | Embedded visualizations |
| Styling | ExcelJS/openpyxl | Both | Conditional formatting |
| Automation | xlwings | Python | Excel installed, interactive workflows |
keep_vba=True) but does not author macros; never generate or execute macros from untrusted input.formula fields; write them as text values and validate/sanitize user-provided data used in exports.import ExcelJS from 'exceljs';
const workbook = new ExcelJS.Workbook();
const sheet = workbook.addWorksheet('Sales Report');
// Headers with styling
sheet.columns = [
{ header: 'Product', key: 'product', width: 20 },
{ header: 'Quantity', key: 'qty', width: 12 },
{ header: 'Price', key: 'price', width: 12 },
{ header: 'Total', key: 'total', width: 15 },
];
// Style header row
sheet.getRow(1).font = { bold: true };
sheet.getRow(1).fill = {
type: 'pattern',
pattern: 'solid',
fgColor: { argb: 'FF4472C4' }
};
// Add data
const data = [
{ product: 'Widget A', qty: 100, price: 10 },
{ product: 'Widget B', qty: 50, price: 25 },
];
data.forEach((item, index) => {
sheet.addRow({
product: item.product,
qty: item.qty,
price: item.price,
total: { formula: `B${index + 2}*C${index + 2}` }
});
});
// Add totals row
const lastRow = sheet.rowCount + 1;
sheet.addRow({
product: 'TOTAL',
total: { formula: `SUM(D2:D${lastRow - 1})` }
});
// Currency formatting
sheet.getColumn('price').numFmt = '$#,##0.00';
sheet.getColumn('total').numFmt = '$#,##0.00';
await workbook.xlsx.writeFile('report.xlsx');
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
wb = Workbook()
ws = wb.active
ws.title = 'Sales Report'
# Headers
headers = ['Product', 'Quantity', 'Price', 'Total']
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
# Data
data = [
('Widget A', 100, 10),
('Widget B', 50, 25),
('Widget C', 75, 15),
]
for row_idx, (product, qty, price) in enumerate(data, 2):
ws.cell(row=row_idx, column=1, value=product)
ws.cell(row=row_idx, column=2, value=qty)
ws.cell(row=row_idx, column=3, value=price)
ws.cell(row=row_idx, column=4, value=f'=B{row_idx}*C{row_idx}')
# Totals row
total_row = len(data) + 2
ws.cell(row=total_row, column=1, value='TOTAL')
ws.cell(row=total_row, column=4, value=f'=SUM(D2:D{total_row-1})')
# Number formatting
for row in range(2, total_row + 1):
ws.cell(row=row, column=3).number_format = '$#,##0.00'
ws.cell(row=row, column=4).number_format = '$#,##0.00'
wb.save('report.xlsx')
import pandas as pd
# Read Excel file
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# Analysis
summary = df.groupby('Category').agg({
'Sales': 'sum',
'Quantity': 'mean'
}).round(2)
# Write to Excel with formatting
with pd.ExcelWriter('analysis.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='Raw Data', index=False)
summary.to_excel(writer, sheet_name='Summary')
# Auto-adjust column widths
for sheet in writer.sheets.values():
for column in sheet.columns:
max_length = max(len(str(cell.value)) for cell in column)
sheet.column_dimensions[column[0].column_letter].width = max_length + 2
from openpyxl.chart import BarChart, Reference
chart = BarChart()
chart.title = 'Sales by Product'
chart.x_axis.title = 'Product'
chart.y_axis.title = 'Sales'
# Data range (assumes column D contains the series and row 1 is headers)
max_row = ws.max_row
data_ref = Reference(ws, min_col=4, min_row=1, max_row=max_row, max_col=4)
categories = Reference(ws, min_col=1, min_row=2, max_row=max_row)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(categories)
chart.shape = 4
ws.add_chart(chart, 'F2')
from openpyxl.formatting.rule import ColorScaleRule, FormulaRule
from openpyxl.styles import PatternFill
# Color scale (heatmap)
ws.conditional_formatting.add(
'D2:D100',
ColorScaleRule(
start_type='min', start_color='FF0000',
end_type='max', end_color='00FF00'
)
)
# Highlight cells above threshold
red_fill = PatternFill(start_color='FFCCCC', fill_type='solid')
ws.conditional_formatting.add(
'D2:D100',
FormulaRule(formula=['D2>1000'], fill=red_fill)
)
| Purpose | Formula | Example |
|---|---|---|
| Sum | =SUM(range) | =SUM(A1:A10) |
| Average | =AVERAGE(range) | =AVERAGE(B2:B100) |
| Count | =COUNT(range) | =COUNT(C:C) |
| Conditional sum | =SUMIF(range,criteria,sum_range) |
Excel Task: [What do you need?]
├─ Create new spreadsheet?
│ ├─ Simple data export → pandas to_excel()
│ ├─ Formatted report → exceljs or openpyxl
│ └─ With charts → openpyxl charts module
│
├─ Read/analyze existing?
│ ├─ Data analysis → pandas read_excel()
│ ├─ Preserve formatting → openpyxl load_workbook()
│ └─ Fast parsing → xlsx (SheetJS)
│
├─ Modify existing?
│ ├─ Add data → openpyxl (preserves formatting)
│ └─ Update formulas → openpyxl
│
└─ Complex features?
├─ Pivot tables → pandas summary tables or xlwings (native pivots)
├─ Data validation → openpyxl DataValidation
└─ Macros → preserve only; use xlwings for Excel automation
#REF!, broken named ranges, or hardcoded constants hidden in formulas.assets/spreadsheet-model-review-checklist.md.Use only when explicitly requested and policy-compliant.
Resources
Templates
Related Skills
Weekly Installs
190
Repository
GitHub Stars
46
First Seen
Jan 23, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
gemini-cli168
opencode167
cursor164
codex163
github-copilot156
cline148
通过 LiteLLM 代理让 Claude Code 对接 GitHub Copilot 运行 | 高级变通方案指南
31,600 周安装
Sanity Agent Context 教程:为AI智能体提供结构化内容访问,实现智能查询与搜索
180 周安装
机器学习流水线 MLOps 编排指南:多智能体协作构建生产级ML系统
180 周安装
PR计划技能:为开源项目贡献制定战略规划与实施指南 | 开源贡献管理
181 周安装
Datadog文档查询技能 - 快速查找官方文档、限制信息及LLM优化索引
181 周安装
2025年Python开发模式与决策指南:FastAPI、Django、Flask框架选择与异步编程
181 周安装
2025漏洞扫描器与安全测试指南 - OWASP Top 10威胁建模与供应链安全
181 周安装
=SUMIF(A:A,"Widget",B:B) |
| Lookup | =VLOOKUP(value,range,col,FALSE) | =VLOOKUP(A2,Data!A:C,3,FALSE) |
| If | =IF(condition,true,false) | =IF(B2>100,"High","Low") |
| Percentage | =value/total | =B2/SUM(B:B) |