【问题标题】:excel shared formula expansionexcel共享公式扩展
【发布时间】:2010-09-27 23:27:07
【问题描述】:

我正在使用 C# 中的 OpenXML 库来读取 Excel 文件。

我的要求之一是能够为每个具有公式的单元格显示确切的公式。 OpenXML 编码文件使用“共享公式”来减小文件大小。

像这样:

D3 : <x:f t="shared" ref="D3:D6" si="1" >D2+C3</x:f><x:v >130</x:v>
D4 : <x:f t="shared" si="1"  /><x:v >136</x:v>
D5 : <x:f t="shared" si="1"  /><x:v >141</x:v>
D6 : <x:f t="shared" si="1"  /><x:v >147</x:v>

在上面的例子中它是一个相当简单的根公式(D2+C3),显然这些可以任意复杂。

我想知道是否有可用的库或示例代码采用任何较低的单元格(例如 D4、D5、D6)并返回“未共享”公式?

例如对于 D6,这将返回 "D5+C6"

【问题讨论】:

  • 您是否可以假设已安装 Excel?我想如果您可以使用 COM 互操作来简单地加载电子表格然后访问该单元格,这可能会更容易。
  • 唉,Excel 本身不可用。

标签: c# excel openxml worksheet-function


【解决方案1】:

不容易,但可以做到。我会做的是使用 Linq。

首先我会找到&lt;v:f&gt;.Value &lt;&gt; ""&lt;v:f&gt;.@t = "shared" 所在的任何单元格。然后我会做一个.TakeWhile.ElementsAfterSelf 其中&lt;v:f&gt;.Value = ""&lt;v:f&gt;.@t = "shared"

一旦我有了那个 IEnumerable(Of XElement),我就会对第一个公式使用解析器1,然后执行For Each 为每个 XElement 创建一个新公式,递增单元格的相对值。

1Eric White 最近在Writing a Recursive Descent Parser using C# and LINQ 上的系列可能是我见过的最好的。

【讨论】:

  • 我担心是这样的!谢谢你的想法。
  • @FreddySmith 几年后,使用 Open XML 扩展共享单元格公式仍然存在同样的问题。你能分享你的解决方案吗?问候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
相关资源
最近更新 更多