首页 > 解决方案 > 使用 Python 和 XLSXWriter 将格式应用于多个 Excel 工作表

问题描述

我有两个数据框如下:

import pandas as pd 
import numpy as np
from datetime import date

df = pd.DataFrame({'Data': [10, 22, 31, 43, 57, 99, 65, 74, 88],
                  'Data2':[10, 22, 31, 43, 57, 99, 65, 74, 88],
                  'Data3':[10, 22, 31, 43, 57, 99, 65, 74, 88]})

df2 = pd.DataFrame({'df2_Data': ['blue', 'yellow', 'purple', 'orange', 'green', 'brown', 'gray', 'white', 'red'],
                  'df2_Data2':['bike', 'car', 'bus', 'train', 'boat', 'truck', 'plane', 'scooter', 'skateboard'],
                  'df2_Data3':['chicken', 'cow', 'dog', 'crocodile', 'snake', 'pig', 'rat', 'mouse', 'monkey']})

我可以df使用以下代码将具有所需格式的 导出为 Excel 中的单个工作表:

today = date.today()
d2 = today.strftime("%B %d, %Y")



writer = pd.ExcelWriter('ExcelExample{}.xlsx'.format(d2), engine='xlsxwriter')

df.to_excel(writer, sheet_name='Sheet1')
workbook  = writer.book
worksheet = writer.sheets['Sheet1']

header_format = workbook.add_format({
    'bold': True,
    'text_wrap': True,
    'valign': 'top',
    'fg_color': '#38C4F1',
    'font_color': 'FFFFFF',
    'border': 1})

for col_num, value in enumerate(df.columns.values):
    worksheet.write(0, col_num + 1, value, header_format)
    
writer.save()

给出这个输出

在此处输入图像描述

或者,我可以使用以下代码将两个数据框导出为单独的工作表而不进行格式化:

writer = pd.ExcelWriter('ExcelExample{}.xlsx'.format(d2), engine='xlsxwriter')

# Write each dataframe to a different worksheet.
df.to_excel(writer, sheet_name='Sheet1')
df2.to_excel(writer, sheet_name='Sheet2')

# Close the Pandas Excel writer and output the Excel file.
writer.save()

如何手动或递归地将格式应用于所有工作表?

标签: pythonexcelpandasxlsxwriter

解决方案


XlsxWriter 库中没有简单的方法可以做到这一点,这自 2014 年以来一直是一个问题。(https://github.com/jmcnamara/XlsxWriter/issues/111)您可以去使用 worksheet.write( ) 方法(就像您已经做过的那样)或使用辅助函数。我刚刚找到了这个库:

https://github.com/webermarcolivier/xlsxpandasformatter

xlsxpandasformatter 库为 XlsxWriter 和 pd.to_excel() 提供了几个帮助函数。
你可能会去做这样的事情:

from xlsxpandasformatter import FormatedWorksheet
pd.formats.format.header_style = None

with pd.ExcelWriter("output_file.xlsx", engine="xlsxwriter", datetime_format="%B %d, %Y") as writer:
    workbook = writer.book

    header_format = workbook.add_format({
        'bold': True,
        'text_wrap': True,
        'text_v_align': 'top',
        'fg_color': '#38C4F1',
        'font_color': 'FFFFFF',
        'border': 1})
    
    all_df = [df1, df2]
    sheet_num = 1

    for df in all_df:
        sheetname = 'Sheet' + str(sheet_num)
        sheet_num += 1
        df.to_excel(writer, sheet_name = sheetname , index=False)

        worksheet = writer.sheets[sheetname]

        formattedWorksheet = FormatedWorksheet(worksheet, workbook, df)

        formattedWorksheet.format_header(headerFormat=header_format)
        formattedWorksheet.MoreMethodsThatYouCanApply()

        formattedWorksheet.apply_format_table()

推荐阅读