【问题标题】:Open XML Excel some formulas are not supported by shared formulaOpen XML Excel 共享公式不支持某些公式
【发布时间】:2019-02-12 16:52:01
【问题描述】:

Excel 不支持预期的共享公式(由 OpenXML SDK https://www.microsoft.com/en-us/download/details.aspx?id=30425 创建):

在打开或保存文件时引发错误,有时会出现以下错误:“一个或多个公式...超过允许的 8192 个字符的限制”

另一方面,以下共享公式可以正常工作:

  • “=VLOOKUP(A1;Sheet2!$A:$B;2;0)”(对美元使用绝对引用)。
  • “=A1”或“=$A1”(将公式扩展到一列时)

XML 结构如下所示:

B2: <c r="B2"><f t="shared" ref="B2:B3" si="0">VLOOKUP(A2,Sheet2!A:B,2,0)</f><v></v></c>
B3: <c r="B3"><f t="shared" si="0"></f><v></v></c>

用美元替换公式,它会起作用。通过结构化引用,它不会,等等。

通过 Excel UI 使用此类公式时,扩展公式将导致共享公式或不导致共享公式,具体取决于是否支持该公式(我想)。问题是应该支持所有公式,否则应该在某个地方记录。


当一个公式是共享公式(t 值是共享的)时,这个值 表示此特定单元格的公式所属的组。 一组共享公式中的第一个公式保存在 f 元素。这被认为是“主”公式单元格。随后的 共享此公式的单元格不需要将公式写入其 f 元素。相反,特定单元格的属性 si 值是 用于计算公式表达式应基于什么 单元格与主公式单元格的相对位置。

参考:https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.cellformula.aspx

其他人经历过这种情况吗?

【问题讨论】:

    标签: .net excel openxml


    【解决方案1】:

    在与 Microsoft 支持人员长时间交谈后,他们的回答是:

    首先,即使我们清楚地理解它会更容易 有共享公式,这不是 Excel 的工作方式。 Excel 本身可以 不要创建您尝试创建的共享公式。如果你 在Excel中输入相同的公式,填写并保存,你得到 存储的重复公式,而不是共享公式。

    (这是真的,但 Excel 也会在它们工作时创建共享公式,我的问题是并非所有公式都有效。)

    错误很明显 Excel 无法使用它,即 在 2007 年及更高版本的所有 Excel 版本中保持一致。在这个 在这种情况下,作为一种解决方法,您应该模仿 Excel 并复制 像 Excel 一样在工作表中计算公式,这可以正常工作。

    我想如何事先知道 Excel 是否支持该公式? 微软甚至没有提出一个官方库来解析 Excel 公式。我们可以使用看起来相当可靠的https://github.com/spreadsheetlab/XLParser,但使用共享公式的重点不是解析公式,而是让 Excel 来做。

    可以更改此行为的唯一方法是实施设计更改 进入 Excel 的行为,但这样做整个倒退 兼容性将一直被破坏到 2007 版本。 这不是我们的产品组有兴趣改变的事情。

    所以当保存带有奇怪错误信息的文件时,Excel 会一直崩溃...

    当我在内部进行验证以更好地回答您的问题时,我现在 我的升级团队明确确认讨论 关于文件格式处理或内存中处理的详细信息 上述共享公式的 Excel 不会改变结果。事关 事实上,在某些情况下无法使用共享公式 许多不同的原因,其中一些可能不明显和可见 从 Excel 外部。最好的经验法则是已经 概述:当 Excel 本身不使用共享公式时,不要使用共享公式。 这需要考虑到细微的差异 公式,是否有绝对或相对引用(如 您使用 A:B vs $A:$B) 的示例,参考是否指代 相同的工作表或另一个工作表,或在不同的工作簿等, 然后还有它用于什么样的公式(一些函数,如 OFFSET 或 INDIRECT 依赖于受约束的范围 计算过程中的变化),以及是否先例或从属 范围/公式表明不使用共享可能更安全 公式。文件格式文档没有明确说明 什么条件可以使用共享公式。它指定一个文件 读者可能会遇到这样的公式,当这种情况发生时如何 处理这个问题,但这并不意味着共享公式总是 只要连续的单元格范围包含 公式栏中的相同公式。对于文件编写器,它不是 鼓励使用,除非场景仅限于 与 Excel 编写共享公式时相同。

    不过,LibreOffice 可以完美地处理它。看起来像是“修复太复杂”或“修复错误太冒险”的借口。

    既然他们建议我创建一个用户语音条目,你可以在那里投票:

    https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/37328965-full-support-for-shared-formula-matching-the-open

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多