我正在 Pandas 中使用一组数据框。将这些数据帧打印到 .xlsx 文件时,我将每个数据帧打印到不同的选项卡。我在保存之前使用 xlsxwriter 格式化工作表。当我尝试做除将单元格对齐到“中心”之外的任何事情时,我遇到了麻烦。该脚本在设置列宽或行高方面没有问题。我无法让文本换行或垂直居中工作。
我尝试使用以下代码,但它永远不会将文本换行在 .xlsx 文件中保存的文本或垂直居中的文本。它什么也没做。
cell_format2.set_text_wrap()
cell_format2.set_align('center')
cell_format2.set_align('vcenter')
我还尝试在 add_format 函数中进行格式化,如下所示:
cell_format2 = workbook.add_format({'text_wrap': True, 'valign': True})
使用 add_format 函数总是给出以下错误:
AttributeError: 'bool' object has no attribute 'lower'
这是我的代码,我使用 xlsxwriter 将 3 个数据帧打印到 3 个单独的选项卡
# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter(r'Ashland_Detailed_MTO.xlsx', engine='xlsxwriter')
# Write each dataframe to a different worksheet.
df1.to_excel(writer, index=None, header=True, sheet_name='List A')
df3.to_excel(writer, index=None, header=True, sheet_name='List B')
df5.to_excel(writer, index=None, header=True, sheet_name='List C')
workbook = writer.book
cell_format = workbook.add_format()
cell_format.set_align('center')
cell_format2 = workbook.add_format()
cell_format2.set_text_wrap()
cell_format2.set_align('center')
worksheet = writer.sheets['List A']
worksheet.freeze_panes(1, 0)
worksheet.set_column('A:A', 35, cell_format)
worksheet.set_column('B:B', 12, cell_format)
worksheet.set_column('C:C', 6, cell_format)
worksheet.set_column('D:D', 118, cell_format)
worksheet.set_column('E:H', 7, cell_format)
worksheet.set_column('I:J', 15, cell_format)
worksheet.set_column('K:N', 10, cell_format)
worksheet = writer.sheets['List B']
worksheet.freeze_panes(1, 0)
worksheet.set_column('A:G', 15, cell_format)
worksheet = writer.sheets['List C']
worksheet.set_row(0, 45, cell_format2)
worksheet.freeze_panes(1, 0)
worksheet.set_column('A:G', 12, cell_format)
worksheet.set_column('H:H', 17, cell_format)
worksheet.set_column('I:I', 26, cell_format)
worksheet.set_column('J:J', 20, cell_format)
worksheet.set_column('K:K', 57, cell_format)
worksheet.set_column('L:L', 20, cell_format)
worksheet.set_column('M:M', 57, cell_format)
worksheet.set_column('N:N', 16, cell_format)
worksheet.set_column('O:O', 20, cell_format)
worksheet.set_column('P:AL', 13, cell_format)
worksheet.set_column('AM:AM', 40, cell_format)
writer.save()
每次打开保存的 .xlsx 文件时,格式如下所示(第一张图)。我希望它的格式如第二张图片所示。
在
xlsxwriter
的文档网站(https://xlsxwriter.readthedocs.io/working_with_pandas.html),您可以找到以下信息:
Pandas 使用默认的单元格格式写入数据帧标题。由于它是单元格格式,因此无法使用 set_row() 覆盖。如果您希望使用自己的标题格式,那么最好的方法是关闭 Pandas 的自动标题并编写自己的标题。
他们还提供了一个示例,其中在将数据帧写入没有标头的 xlsx 文件后单独写入标头:
# Turn off the default header and skip one row to allow us to insert a
# user defined header.
df.to_excel(writer, sheet_name='Sheet1', startrow=1, header=False)
# Get the xlsxwriter workbook and worksheet objects.
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# Add a header format.
header_format = workbook.add_format({
'bold': True,
'text_wrap': True,
'valign': 'top',
'fg_color': '#D7E4BC',
'border': 1})
# Write the column headers with the defined format.
for col_num, value in enumerate(df.columns.values):
worksheet.write(0, col_num + 1, value, header_format)
在您的情况下,代码将更改为:
# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter(r'Ashland_Detailed_MTO.xlsx', engine='xlsxwriter')
# Write each dataframe to a different worksheet.
df1.to_excel(writer, index=None, startrow=1, header=False, sheet_name='List A')
df3.to_excel(writer, index=None, startrow=1, header=False, sheet_name='List B')
df5.to_excel(writer, index=None, startrow=1, header=False, sheet_name='List C')
# Get the xlsxwriter workbook and worksheet objects.
workbook = writer.book
# Add a header format.
header_format = workbook.add_format({
'bold': True,
'text_wrap': True,
'valign': 'top',
'border': 1})
# Write the column headers with the defined format.
worksheet = writer.sheets['List A']
for col_num, value in enumerate(df1.columns.values):
worksheet.write(0, col_num + 1, value, header_format)
worksheet = writer.sheets['List B']
for col_num, value in enumerate(df3.columns.values):
worksheet.write(0, col_num + 1, value, header_format)
...
当您获得太多数据帧时,您可以考虑将格式打包在循环中并迭代所有工作表。
我用过
add.format({'align':'vcenter', 'center_across':True})
,看看是否正确