Utilizando OpenXmlReader
Odio recurrir a StackOverflow para algo tan (aparentemente) básico, pero he estado luchando con Microsoft durante las últimas horas y parece que estamos llegando a un callejón sin salida. Estoy tratando de leer (grandes) hojas de cálculo de Excel 2007+, y Google me ha informado amablemente que usar el SDK de OpenXml es una opción bastante popular. Así que le di una oportunidad a la cosa, leí algunos tutoriales, revisé las páginas de la biblioteca de Microsoft y obtuve muy poco de todas ellas.
Estoy usando una hoja de cálculo de prueba pequeña con solo una columna de números y una de cadenas: las pruebas a gran escala vendrán más adelante. He intentado varias implementaciones similares a la que estoy a punto de publicar, y ninguna de ellas lee datos. El código a continuación se tomó principalmente de otro hilo de StackOverflow, donde parecía haber funcionado, no para mí. Pensé que los tendré a ustedes revisando / depurando / ayudando con esta versión, porque probablemente estará menos roto que cualquier cosa que haya escrito hoy.
<code>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(); } } </code>
Y, en una nota al margen, ¿hay alguna buena alternativa al uso del SDK de OpenXml que de alguna manera me he perdido?