Estoy usando OleDb para leer un libro de Excel con muchas hojas.
Necesito leer los nombres de las hojas, pero los necesito en el orden en que están definidos en la hoja de cálculo; así que si tengo un archivo que se ve así;
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
|_____|_____|____|____|____|____|____|____|____|
\__GERMANY__/\__UK__/\__IRELAND__/
Entonces necesito conseguir el diccionario
1="GERMANY",
2="UK",
3="IRELAND"
He intentado usar OleDbConnection.GetOleDbSchemaTable()
, y eso me da la lista de nombres, pero los ordena alfabéticamente. La clasificación alfa significa que no sé a qué número de hoja corresponde un nombre en particular. Así que consigo;
GERMANY, IRELAND, UK
que ha cambiado el orden de UK
y IRELAND
.
La razón por la que necesito que se ordene es que tengo que dejar que el usuario elija un rango de datos por nombre o índice; pueden solicitar "todos los datos de ALEMANIA a IRLANDA" o "datos de la hoja 1 a la hoja 3".
Cualquier idea será muy apreciada.
si pudiera usar las clases de interoperabilidad de la oficina, esto sería sencillo. Desafortunadamente, no puedo porque las clases de interoperabilidad no funcionan de manera confiable en entornos no interactivos como los servicios de Windows y los sitios ASP.NET, por lo que necesitaba usar OLEDB.
fuente
Respuestas:
No puedo encontrar esto en la documentación real de MSDN, pero un moderador en los foros dijo
Nombres de hojas de Excel en orden de hojas
Parece que este sería un requisito lo suficientemente común como para que hubiera una solución decente.
fuente
¿No puede simplemente recorrer las hojas desde 0 hasta Número de nombres -1? de esa manera, debe colocarlos en el orden correcto.
Editar
A través de los comentarios, noté que hay muchas preocupaciones sobre el uso de las clases de interoperabilidad para recuperar los nombres de las hojas. Por lo tanto, aquí hay un ejemplo que usa OLEDB para recuperarlos:
Extraído del artículo sobre CodeProject.
fuente
Dado que el código anterior no cubre los procedimientos para extraer la lista del nombre de la hoja para Excel 2007, el siguiente código será aplicable tanto para Excel (97-2003) como para Excel 2007 también:
La función anterior devuelve la lista de hojas en particular el archivo de Excel para ambos tipos de Excel (97,2003,2007).
fuente
Esto es breve, rápido, seguro y utilizable ...
fuente
exceladdress
- ¿Que es esto?De otra manera:
un archivo xls (x) es solo una colección de archivos * .xml almacenados en un contenedor * .zip. descomprime el archivo "app.xml" en la carpeta docProps.
El archivo es un archivo alemán (Arbeitsblätter = hojas de trabajo). Los nombres de las tablas (Tabelle3, etc.) están en el orden correcto. Solo necesitas leer estas etiquetas;)
Saludos
fuente
Creé la función a continuación utilizando la información proporcionada en la respuesta de @kraeppy ( https://stackoverflow.com/a/19930386/2617732 ). Esto requiere el uso de .net framework v4.5 y requiere una referencia a System.IO.Compression. Esto solo funciona para archivos xlsx y no para archivos xls más antiguos.
fuente
Me gusta la idea de @deathApril para nombrar las hojas como 1_Germany, 2_UK, 3_IRELAND. También recibí tu problema para cambiar el nombre de cientos de hojas. Si no tiene problemas para cambiar el nombre de la hoja, puede usar esta macro para hacerlo por usted. Tomará menos de segundos cambiar el nombre de todos los nombres de las hojas. desafortunadamente ODBC, OLEDB devuelve el orden del nombre de la hoja por asc. No hay reemplazo para eso. Tiene que usar COM o cambiar el nombre de su nombre para que esté en el orden.
ACTUALIZACIÓN: Después de leer el comentario de @SidHoland sobre BIFF, surgió una idea. Los siguientes pasos se pueden realizar mediante código. No sé si realmente desea hacer eso para que los nombres de las hojas estén en el mismo orden. Avísame si necesitas ayuda para hacer esto a través del código.
ACTUALIZACIÓN: Otra solución: NPOI podría ser útil aquí http://npoi.codeplex.com/
Esta solución funciona para xls. No probé xlsx.
Gracias,
Esen
fuente
Esto funcionó para mí. Robado de aquí: ¿Cómo se obtiene el nombre de la primera página de un libro de Excel?
fuente
Prueba esto. Aquí está el código para ordenar los nombres de las hojas.
fuente
Excel.XlFileFormat.xlWorkbookNormal
)Según MSDN, en el caso de hojas de cálculo dentro de Excel, es posible que no funcione porque los archivos de Excel no son bases de datos reales. Por lo tanto, no podrá obtener el nombre de las hojas en el orden de visualización en el libro de trabajo.
Código para obtener el nombre de las hojas según su apariencia visual usando interoperabilidad:
Agregue una referencia a la biblioteca de objetos de Microsoft Excel 12.0.
El siguiente código dará el nombre de las hojas en el orden real almacenado en el libro de trabajo, no el nombre ordenado.
Código de muestra:
fuente
No veo ninguna documentación que diga que el orden en app.xml está garantizado para ser el orden de las hojas. PROBABLEMENTE lo es, pero no de acuerdo con la especificación OOXML.
El archivo workbook.xml, por otro lado, incluye el atributo sheetId, que determina la secuencia, desde 1 hasta el número de hojas. Esto está de acuerdo con la especificación OOXML. workbook.xml se describe como el lugar donde se guarda la secuencia de las hojas.
Entonces, leer workbook.xml después de extraerlo del XLSX sería mi recomendación. NO app.xml. En lugar de docProps / app.xml, use xl / workbook.xml y observe el elemento, como se muestra aquí:
'
'
fuente