求助:如何用xlrd或openpyxl向xlsxwriter复制外部Excel工作表
如何用OpenPyXL复制工作表到XlsxWriter生成的报表中
首先直接给结论:你应该用OpenPyXL,而非xlrd——xlrd是侧重只读的库,对工作表复制、写入的支持非常有限,OpenPyXL兼具读写能力,更适配你的场景。
你的代码为什么失效?
你之前的写法存在两个核心问题:
- 直接执行
worksheet_cover = cover_template只是做了对象引用,并没有把模板工作表的内容实际复制到XlsxWriter创建的工作表中; - XlsxWriter和OpenPyXL是完全独立的库,它们的工作表对象不兼容,无法直接赋值转换。而且XlsxWriter是只写型库,本身不支持读取或导入其他库的工作表对象。
正确的实现方案
要达成需求,你需要用OpenPyXL读取模板工作表的内容与格式,再用XlsxWriter逐单元格将这些内容写入新报表的目标工作表。下面是具体的代码示例:
import xlsxwriter from openpyxl import load_workbook # 1. 用XlsxWriter初始化你的报表工作簿 report_workbook = xlsxwriter.Workbook('final_report.xlsx') # 添加用于复制模板内容的Cover工作表 cover_sheet = report_workbook.add_worksheet("Cover") # 2. 用OpenPyXL加载模板文件并获取目标工作表 template_workbook = load_workbook('Test_template.xlsx') template_cover = template_workbook['Cover'] # 推荐用此写法,替代已弃用的get_sheet_by_name # 3. 遍历模板工作表的所有单元格,复制内容到XlsxWriter工作表 for row_idx, row in enumerate(template_cover.iter_rows(values_only=True)): for col_idx, cell_value in enumerate(row): # 逐单元格写入值 cover_sheet.write(row_idx, col_idx, cell_value) # 4. (可选)复制单元格格式(需手动映射,因两个库格式API不同) # 示例:给第一行标题设置加粗、大号字体格式 header_format = report_workbook.add_format({'bold': True, 'font_size': 14}) for col_idx, cell in enumerate(template_cover[1]): cover_sheet.write(0, col_idx, cell.value, header_format) # 务必关闭工作簿以保存内容 report_workbook.close()
关键注意事项
- 格式复制的局限性:XlsxWriter和OpenPyXL的格式系统差异较大,若需复制复杂格式(如单元格背景色、边框、对齐方式),需要手动转换对应参数。比如OpenPyXL的
cell.fill.bgColor要转换成XlsxWriter的{'bg_color': 'XXXXXX'}格式。 - 复杂元素处理:如果模板包含图表、图片或合并单元格,这些元素无法直接复制,你需要在XlsxWriter中重新创建,或者先通过OpenPyXL将模板工作表合并到新文件,再用XlsxWriter追加其他报表内容。
- 性能优化:若工作表数据量较大,使用
iter_rows(values_only=True)可以提升读取效率,避免加载不必要的单元格对象。
内容的提问来源于stack exchange,提问作者Tomgate
相关产品推荐
相关产品推荐

