文档 XLSX

作者:技能派办公效率v1

创建、编辑、审计和提取 Excel 电子表格(.xlsx):生成报表/导出数据、应用公式/格式/图表/数据验证、解析已有工作簿,防范电子表格风险(公式注入、断链、隐藏行)。支持 ExcelJS、openpyxl、pandas、XlsxWriter 和 SheetJS。触发词:Excel、电子表格、xlsx、报表导出、数据分析表

下载量
263
点赞
66
价格
免费

技能文档

---
name: document-xlsx
title: 文档 XLSX
category: 办公效率
description: "创建、编辑、审计和提取 Excel 电子表格(.xlsx):生成报表/导出数据、应用公式/格式/图表/数据验证、解析已有工作簿,防范电子表格风险(公式注入、断链、隐藏行)。支持 ExcelJS、openpyxl、pandas、XlsxWriter 和 SheetJS。触发词:Excel、电子表格、xlsx、报表导出、数据分析表"
---

# 文档 XLSX 技能 — 快速参考

本技能支持以编程方式创建、编辑和分析 Excel 电子表格。当用户需要生成数据报表、财务模型、自动化 Excel 工作流或处理电子表格数据时,应用以下模式。

**现代最佳实践(2026年1月)**:
- 将电子表格视为软件:清晰的输入/输出、可审计性和版本管理。
- 保护数据完整性:控制总计、数据验证和来源可追溯性。
- 可访问性:标签、对比度、结构;使用 Excel 的无障碍检查器;在对外分发时满足采购/法规要求。
- 在欧盟或受监管环境中分发时,遵循适用的可访问性要求(通常与 EN 301 549 / WCAG 对齐)。
- 交付时附带审查环节和责任人(避免"不明模型")。
- 安全性:将不受信任的输入/工作簿视为敌对(公式注入、外部链接、隐藏内容、宏)。

---

## 快速参考

| 任务 | 工具/库 | 语言 | 适用场景 |
|------|---------|------|----------|
| 创建 XLSX | ExcelJS | Node.js | 报表、数据导出 |
| 创建 XLSX | openpyxl | Python | 读写、修改已有文件 |
| 创建 XLSX | XlsxWriter | Python | 仅写入、丰富格式、图表 |
| 数据分析 | pandas + openpyxl | Python | DataFrame 转 Excel 并带格式 |
| 读取 XLSX | xlsx (SheetJS) | Node.js | 解析电子表格 |
| 图表 | openpyxl/XlsxWriter | Python | 嵌入式可视化 |
| 样式 | ExcelJS/openpyxl | 两者皆可 | 条件格式 |
| 自动化 | xlwings | Python | 已安装 Excel 的交互式工作流 |

## 防护规则与注意事项

- 公式计算:库只写入公式;Excel 在打开时计算结果。如需服务端计算值,在代码中计算后写入值(或使用专用公式引擎)。
- 数据透视表:编程创建能力有限。优先使用 pandas 汇总(将透视表作为数据),或 Excel 自动化(xlwings/Office Scripts/VBA)来实现原生透视表。
- 宏:openpyxl 可保留已有 VBA(`keep_vba=True`)但不能编写宏;切勿从不受信任的输入生成或执行宏。
- 电子表格注入:切勿将不受信任的字符串放入 `formula` 字段;将其写为文本值并验证/清理导出中使用的用户数据。

---

## 技能工作流

### 步骤1:创建电子表格(Node.js - ExcelJS)

```typescript
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');
```

### 步骤2:创建电子表格(Python - openpyxl)

```python
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')
```

### 步骤3:读取与分析(Python - pandas)

```python
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
```

### 步骤4:添加图表(Python)

```python
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')
```

### 步骤5:条件格式

```python
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)
)
```

---

## 常用公式参考

| 用途 | 公式 | 示例 |
|------|------|------|
| 求和 | `=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)` |

---

## 决策树

```text
Excel 任务: [你需要做什么?]
    ├─ 创建新电子表格?
    │   ├─ 简单数据导出 → pandas to_excel()
    │   ├─ 格式化报表 → exceljs 或 openpyxl
    │   └─ 带图表 → openpyxl 图表模块
    │
    ├─ 读取/分析已有文件?
    │   ├─ 数据分析 → pandas read_excel()
    │   ├─ 保留格式 → openpyxl load_workbook()
    │   └─ 快速解析 → xlsx (SheetJS)
    │
    ├─ 修改已有文件?
    │   ├─ 添加数据 → openpyxl(保留格式)
    │   └─ 更新公式 → openpyxl
    │
    └─ 复杂功能?
        ├─ 数据透视表 → pandas 汇总表或 xlwings(原生透视表)
        ├─ 数据验证 → openpyxl DataValidation
        └─ 宏 → 仅保留;使用 xlwings 进行 Excel 自动化
```

---

## 规范与禁忌

### 推荐做法

- 分离输入/计算/输出(选项卡或清晰分区)。
- 保持假设显式(值 + 单位 + 来源 + 日期)。
- 为导入数据添加控制总计和核对检查。

### 避免做法

- 在公式中使用无文档记录的硬编码常量。
- 隐藏改变结果的行/列而不加说明。
- 共享包含客户 PII 或密钥的电子表格。

## 质量标准

- 结构:清晰的输入/假设、计算和输出分离(选项卡或分区)。
- 完整性:无 `#REF!`、断裂的命名范围或隐藏在公式中的硬编码常量。
- 可追溯性:每个关键输出都可追溯到有标签的输入(单位 + 来源 + 日期)。
- 检查:控制总计、核对和错误标志能明确报错。
- 审查:独立审查环节,使用模型 QA 检查清单(假设、公式、可追溯性)。

## 可选:AI / 自动化

仅在明确请求且符合策略时使用。

- 生成初稿公式/图表;人工验证正确性和边界情况。
- 起草文档选项卡(假设、术语表);不编造来源数据。

使用说明

# 文档 XLSX

以编程方式创建、编辑和分析 Excel 电子表格,支持公式、图表、条件格式和数据验证。

## 使用

对话中直接描述需求即可触发:

```text
帮我生成一份销售数据 Excel 报表,包含产品、数量、单价和合计列
```

```text
读取 data.xlsx 并按类别汇总销售额
```

## 工作原理

根据任务自动选择合适的库:

- **创建报表**:ExcelJS(Node.js)或 openpyxl(Python),支持样式、公式和图表
- **数据分析**:pandas + openpyxl,DataFrame 直接导出为格式化 Excel
- **读取解析**:SheetJS(Node.js)或 pandas(Python),快速提取数据
- **条件格式与图表**:openpyxl 内置支持热力图、柱状图等可视化

内置安全防护:防范公式注入、外部链接风险和宏安全处理。

如何安装此技能?

访问技能市场,点击「安装」按钮,按提示将技能包放入 AI 编程助手的 skills 目录即可。

浏览技能市场

支持平台:Qoder · QoderWork · Claude · Codex 等 AI 编程助手