xlsxwriter:text_wrap()不起作用

时间:2017-03-02 18:19:16

标签: python excel xlsxwriter

我正在创建和格式化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})

任何帮助将不胜感激。

由于

5 个答案:

答案 0 :(得分:1)

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

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 而没有其他格式,并且没有在其他地方使用。那没用。

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

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

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

答案 1 :(得分:1)

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

<块引用>

注意:在 Excel 中,条件格式叠加在现有单元格格式上,并非所有单元格格式属性都可以修改。 不能以条件格式修改的属性包括字体名称、字体大小、上标和下标、对角线边框、所有对齐属性和所有保护属性。

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

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()

输出enter image description here

答案 2 :(得分:1)

jmcnamara 的示例确实有效,但它不适用于来自熊猫数据框的数据。你可以看到它做了粗体和 valign,但包装不起作用。我也没有遇到条件格式问题(只要它不是来自数据帧)。

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()

enter image description here

答案 3 :(得分:1)

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

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()

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

enter image description here

答案 4 :(得分:1)

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