【问题标题】:How do you read a cell's value from an OpenOffice Calc .ods file?如何从 OpenOffice Calc .ods 文件中读取单元格的值?
【发布时间】:2010-04-29 21:03:46
【问题描述】:

我已经能够使用 xlrd 使用列号和行号作为输入来读取 Excel 单元格值。现在我需要访问一些以 .ods 格式保存的电子表格中的相同单元格值。

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

【问题讨论】:

  • 一些提示和一些代码在solyaris.wordpress.com/2007/07/06/… 看起来不应该太难(一旦你破解了XML。
  • @msw:看起来应该不会太难……但是从那以后(大约 3 年前)就没有收到过那个博主的消息了 ;-)
  • 你能依赖正在安装的openoffice吗? OOo API 具有 python 绑定。虽然 API 有点眼花缭乱,但使用它肯定比 hack xml 更可靠。

标签: python ods


【解决方案1】:

破解 XML 不应该太难了……但也有一些复杂性。举个例子:OOo 在他们的智慧中决定不明确地写出单元地址。没有像address="E10"column="E" 这样的单元格属性;您需要计算行数和列数。

五个连续的空单元格由
<table:table-cell table:number-columns-repeated="5" />

表示

number-colums-repeated 属性默认为“1”,也适用于非空单元格。

合并单元格时会变得更糟;你会得到一个covered-table-cell 标记,它与table-cell 标记有90% 相同,并且属性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 文件格式的一些神秘而神秘的部分——就像这些现有的解决方案一样。
【解决方案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 crashed, odfpy crashed 以及它的文档要么丢失要么很糟糕。

鉴于所谓的工作库在我测试的第一个文件上死掉了,我宁愿避免编写自己的处理程序,因为它迟早会崩溃,或者更糟的是在一些更奇怪的情况下静默失败。

编辑:情况变得更糟。 ezdf 可以silently return bogus data.

【讨论】:

  • 感谢您将ezodf 的严重问题提请我注意here。您的编辑被拒绝,但我更新了答案并将信息添加为评论。我个人在使用pyexcel-ods 方面有很好的体验。
  • @Gabriel 如果发生这种崩溃,pyexcel-ods 是无辜的。问题是由 LibreOffice (bugs.documentfoundation.org/show_bug.cgi?id=97631) 中的错误引起的。只是我运气不好触发了一些极端情况。
  • 非常感谢在使用 ozodf 之后,我意识到 odfpy 最糟糕的是,如果您尝试打开大文件,它只会挂起时间来消耗大量 CPU。
猜你喜欢
  • 2012-02-17
  • 2012-10-29
  • 2012-04-16
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多