excel共享公式扩展

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

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

喜欢这个:

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

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

我想知道的是,如果有一个库或示例代码可以使用任何较低的单元格(例如D4,D5,D6)并返回“非共享”公式?

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

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

首先我会find<v:f>.Value <> ""<v:f>.@t = "shared" 。 然后,我会做一个.TakeWhile ,其中<v:f>.Value = ""<v:f>.@t = "shared"

一旦我有IEnumerable(的XElement),然后我会使用第一个公式的parsing器1 ,然后做一个For Each为每个XElement创build一个新的公式,递增单元格的相对值(s)。

1 Eric White最近编写的使用C#和LINQ编写recursion下降parsing器的系列可能是我见过的最好的。