在 openpyxl 生成的 XLSX 文件中正确呈现新行

Rendering out new line properly in openpyxl generated XLSX file

我正在使用 openpyxl 打开一个 .xlsx 文件,更新其中的一些值并将其另存为另一个 .xlsx 文件。我正在尝试添加一个带有新行的页脚:

# example code
wb = openpyxl.load_workbook('file.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
sheet.header_footer.left_footer.font_size = 7
sheet.header_footer.left_footer.text = '&BSome text&B\nMore text\nEven more'
sheet.header_footer.right_footer.font_size = 7
sheet.header_footer.right_footer.text = 'Page &P of &N'
wb.save('new_file.xlsx')

但是当我打开新创建的文件并查看页脚时,\n 以一种奇怪的方式被替换:

Some text^lMore text^pEven more

我还注意到,如果我尝试借助 libreoffice 将其转换为 PDF,例如像这样:

os.system('libreoffice --headless --invisible --convert-to pdf --outdir /path/on/disk new_file.xlsx')

生成的 PDF 再次呈现不同的内容:

Some text_x000D_More text_x000D_Even more

如何在页脚中正确生成新行?
(可能值得一提的是,我在 Ubuntu 14.04 上使用 openpyxl 2.3.3 和 Python 3.4。LibreOffice 的版本是 5.0.5.2)

Excel 的页眉和页脚使用了一种奇怪的控制代码格式,其中 \n 在 XML 中被 x000D 替换。页脚正确,但 LibreOffice 渲染不正确。

这个问题在 2020 年仍然存在,与 libreoffice 无关。相反,它与 openpyxl 转义文本的方式有关。我想这很好用,但是在页眉和页脚上,换行符似乎没有转义(至少在我给出的示例文件中,它是在 excel 中创建的)。除非发布修复程序,否则您可以执行以下猴子修补程序:

from openpyxl.worksheet.header_footer import HeaderFooterItem                

def unescape_newline(self):
    original_value = self.__str_orig__()
    return original_value.replace("_x000a_", "\n")

# please note: the following sentinel is very important.
# without it, you'll hit recursion error as you cannot simply
# replace __str__ over and over.
if not hasattr(HeaderFooterItem, "__str_orig__"):
    HeaderFooterItem.__str_orig__ = HeaderFooterItem.__str__
    HeaderFooterItem.__str__ = unescape_newline

# now you can assign newlines like so:
sheet.oddFooter.center.text = "This\nis\nmulti\nline\footer"