如何用Python将带格式的Excel工作表复制到已创建的文件且不覆盖原有内容
解决思路与代码实现
首先得明确你当前代码的核心问题:你最后一步是加载了readme tab.xlsx文件,修改后直接保存到Archivo.xlsx的路径上——这相当于把readme tab.xlsx的内容完全覆盖掉了之前用pandas生成的Archivo.xlsx,自然会丢失原有的工作表。
正确的逻辑应该是先加载已经生成好的主文件(Archivo.xlsx),再把另一个文件里的目标工作表完整复制进去,而不是反过来操作。下面是具体的实现方案,用openpyxl来完成带完整格式的工作表复制:
完整代码示例
import pandas as pd from openpyxl import load_workbook from openpyxl.utils import get_column_letter # 第一步:执行你原有的Excel生成逻辑(替换成你的实际数据和配置) path = r"Archivo.xlsx" # 示例数据,替换成你自己的df1 df1 = pd.DataFrame({"col1": [1,2,3], "col2": [4,5,6], "col3": [7,8,9]}) writer = pd.ExcelWriter(path, engine='xlsxwriter') df1.to_excel(writer, sheet_name='Data', index=False) workbook = writer.book ws_graph = workbook.add_worksheet('Graph') writer.sheets['Data'].set_column(1, 29, 30) # 用close代替save,确保文件完全写入并释放资源 writer.close() # 第二步:加载主文件和要复制的源文件 main_workbook = load_workbook(path) # data_only=False保留公式,True则只取公式计算后的结果 source_workbook = load_workbook("readme tab.xlsx", data_only=False) # 替换成你要复制的具体工作表名称,比如source_workbook.active取第一个工作表 source_worksheet = source_workbook['目标工作表名称'] # 第三步:在主文件中新建工作表,用于存放复制的内容 new_worksheet = main_workbook.create_sheet(title='复制的说明页') # 自定义新表名称 # 第四步:完整复制单元格内容与格式 # 1. 复制单元格值和样式(背景色、字体、字号、边框等) for row in source_worksheet.iter_rows(): for cell in row: new_worksheet[cell.coordinate].value = cell.value # 直接复制完整样式,这是保留所有格式的关键 new_worksheet[cell.coordinate]._style = cell._style # 2. 复制行高 for row_num in range(1, source_worksheet.max_row + 1): new_worksheet.row_dimensions[row_num].height = source_worksheet.row_dimensions[row_num].height # 3. 复制列宽 for col_num in range(1, source_worksheet.max_column + 1): col_letter = get_column_letter(col_num) new_worksheet.column_dimensions[col_letter].width = source_worksheet.column_dimensions[col_letter].width # 4. 复制合并单元格 for merged_range in source_worksheet.merged_cells.ranges: new_worksheet.merge_cells(str(merged_range)) # 第五步:保存修改后的主文件 main_workbook.save(path)
关键细节说明
data_only参数:加载源文件时设置data_only=False会保留单元格中的公式;如果只需要公式计算后的静态值,设置为True即可。- 样式完整复制:通过
_style属性直接复制单元格的完整样式,这是openpyxl中最直接的方式,能保留背景色、字体、字号、对齐方式、边框等所有格式。 - 行高列宽与合并单元格:这些属于工作表的维度设置,需要单独复制,否则只会复制单元格内容和基础样式,行高列宽、合并单元格会丢失。
- 文件关闭:用
writer.close()代替writer.save(),确保pandas生成的文件完全写入磁盘,避免后续openpyxl加载时出现文件占用或内容不完整的问题。
这样操作后,你的Archivo.xlsx会保留原来的Data和Graph工作表,同时新增一个和源文件工作表格式完全一致的新工作表,不会覆盖原有内容。
内容的提问来源于stack exchange,提问作者AvocadoToast
相关产品推荐
相关产品推荐

