如何从OpenOffice Calc .ods文件中读取单元格的值?

4

我能使用xlrd通过列和行号读取Excel单元格的值。现在我需要访问一些以.ods格式保存的电子表格中相同的单元格值。

例如,我该如何用Python读取存储在.ods文件中E10单元格中的值?


一些提示和一小段代码可以在http://solyaris.wordpress.com/2007/07/06/reading-open-document-with-python/找到。看起来这不应该太难(一旦你通过 XML 那一关)。 - msw
1
@msw:看起来应该不难...但是那个博主已经三年没消息了(笑);-) - John Machin
你能依赖于已安装的OpenOffice吗?OOo API具有Python绑定。虽然API有点令人困惑,但使用它肯定比黑客攻击XML更可靠。 - intuited
2个回答

5
穿过 XML 的难度不应该太大... 但是有些复杂。举个例子:OOo 在他们的智慧中决定不明确写出单元格地址。没有像 address="E10"column="E" 这样的单元格属性; 需要计算行和列。
五个连续的空单元格由以下标记表示:
<table:table-cell table:number-columns-repeated="5" /> number-colums-repeated 属性默认为 "1",也适用于非空单元格。
当您有合并单元格时情况会变得更糟;你会得到一个类似于 table-cell 标记90%相同的 covered-table-cell 标记,并且需要将 number-columns-spannednumber-rows-spanned 属性计入列和行计数。 table:table-row 标记可能具有 number-rows-repeated 属性。这可用于重复整个非空行的内容,但最常见的是在有超过1个连续空行时使用。
所以,即使您满意于“适用于我的数据”的方法,这也不是微不足道的。
您可能想看看 ODFpy。请注意第二句话:“与其他更方便的 API 不同,这个 API 本质上只是在 XML 格式之上的抽象层。” 有一个 ODF-to-HTML 脚本(如果它为 ODS 和 ODT 编写)可能可用于得到您想要的。
如果您喜欢“几乎适用于每个人的数据并且具有您熟悉的界面”的方法,则可能需要等待功能放入 xlrd 中... 但这不会很快发生。

鉴于两个据说工作正常的库(pyexcel-ods、odfpy)在我测试的第一个文件上崩溃,第三个库(ezodf)可能会悄悄地返回虚假数据,我宁愿避免编写自己的处理程序。它迟早会遇到一些奥妙莫测的.ods文件格式的部分 - 就像这些现有的解决方案一样。 - reducing activity

2
我尝试过的库中,ezodf 是唯一可用的。
from ezodf import opendoc, Sheet
doc = opendoc('test.ods')
for sheet in doc.sheets:
   print sheet.name
   cell = sheet['E10']
   print cell.value
   print cell.value_type
pyexcel-ods 崩溃, odfpy 崩溃,此外其文档要么缺失要么糟糕。
考虑到那些据说能工作的库在我测试的第一个文件上就挂了,我宁愿避免编写自己的处理程序,因为迟早会在某些更奇怪的情况下崩溃或者更糟糕的是默默地失败。
编辑:更糟糕的是,ezodf 可能默默地返回虚假数据

感谢您在这里提出ezodf的严重问题。您的编辑被拒绝了,但我更新了答案并将信息添加为评论。我个人使用pyexcel-ods非常愉快。 - Gabriel
1
@Gabriel 在这个崩溃的情况下,pyexcel-ods 是无辜的。问题是由 LibreOffice 中的 bug 引起的(https://bugs.documentfoundation.org/show_bug.cgi?id=97631)。只是我运气不好,触发了一些边缘情况。 - reducing activity
1
使用ozodf之后,我意识到odfpy是最糟糕的,如果你尝试打开一个巨大的文件,它会耗费大量的CPU时间并且卡死。非常感谢。 - rho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接