在openpyxl生成的XLSX文件中正确渲染新行

时间:2016-02-17 14:52:08

标签: python excel python-3.x openpyxl

我使用# 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') 打开.xlsx文件,更新其中的一些值并将其另存为不同的.xlsx文件。我正在尝试添加一个包含新行的页脚:

\n

但是当我打开新创建的文件并查看页脚时,Some text^lMore text^pEven more 会以一种奇怪的方式被替换:

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

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

Some text_x000D_More text_x000D_Even more

生成的PDF再次呈现出不同的东西:

{{1}}

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

2 个答案:

答案 0 :(得分:1)

Excel的页眉和页脚使用奇怪的控制代码格式,其中public class getCustomerInfoModel { public string UMENT { get; set; } public Decimal UMCUS { get; set; } public string UMNAM { get; set; } public string UMSLC { get; set; } } 被XML中的 x000D 替换。页脚是正确的但LibreOffice无法正确呈现它。

答案 1 :(得分:0)

这个问题在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"