如何从OpenOffice Calc .ods文件中读取单元格值?
我之前用xlrd这个工具,通过输入列号和行号,成功读取了Excel表格中的单元格值。现在我需要在一些保存为.ods格式的电子表格中访问相同的单元格值。
比如说,我想用Python读取.ods文件中E10单元格里的值,该怎么做呢?
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可能会 默默返回错误的数据。
处理XML文件其实不应该太难……但有些地方会让人头疼。举个例子:OpenOffice(OOo)决定不直接写出单元格的地址。也就是说,你不会看到像 address="E10"
或 column="E"
这样的属性;你需要自己去数行和列。
连续五个空单元格会用下面的方式表示:
<table:table-cell table:number-columns-repeated="5" />
这里的 number-columns-repeated
属性默认是“1”,而且也适用于非空单元格。
如果有合并单元格的情况,那就更麻烦了;你会看到一个 covered-table-cell
标签,它和 table-cell
标签有90%是一样的,但你还需要考虑 number-columns-spanned
和 number-rows-spanned
这些属性来计算列和行。
一个 table:table-row
标签可能会有 number-rows-repeated
属性。这个属性可以用来重复整个非空行的内容,但通常是在有多个连续空行的时候才会出现。
所以,即使你只想要一个“在我的数据上能用”的方法,这也不是一件简单的事。
你可以看看 ODFpy。注意第二句话:“与其他更方便的API不同,这个实际上是一个在XML格式之上的抽象层。”还有一个ODF转HTML的脚本(如果它同时为ODS和ODT编写的话),可能可以修改来满足你的需求。
如果你更喜欢一个“在几乎所有人的数据上都能用,并且有支持和你熟悉的接口”的方法,那你可能需要等到这个功能被加入到 xlrd
中……但这不会很快实现。