xlsxwriter: text_wrap() 不工作

xlsxwriter: text_wrap() not working

我正在创建和格式化 excel 文件,并希望将文本换行到列中。我在 xlsxwriter 中找到了 text_wrap() 的方法,但是当我使用这种方法时,它对我不起作用。我尝试了一切但都失败了。

我在我的脚本中做了什么。

脚本

text_format = workbook.add_format({'text_wrap': True})
worksheet.conditional_format('A1:W{}'.format(len(df)), {'type': 'no_errors',
                                      'format': text_format})

任何帮助将不胜感激。

谢谢

我已经花了几个小时解决同样的问题。我尝试了以下方法:

header_format = workbook.add_format({'bold': True, 'text_wrap': True, 'valign': 'top'})

并通过自己的语句设置:

header_format.set_text_wrap()

并在语句中添加一个布尔值:

header_format.set_text_wrap(True)

我想可能是因为我使用了条件格式:

worksheet.conditional_format(0, 0, 0, 21, {'type': 'no_blanks', 'format': header_format})

所以我试了一下没有:

worksheet.set_row(0, 45, testing_format)

我认为可能是因为它在它下面的设置列宽的语句之前出现,所以它可能需要在最后(即使没有其他格式设置表现出这种行为)。那没有用。

我尝试使用一种格式,只设置了 text_wrap,没有其他格式,也没有在其他地方使用。那没有用。

我试过它是整个工作表的唯一格式集。那没用

我尝试将 XlsxWririter 更新到 1.3.7。那没有用。

在这一点上,我可以 100% 肯定地说文本换行在 XlsxWriter 1.3.7 和 Python 3.7.4 以及 Microsoft 365 的 Excel 中不起作用MSO 64 位。

这不起作用的原因是 Excel 不支持条件格式的文本换行。来自 XlsxWriter docs:

Note: In Excel, a conditional format is superimposed over the existing cell format and not all cell format properties can be modified. Properties that cannot be modified in a conditional format are font name, font size, superscript and subscript, diagonal borders, all alignment properties and all protection properties.

在条件格式之外,它应该按预期工作:

import xlsxwriter

workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet()

my_format = workbook.add_format({'text_wrap': True})

worksheet.write(0, 0, "hello world, how are you", my_format)

workbook.close()

输出

jmcnamara 的示例确实有效,但它不适用于来自 pandas 数据框的数据。你可以看到它做了 bold 和 valign,但是 wrap 不起作用。我对条件格式也没有问题(只要它不是来自数据框)。

import pandas as pd
import xlsxwriter

df = pd.DataFrame({'this is a very long header that should wrap': ['a2', 'a3', 'a4'],
                   'header2': [1, 2, 3],
                   'header3': [4, 5, 6]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

df.to_excel(writer, "Sheet1", index=False)
worksheet = writer.sheets['Sheet1']

workbook = writer.book

header_format = workbook.add_format({'bold': True, 'text_wrap': True, 'valign': 'top'})


worksheet.set_column(0, 0, 10)
worksheet.write(0, 3, "hello world, how are you")
worksheet.set_row(0, 70, header_format)

workbook.close()

XlsxWriter docs 中所述,无法使用 set_row() 覆盖 DataFrame 格式。更改 DataFrame header 格式的最简单方法是用单个单元格条目覆盖 header,覆盖每个单元格的值和格式:

import pandas as pd
import xlsxwriter

df = pd.DataFrame({'this is a very long header that should wrap': ['a2', 'a3', 'a4'],
                   'header2': [1, 2, 3],
                   'header3': [4, 5, 6]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', startrow=1, header=False)

workbook  = writer.book
worksheet = writer.sheets['Sheet1']
header_format = workbook.add_format({'bold': True, 'text_wrap': True, 'valign': 'top'})

# Overwrite both the value and the format of each header cell
for col_num, value in enumerate(df.columns.values):
    worksheet.write(0, col_num + 1, value, header_format)

workbook.close()

上面的代码将产生以下结果:

当我从 workbook.add_format().set_text_wrap() 更改为 workbook.add_format({'text_wrap': True}) 时,它按预期工作

由于dataframe格式禁止的格式无法修改类型,可以提前清理dataframe格式,然后通过设置列或设置行应用单元格格式。

pandas.io.formats.excel.ExcelFormatter.header_style = None