Korzystanie z OpenXmlReader
Nienawidzę uciekać się do StackOverflow na coś tak (pozornie) podstawowego, ale od kilku godzin walczę z Microsoftem i wydaje mi się, że trafia w ślepy zaułek. Próbuję czytać (duże) arkusze kalkulacyjne programu Excel 2007+, a Google uprzejmie poinformował mnie, że korzystanie z zestawu SDK OpenXml jest dość popularnym wyborem. Dałem więc strzał, przeczytałem kilka samouczków, sprawdziłem własne strony biblioteki Microsoftu i niewiele z nich dostałem.
Używam małego testowego arkusza kalkulacyjnego z jedną kolumną liczb i jednym ciągiem znaków - testy na dużą skalę przyjdą później. Wypróbowałem kilka implementacji podobnych do tej, którą zamierzam opublikować, a żadna z nich nie odczytała danych. Poniższy kod pochodzi głównie z innego wątku StackOverflow, w którym wydawało się, że zadziałał - nie dla mnie. Doszedłem do wniosku, że sprawię, że sprawdzą / debugują / pomogą w tej wersji, ponieważ prawdopodobnie będą mniej uszkodzone niż wszystko, co napisałem dzisiaj.
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();
}
}
I na marginesie, czy są jakieś dobre alternatywy dla korzystania z SDK OpenXml, które jakoś przeoczyłem?