跳转至

工作簿操作指南

本页面详细介绍Workbook(工作簿)类的所有操作。

创建工作簿

创建新工作簿

from symphra_excel import Workbook

# 方式1: 直接创建
wb = Workbook()

# 方式2: 使用上下文管理器(推荐)
with Workbook() as wb:
    # ... 操作工作簿
    pass
# 自动关闭和清理资源

加载现有工作簿

# 加载Excel文件
wb = Workbook("existing_file.xlsx")

# 指定完整路径
wb = Workbook("/path/to/file.xlsx")

# 相对路径
wb = Workbook("../data/report.xlsx")

工作表管理

创建工作表

# 创建默认名称的工作表
sheet = wb.create_worksheet()

# 创建指定名称的工作表
sheet = wb.create_worksheet("销售数据")

# 创建多个工作表
sheet1 = wb.create_worksheet("一月")
sheet2 = wb.create_worksheet("二月")
sheet3 = wb.create_worksheet("三月")

获取工作表

# 通过名称获取
sheet = wb.get_worksheet("销售数据")

# 获取第一个工作表
sheet = wb.worksheets[0]

# 遍历所有工作表
for sheet in wb.worksheets:
    print(sheet.title)

删除工作表

# 通过名称删除
wb.delete_worksheet("销售数据")

# 删除工作表对象
wb.delete_worksheet(sheet)

重命名工作表

sheet = wb.get_worksheet("Sheet1")
sheet.title = "新名称"

保存工作簿

保存到文件

# 保存到新文件
wb.save("output.xlsx")

# 保存到指定路径
wb.save("/path/to/output.xlsx")

# 覆盖原文件
wb.save("original.xlsx")

保存到内存

# 获取字节数据
data = wb.save_to_memory()

# 可以用于网络传输或其他用途
with open("output.xlsx", "wb") as f:
    f.write(data)

另存为

# 加载文件
wb = Workbook("template.xlsx")

# 修改后另存为新文件
wb.save("modified.xlsx")

工作簿属性

元数据设置

# 设置文档属性
wb.properties.title = "销售报表"
wb.properties.author = "张三"
wb.properties.company = "ABC公司"
wb.properties.comments = "2024年度销售数据"
wb.properties.keywords = "销售,报表,2024"

获取信息

# 获取工作表数量
count = len(wb.worksheets)

# 获取所有工作表名称
names = [sheet.title for sheet in wb.worksheets]

# 检查工作表是否存在
if "销售数据" in wb.worksheet_names:
    sheet = wb.get_worksheet("销售数据")

高级功能

复制工作簿

# 创建工作簿的副本
wb1 = Workbook("template.xlsx")
wb2 = wb1.copy()
wb2.save("copy.xlsx")

批量创建工作簿

# 批量创建多个报表
departments = ["销售部", "技术部", "人事部"]

for dept in departments:
    with Workbook() as wb:
        sheet = wb.create_worksheet(dept)
        sheet.set_cell_value("A1", f"{dept}数据")
        wb.save(f"{dept}_report.xlsx")

模板模式

# 使用模板创建多个文件
template = Workbook("template.xlsx")

for i in range(10):
    wb = template.copy()
    sheet = wb.worksheets[0]
    sheet.set_cell_value("A1", f"报表 {i+1}")
    wb.save(f"report_{i+1}.xlsx")

完整示例

示例1: 创建多工作表报表

from symphra_excel import Workbook
from symphra_excel.styles import PredefinedStyles

with Workbook() as wb:
    # 创建三个工作表
    for month in ["一月", "二月", "三月"]:
        sheet = wb.create_worksheet(month)

        # 添加表头
        headers = ["日期", "销售额", "利润"]
        for col_idx, header in enumerate(headers):
            cell = f"{chr(65+col_idx)}1"
            sheet.set_cell_value(cell, header)
            sheet.apply_style(cell, PredefinedStyles.header_style())

        # 添加示例数据
        for day in range(1, 6):
            sheet.set_cell_value(f"A{day+1}", f"{month}{day}日")
            sheet.set_cell_value(f"B{day+1}", day * 1000)
            sheet.set_cell_value(f"C{day+1}", day * 300)

    wb.save("quarterly_report.xlsx")

示例2: 从模板批量生成

from symphra_excel import Workbook

# 准备数据
employees = [
    {"name": "张三", "dept": "销售部", "salary": 15000},
    {"name": "李四", "dept": "技术部", "salary": 18000},
    {"name": "王五", "dept": "人事部", "salary": 12000},
]

# 为每个员工生成工资单
for emp in employees:
    with Workbook() as wb:
        sheet = wb.create_worksheet("工资单")

        sheet.set_cell_value("A1", "姓名")
        sheet.set_cell_value("B1", emp["name"])
        sheet.set_cell_value("A2", "部门")
        sheet.set_cell_value("B2", emp["dept"])
        sheet.set_cell_value("A3", "工资")
        sheet.set_cell_value("B3", emp["salary"])

        wb.save(f"salary_{emp['name']}.xlsx")

最佳实践

✅ 推荐做法

# 使用上下文管理器
with Workbook() as wb:
    sheet = wb.create_worksheet("数据")
    sheet.set_cell_value("A1", "Hello")
    wb.save("output.xlsx")

# 批量操作前检查
if "数据" not in wb.worksheet_names:
    wb.create_worksheet("数据")

# 使用try-except处理异常
try:
    wb.save("output.xlsx")
except Exception as e:
    print(f"保存失败: {e}")

❌ 避免的做法

# 不要忘记关闭
wb = Workbook()
# ... 操作
# 忘记调用 wb.close()

# 不要重复创建同名工作表
wb.create_worksheet("数据")
wb.create_worksheet("数据")  # 可能导致错误

# 不要在循环中不必要地保存
for i in range(1000):
    wb.save("output.xlsx")  # 太慢了!

错误处理

常见错误

from symphra_excel.utils.exceptions import (
    WorksheetNotFoundError,
    InvalidWorkbookError
)

try:
    wb = Workbook("non_existent.xlsx")
except FileNotFoundError:
    print("文件不存在")

try:
    sheet = wb.get_worksheet("不存在的表")
except WorksheetNotFoundError:
    print("工作表不存在")
    sheet = wb.create_worksheet("不存在的表")

性能优化

大文件处理

from symphra_excel.memory_ops import MemoryOptimizedWorkbook

# 处理大文件时使用内存优化版本
with MemoryOptimizedWorkbook() as wb:
    sheet = wb.create_worksheet("大数据")

    # 批量写入大量数据
    for i in range(100000):
        sheet.set_cell_value(f"A{i+1}", f"Data {i}")

    wb.save("large_file.xlsx")

下一步