Utiliser OpenXmlReader
J'ai hate de recourir à StackOverflow pour quelque chose d'aussi (apparemment) de base, mais je me bats avec Microsoft depuis quelques heures et semblent se heurter à une impasse. Je suis en train de lire (grand) Excel 2007+ feuilles de calcul, et Google a eu la gentillesse de m'informer qu'en utilisant le SDK OpenXml est un joli choix populaire. J'ai donc fait la chose d'un coup, lire quelques tutoriels, vérifié à Microsoft de la bibliothèque de pages, et a eu très peu d'entre eux tous.
Je suis à l'aide d'un petit test de la feuille de calcul avec une seule colonne de nombres et de l'une des chaînes à grande échelle des tests viendra plus tard. J'ai essayé plusieurs implémentations similaire à celui que je suis sur le point de publier, et aucun d'eux de lire les données. Le code ci-dessous a été pour la plupart prises à partir d'un autre StackOverflow fil, où il semble avoir travaillé - pas pour moi. J'ai pensé que je vais avoir les gars, vous cochez/debug/aider avec cette version, parce que ça risque d'être moins brisées que tout ce que j'ai écrit aujourd'hui.
static void ReadExcelFileSAX(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, true))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
OpenXmlPartReader reader = new OpenXmlPartReader(worksheetPart);
string text;
string rowNum;
while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
do
{
if (reader.HasAttributes)
{
rowNum = reader.Attributes.First(a => a.LocalName == "r").Value;
Console.Write("rowNum: " + rowNum); //we never even get here, I tested it with a breakpoint
}
} while (reader.ReadNextSibling()); //Skip to the next row
Console.ReadKey();
break; //We just looped through all the rows so no need to continue reading the worksheet
}
if (reader.ElementType == typeof(Cell))
{
}
if (reader.ElementType != typeof(Worksheet)) //Dont' want to skip the contents of the worksheet
reader.Skip(); //Skip contents of any node before finding the first row.
}
reader.Close();
Console.WriteLine();
Console.ReadKey();
}
}
Et, sur une note de côté, il y a aucune bonne solution de rechange à l'aide du SDK OpenXml j'ai raté quelque sorte?
source d'informationauteur Argent
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez pris le mauvais
WorksheetPart
pour la lecture des lignes.La ligne
obtient le premier
WorksheetPart
de la collection qui ne doit pasnécessairement être la première feuille de calcul comme vous le voyez dans Microsoft Excel.
Donc itérer sur tous les
WorksheetParts
et vous devriez voir une sortie sur votrefenêtre de la console.
De lire toutes les valeurs de cellules utiliser la fonction suivante (erreur de manipulation de détails omis) :
Dans le code ci-dessus, vous voyez que les cellules avec le type de données
SharedString
doivent être gérées à l'aide dele
SharedStringTablePart
.