2010-09-27 5 views
0

J'utilise les bibliothèques OpenXML de C# pour lire des fichiers Excel.excel expansion de formule partagée

Une de mes exigences est de pouvoir montrer la formule exacte pour chaque cellule qui en a une. Le fichier codé OpenXML utilise des "formules partagées" pour réduire la taille du fichier.

Comme ceci:

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> 

Sa formule racine assez simple dans l'exemple ci-dessus (D2 + C3) et, évidemment, ceux-ci peuvent être arbitrairement complexes. Ce que je veux savoir est s'il y a une bibliothèque ou un exemple de code disponible qui prend n'importe quelle cellule inférieure (par exemple D4, D5, D6) et renvoie la formule "non partagée"?

par exemple. pour D6 cela retournerait "D5 + C6"

+0

Etes-vous autorisé à supposer qu'Excel est installé? J'imagine que cela pourrait être plus facile si vous pouvez utiliser COM interop pour simplement charger la feuille de calcul, puis accéder à cette cellule. –

+0

hélas non, Excel lui-même n'est pas disponible. –

Répondre

3

Pas facilement, mais cela peut être fait. Ce que je ferais, c'est utiliser Linq.

D'abord, je trouverais des cellules où <v:f>.Value <> "" et <v:f>[email protected] = "shared". Alors je ferais un .TakeWhile du .ElementsAfterSelf<v:f>.Value = "" et <v:f>[email protected] = "shared".

Une fois que j'ai que IEnumerable (Of XElement), je puis utiliser un analyseur pour la formule sur la première puis effectuez un For Each pour créer une nouvelle formule pour chaque XElement, incrémenter la valeur relative de la cellule (s).

La récente série par Eric White sur Writing a Recursive Descent Parser using C# and LINQ est probablement le meilleur que je l'ai vu.

+0

J'avais peur que ce soit le cas! Merci pour l'idée. –

+1

@FreddySmith Quelques années plus tard, vous avez toujours le même problème d'expansion des formules de cellules partagées avec Open XML. Pouvez-vous partager votre solution? Cordialement. –