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

4 投票
2 回答
6831 浏览
提问于 2025-04-15 22:10

我之前用xlrd这个工具,通过输入列号和行号,成功读取了Excel表格中的单元格值。现在我需要在一些保存为.ods格式的电子表格中访问相同的单元格值。

比如说,我想用Python读取.ods文件中E10单元格里的值,该怎么做呢?

2 个回答

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可能会 默默返回错误的数据

5

处理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-spannednumber-rows-spanned 这些属性来计算列和行。

一个 table:table-row 标签可能会有 number-rows-repeated 属性。这个属性可以用来重复整个非空行的内容,但通常是在有多个连续空行的时候才会出现。

所以,即使你只想要一个“在我的数据上能用”的方法,这也不是一件简单的事。

你可以看看 ODFpy。注意第二句话:“与其他更方便的API不同,这个实际上是一个在XML格式之上的抽象层。”还有一个ODF转HTML的脚本(如果它同时为ODS和ODT编写的话),可能可以修改来满足你的需求。

如果你更喜欢一个“在几乎所有人的数据上都能用,并且有支持和你熟悉的接口”的方法,那你可能需要等到这个功能被加入到 xlrd 中……但这不会很快实现。

撰写回答