如何在已有工作簿中使用ExcelWriter新增工作表并设置条件格式
解决方案
方案1:全流程使用openpyxl(无内容丢失风险,推荐)
openpyxl原生支持现有工作簿追加工作表、单元格区域格式设置,无需切换引擎即可满足需求,不会覆盖原有工作簿的内容、格式、公式等元素。
示例代码如下:
from openpyxl import load_workbook from openpyxl.styles import Font, Alignment, PatternFill, Border, Side # 加载现有工作簿,关闭只读模式 wb = load_workbook("your_existing_file.xlsx") # 新增工作表,index参数指定插入位置 new_ws = wb.create_sheet(title="weekly_report_20240520", index=0) # 写入新工作表数据(按需调整) new_ws.append(["日期", "销售额", "订单量", "转化率"]) new_ws.append(["2024-05-20", 12000, 120, "12.3%"]) # 定义单元格格式(按需调整样式参数) header_style = { "font": Font(name="微软雅黑", bold=True, size=12, color="FFFFFF"), "fill": PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid"), "alignment": Alignment(horizontal="center", vertical="center"), "border": Border( left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin") ) } # 给指定区域(示例为A1:D1表头区域)批量应用格式 for cell in new_ws["A1:D1"][0]: cell.font = header_style["font"] cell.fill = header_style["fill"] cell.alignment = header_style["alignment"] cell.border = header_style["border"] # 按需设置列宽 new_ws.column_dimensions["A"].width = 18 new_ws.column_dimensions["B:D"].width = 15 # 保存文件,原有内容不会被覆盖 wb.save("your_existing_file.xlsx")
方案2:必须使用XlsxWriter格式能力的兼容方案
原生XlsxWriter本身不支持追加写入现有工作簿,直接创建文件必然覆盖原有内容,可通过「先读取全量原有内容→统一写入所有内容+新工作表」的方式实现,仅适合原有工作表仅包含纯数据的场景(会丢失原有格式、图表、宏等元素)。
示例代码如下:
import pandas as pd from openpyxl import load_workbook # 读取原有工作簿所有工作表数据 old_wb = load_workbook("your_existing_file.xlsx", data_only=False) existing_sheets = {} for sheet_name in old_wb.sheetnames: ws = old_wb[sheet_name] existing_sheets[sheet_name] = pd.DataFrame(ws.values) # 统一写入原有内容+新工作表 with pd.ExcelWriter("your_existing_file.xlsx", engine="xlsxwriter") as writer: # 写入原有所有工作表 for sheet_name, df in existing_sheets.items(): df.to_excel(writer, sheet_name=sheet_name, index=False, header=False) # 写入新增工作表 new_df = pd.DataFrame({ "日期": ["2024-05-20", "2024-05-21"], "销售额": [12000, 15000] }) new_df.to_excel(writer, sheet_name="weekly_report_20240520", index=False) # 调用XlsxWriter API设置格式 workbook = writer.book new_ws = writer.sheets["weekly_report_20240520"] header_format = workbook.add_format({ "bold": True, "fg_color": "#4472C4", "font_color": "#FFFFFF", "border": 1, "align": "center" }) # 给指定区域设置格式(示例为第一行表头) new_ws.set_row(0, None, header_format) # 设置列宽 new_ws.set_column("A:B", 18)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

