电子表格处理

作者:技能派办公效率v1

创建、编辑和分析 Excel 电子表格(.xlsx/.xlsm/.csv/.tsv),支持公式、格式化、数据分析和可视化。当用户需要创建带公式的电子表格、读取或分析表格数据、修改已有表格并保留公式、进行数据可视化时触发。触发词:Excel、XLSX、电子表格、表格处理、数据分析

下载量
270
点赞
68
价格
免费

技能文档

---
name: document-skillsxlsx
title: 电子表格处理
category: 办公效率
description: "创建、编辑和分析 Excel 电子表格(.xlsx/.xlsm/.csv/.tsv),支持公式、格式化、数据分析和可视化。当用户需要创建带公式的电子表格、读取或分析表格数据、修改已有表格并保留公式、进行数据可视化时触发。触发词:Excel、XLSX、电子表格、表格处理、数据分析"
---

# 电子表格处理

## 语言与质量标准

使用用户所用的语言回复。保持简洁,优先节省 token,未解决的问题列在末尾。

---

# 输出要求

## 所有 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,FY2024,第 45 页,收入附注,[SEC EDGAR URL]"
  - "来源:Bloomberg 终端,2025/8/15,AAPL US Equity"

# 电子表格创建、编辑与分析

## 技能工作流

### 步骤1:选择工具

根据任务类型选择工具:
- **pandas**:数据分析、批量操作、简单导出
- **openpyxl**:复杂格式化、公式、Excel 特有功能

### 步骤2:读取与分析数据

使用 pandas 进行数据分析和可视化:

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

### 步骤3:创建或加载文件

**关键原则:使用 Excel 公式而非 Python 硬编码计算值。** 确保电子表格保持动态可更新。

#### 错误做法 — 硬编码计算值
```python
# 错误:在 Python 中计算后硬编码结果
total = df['Sales'].sum()
sheet['B10'] = total  # 硬编码 5000

growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
sheet['C5'] = growth  # 硬编码 0.15
```

#### 正确做法 — 使用 Excel 公式
```python
# 正确:让 Excel 计算求和
sheet['B10'] = '=SUM(B2:B9)'

# 正确:Excel 公式计算增长率
sheet['C5'] = '=(C4-C2)/C2'

# 正确:Excel 函数计算平均值
sheet['D20'] = '=AVERAGE(D2:D19)'
```

### 步骤4:创建新文件

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

### 步骤5:编辑已有文件

```python
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('新表')
new_sheet['A1'] = '数据'

wb.save('modified.xlsx')
```

### 步骤6:重新计算公式(使用公式时必须执行)

openpyxl 创建或修改的文件中公式仅保存为字符串,不包含计算值。使用 recalc.py 脚本重新计算:

```bash
python recalc.py output.xlsx 30
```

脚本功能:
- 首次运行自动配置 LibreOffice
- 重新计算所有工作表中的所有公式
- 扫描所有单元格检查 Excel 错误
- 返回包含详细错误位置和计数的 JSON
- 支持 Linux 和 macOS

#### 解读 recalc.py 输出

脚本返回 JSON 格式的错误详情:
```json
{
  "status": "success",
  "total_errors": 0,
  "total_formulas": 42,
  "error_summary": {
    "#REF!": {
      "count": 2,
      "locations": ["Sheet1!B5", "Sheet1!C10"]
    }
  }
}
```

如果 `status` 为 `errors_found`,根据 `error_summary` 中的错误类型和位置修复后重新计算。

### 步骤7:验证与排错

#### 基本验证
- 测试 2-3 个样本引用,确认能获取正确值
- 确认列映射正确(如第 64 列 = BL,不是 BK)
- 记住 Excel 行号从 1 开始(DataFrame 第 5 行 = Excel 第 6 行)

#### 常见陷阱
- 用 `pd.notna()` 检查空值
- 财务数据常在 50 列以后
- 搜索所有匹配项而非仅第一个
- 检查公式中除数是否为零(#DIV/0!)
- 验证所有单元格引用指向正确位置(#REF!)
- 跨表引用使用正确格式(Sheet1!A1)

#### 公式测试策略
- 先在 2-3 个单元格测试公式再大范围应用
- 检查公式引用的所有单元格是否存在
- 测试零值、负值和极大值等边界情况

## 最佳实践

### 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'])`

### 代码风格
- 编写简洁的 Python 代码,不加多余注释
- 避免冗长的变量名和多余操作
- 避免不必要的 print 语句
- 在 Excel 单元格中为复杂公式或重要假设添加批注
- 为硬编码值注明数据来源

使用说明

# 电子表格处理

创建、编辑和分析 Excel 电子表格,支持公式、格式化、数据分析和可视化。

## 使用

```python
from openpyxl import Workbook

wb = Workbook()
sheet = wb.active
sheet['A1'] = '产品'
sheet['B1'] = '销售额'
sheet['A2'] = '合计'
sheet['B2'] = '=SUM(B3:B100)'
wb.save('报表.xlsx')
```

## 工作原理

基于 pandas 和 openpyxl 实现电子表格全流程操作:

- **读取分析**:pandas 读取数据并生成统计摘要
- **创建编辑**:openpyxl 写入公式、格式化和多工作表操作
- **公式计算**:通过 LibreOffice 自动重算所有公式并检测错误
- **质量保障**:交付前扫描零公式错误,保留已有模板格式

## 适用场景

- 创建带公式和格式化的新表格
- 读取和分析已有表格数据
- 修改表格并保留原有公式
- 财务模型的颜色编码与数字格式
- 数据可视化与统计分析

如何安装此技能?

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

浏览技能市场

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