Расширение Excel с общей формулой - PullRequest
1 голос
/ 28 сентября 2010

Я использую библиотеки OpenXML из C # для чтения файлов 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"

1 Ответ

4 голосов
/ 28 сентября 2010

Не легко, но это можно сделать.Я бы использовал Linq.

Сначала я бы нашел все ячейки, где <v:f>.Value <> "" и <v:f>.@t = "shared".Затем я сделал бы .TakeWhile из .ElementsAfterSelf, где <v:f>.Value = "" и <v:f>.@t = "shared".

Как только я получу IEnumerable (Of XElement), я бы затем использовал парсер для формулы в первомодин 1 , а затем выполните For Each, чтобы создать новую формулу для каждого элемента XElement, увеличивая относительное значение (я) ячейки.

1 Недавняя серия Эрика Уайта о Написание синтаксического анализатора рекурсивного спуска с использованием C # и LINQ , вероятно, лучшее, что я видел.

...