【问题标题】:use uno (openoffice api) to open spreadsheet *without* recalculation使用 uno (openoffice api) 打开电子表格*无需*重新计算
【发布时间】:2012-01-23 22:04:31
【问题描述】:

我正在使用 pyuno 读取 excel 电子表格(在 linux 上运行)。许多单元格具有引用显然不可用的插件的公式。但是单元格值是我想要的。

但是当我加载并阅读工作表时,似乎正在评估这些公式,因此这些值被错误覆盖。

我尝试了几件事,但都没有奏效:

  • 在对 desktop.loadComponentFromURL 的调用中设置标志 AutomaticCalculation=False、MacroExecutionMode=NEVER_EXECUTE
  • 在加载的文档上调用 document.enableAutomaticCalculation(False)

有什么建议吗?

【问题讨论】:

  • 你确定这些值是真实存储的吗?如果不是,就没有办法做到这一点。

标签: openoffice-calc uno pyuno


【解决方案1】:

如果 formluas 不是问题,您可以通过处理仅包含值(而非公式)的电子表格副本来规避该问题。

为了快速实现这一点,选择整个工作表内容,复制,特殊粘贴;然后删除除“值”之外的所有内容。保存到新文件(确保不要覆盖原始文件,否则每个公式都会丢失!)。然后您的脚本应该能够处理此文件。

这是一个丑陋的解决方案,因为必须有一种以编程方式进行的方法。

【讨论】:

  • 更简单的是打开excel,将计算模式设置为手动,加载电子表格,然后重新保存。现在它将其计算模式设置为手动,OO 将在加载时尊重它。但这违背了使用独立于 excel 的 OO 的目的。如果我使用excel到这种程度,我还不如一路走下去,根本不使用OO。
【解决方案2】:

Calc 尚不支持在加载文档后使用缓存结果。 Libreoffice Calc 现在确实使用 xls 文档的缓存结果。结果也存储在 ods 中,但在加载文档时会被忽略,并通过编译和解释保存的公式来评估公式结果。

也有一些计划为 ods 和 xlsx 添加此功能,但有许多 ods 生产商在文件中写入不正确的结果。所以到目前为止,唯一的解决方案是让文档的第二个版本只保存结果(或在 calc 中实现)。

【讨论】:

  • 感谢您提供此信息。需要明确一点:Libreoffice Calc 使用 xls 的存储值,而不是 xlsx?那么这也不是一个可行的解决方案。重新计算文件中的错误结果:为什么不让用户选择是重新计算还是使用现有结果?具有讽刺意味的是,MS 通常是决定它比用户更了解的那个,但在这种情况下,它是给用户选择的那个。
  • 只是因为在知道之前没有人实施过这个。对于 XLSX,它可能会变得棘手,但对于 ODS,它已在计划中,希望很快就会实施。
  • 还是不明白——为什么不给用户选择呢?显然,开发人员认为他们比用户更了解 xlsx 是否“好”——并且强制执行他们的判断将禁止用户做出选择。实现必须是微不足道的——只需进行重新计算。