openoffice calc - 换行导致单元格中的重复值(pandas/openpyxl)

Posted

技术标签:

【中文标题】openoffice calc - 换行导致单元格中的重复值(pandas/openpyxl)【英文标题】:openoffice calc - newline causes duplicate value in cells (pandas/openpyxl) 【发布时间】:2016-08-01 21:57:08 【问题描述】:

有人知道如何解决 OpenOffice Calc 无法正确处理单元格中的新行的问题吗?

我有一个 python 脚本,它通过 pandas 使用 openpyxl 动态生成一个 excel 工作簿。

脚本运行良好,但是当我在 OpenOffice 中查看包含换行符的单元格时,所有值都会重复多次。如果我使用 Microsoft Excel 查看器打开同一个文件,所有内容都会正确显示,并且如果我使用换行以外的字符(例如逗号、# 等),则两者都显示正常。

我有一个解决方法可以进入 excel 并使用宏替换随机字符,但我希望尽可能避免这种情况,因为该过程确实需要完全自动化。也因为该文件将由另一个内部工具处理,我确实需要用新行处理这些单元格,并且我无法更改字符。

我也尝试过使用 chr(10) 和/或 chr(13),但在前一种情况下,它只是按预期在输出中被替换为 '\n'。

我目前使用的代码类似于:

test_list = []
for x in range(1,18):
    test_list.append([
        "value1",
        "\n".join(['element1', 'element2', 'element3']),
        "value3"
    ])

data_df = pd.DataFrame(test_list)

fn = r'/path/to/excel/file.xlsx'

writer = pd.ExcelWriter(fn, engine='xlsxwriter')
data_df.to_excel(writer, sheet_name='Data', index=False, header=0)
workbook = writer.book
worksheet = writer.sheets['Data']
worksheet.set_column('A:ZZ',50,
                     workbook.add_format('text_wrap': True))
writer.save()

Element 数据会在 OpenOffice Calc 单元格中显示如下:

奇怪的是最后一项似乎是正确的

以列表或通过 DataFrame.head() 查看的相同数据看起来很好:

pprint(test_list)
[['value1', 'element1\nelement2\nelement3', 'value3'],
['value1', 'element1\nelement2\nelement3', 'value3'],
['value1', 'element1\nelement2\nelement3', 'value3'],
['value1', 'element1\nelement2\nelement3', 'value3'],
['value1', 'element1\nelement2\nelement3', 'value3'],
['value1', 'element1\nelement2\nelement3', 'value3'],
...
['value1', 'element1\nelement2\nelement3', 'value3']]

data_df.head(18):
         0                             1       2
0   value1  element1\nelement2\nelement3  value3
1   value1  element1\nelement2\nelement3  value3
2   value1  element1\nelement2\nelement3  value3
...
15  value1  element1\nelement2\nelement3  value3
16  value1  element1\nelement2\nelement3  value3

只是当它被传递到 openpyxl 库并在 OpenOffice 中查看时。

谢谢

【问题讨论】:

您的操作系统和 Office 版本是什么? Windows 10,只是 Excel 查看器,但如前所述,在 Excel 中运行良好,只是在 OpenOffice (4.1.2) 中运行良好 【参考方案1】:

我在 Windows 上使用 OpenOffice 4.1.2 时代码运行良好:

对于这个屏幕截图,我双击了第二行的底部以将其展开。在此之前,它只显示带有红色三角形的element3。但这似乎与您描述的行为不同。

编辑

好的,我现在可以确认问题了。正如你所说,它发生在神秘的 18 个项目中。貌似是OpenOffice的bug,因为解压file.xlsx查看的XML文件差别不大。

我也尝试将 CR 和 LF 直接添加到 XML 文件中,但这只是导致:

这给我们留下了三个解决方案:

    改用 LibreOffice,它没有这个问题(测试 LO 5.1.0.3)。 Report the bug 等待新版本。 使用 OpenOffice 的首选 .ods 格式而不是 MS Office 的首选格式。

【讨论】:

抱歉,在删除敏感数据时,我过度简化了代码(更新了原始帖子)。对于单个项目,它似乎可以正常工作,但是当处理超过 17 个项目时,就会出现问题。原始脚本正在生成一个包含 100 个项目的列表。 已确认。安装 LibreOffice 5.2.0.4,代码已成功处理 3000 多个项目。【参考方案2】:

当我使用最近的 Pandas 和 XlsxWriter 运行您的示例时,我在 Excel 中得到了预期的输出:

但是,在这种情况下,Excel 会自动调整第 2 行的高度以进行补偿。这在 OpenOffice 中可能不会发生。

在这种情况下,您可以像这样显式设置它:

worksheet.set_row(1, 45)

【讨论】:

问题不在 Excel 中,仅在 OpenOffice Calc 中查看

以上是关于openoffice calc - 换行导致单元格中的重复值(pandas/openpyxl)的主要内容,如果未能解决你的问题,请参考以下文章

LibreOffice Calc 单元格文本

LibreOffice (Calc) VBA 单元格总和(按索引)

Libreoffice Calc 标记(?)一个单元格

Calc:单元格设置下来菜单

表格单元格:空白 nowrap 直到满足最大宽度,然后换行

OpenOffice Calc 合并单元格属性