无法实现文本换行或垂直居中以与 xlsxwriter 一起使用

问题描述 投票:0回答:2

我正在 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 文件时,格式如下所示(第一张图)。我希望它的格式如第二张图片所示。

image

python excel pandas dataframe xlsxwriter
2个回答
5
投票

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)

...

当您获得太多数据帧时,您可以考虑将格式打包在循环中并迭代所有工作表。


0
投票

我用过

add.format({'align':'vcenter', 'center_across':True})
,看看是否正确

© www.soinside.com 2019 - 2024. All rights reserved.