Python中使用第三方库xlutils实现Excel追加写入
针对Python原生库难以直接修改已有Excel文件的限制,本文介绍基于第三方组件xlutils与xlrd的替代方案。通过读取原表总行数定位空白区,复制工作表结构后逐列填入新数据,最终另存为新文档。方法简单稳定,适用于历史表格的增量维护。
实现原理与风险提醒
现有Python标准库对直接定位并修改封闭的Excel文件支持较弱。采用xlutils的核心思路是“读取 → 复制 → 覆写 → 另存”。该方案会在内存中生成原始表格的副本,避免直接操作导致源文件损坏。由于该组合主要面向早期.xls格式优化,若您的文件为新版.xlsx格式,建议在运行前转换为兼容格式,或考虑使用openpyxl/pandas等现代组件。
在涉及数据写入与覆盖操作前,务必备份原始Excel文件,防止因编码冲突或版本不匹配导致内容丢失。
第1步:安装依赖与创建项目目录
本方案依赖xlrd读取权限控制与xlutils的写入能力。通过包管理器完成环境初始化:
pip install xlrd xlutils
完成后准备一份待追加的Excel测试文件(例如./test_append.xls),确保文件未被其他程序独占锁定。
第2步:读取原表并计算目标行号
使用xlrd打开工作簿,提取第一个工作表的物理行数。该行索引即为新数据应写入的起始坐标:
import os
from xlutils.copy import copy
import xlrd
def write_append(file_name):
# 待追加的一行数据,可根据实际列数调整
values = ["Ann", "woman", 22, "UK"]
# 1. 加载原表并获取sheet元信息
r_xls = xlrd.open_workbook(file_name)
r_sheet = r_xls.sheet_by_index(0)
target_row = r_sheet.nrows # 当前最后一行的下一行
第3步:复制工作表并逐列写入新数据
借助xlutils.copy生成可编辑的工作簿对象,通过get_sheet()获取句柄后,按行列坐标写入内容:
# 2. 深度复制工作簿以便后续修改
w_xls = copy(r_xls)
sheet_write = w_xls.get_sheet(0)
# 3. 遍历数据列表,写入指定行
for col_idx, val in enumerate(values):
sheet_write.write(target_row, col_idx, val)
此步骤仅改变内存对象,尚未落盘,所有参数均可在保存前校验。
第4步:安全保存并验证输出结果
为避免意外覆盖源文件,推荐添加独立后缀命名输出路径,执行保存命令后即可确认追加效果:
# 4. 构造新文件名并保存
out_name = f"{os.path.splitext(file_name)[0]}.out{os.path.splitext(file_name)[1]}"
w_xls.save(out_name)
return out_name
if __name__ == "__main__":
dest = write_append("./test_append.xls")
print(f"追加成功,已生成:{dest}")
常见运行异常与排错
- 文件被占用报错:Windows下Excel打开状态会锁定文件句柄。请先关闭对应表格窗口,或在非活跃进程中运行脚本。
- 样式或公式丢失:该流程侧重于数值与文本追加,不会迁移图表、超链接及复杂嵌套公式。如需保留完整排版,建议开启
xlrd.open_workbook(..., formatting_info=True)。 - 列宽不对齐:写入新单元格后,可通过Excel手动拖拽标尺调整列宽,或改用具备样式继承能力的现代库。
结果对照
执行上述逻辑后,原表末尾将增加一行记录。以默认测试数据为例:
- 追写前数据:共3行主体记录
- 追写后数据:末尾新增
Ann | woman | 22 | UK,总计4行有效数据
简要总结
利用xlutils配合xlrd能够以极小的代码量完成旧版Excel的增量更新。掌握行数计算、副本复制与定向写入三板斧,即可灵活对接各类日志汇总、报表累加场景。以上就是使用xlutils实现Excel文件追加写入的详细内容,更多关于Python数据处理与自动化办公的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













