xlsxwriter: text_wrap() 不工作
xlsxwriter: text_wrap() not working
我正在创建和格式化 excel 文件,并希望将文本换行到列中。我在 xlsxwriter 中找到了 text_wrap() 的方法,但是当我使用这种方法时,它对我不起作用。我尝试了一切但都失败了。
我在我的脚本中做了什么。
- 使用 pandas
读取 csv
- 正在创建数据框并将其保存到 excel 文件中
- 在上面应用文字环绕。
脚本
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
我正在创建和格式化 excel 文件,并希望将文本换行到列中。我在 xlsxwriter 中找到了 text_wrap() 的方法,但是当我使用这种方法时,它对我不起作用。我尝试了一切但都失败了。
我在我的脚本中做了什么。
- 使用 pandas 读取 csv
- 正在创建数据框并将其保存到 excel 文件中
- 在上面应用文字环绕。
脚本
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