Importar y exportar Excel: ¿cuál es la mejor biblioteca? [cerrado]

180

En una de nuestras aplicaciones ASP.NET en C #, tomamos una cierta recopilación de datos (colección SubSonic) y la exportamos a Excel. También queremos importar archivos de Excel en un formato específico. Estoy buscando una biblioteca que pueda usar para este propósito.

Requisitos:

  • Archivos de Excel 2007 (¿Excel 2003 admite más de 64k filas? Necesito más que eso).
  • No requiere Excel en el servidor
  • Toma una colección escrita y, si puede, intenta poner campos numéricos como numéricos en Excel.
  • Funciona bien con archivos grandes (100k a 10M), lo suficientemente rápido.
  • ¡No se bloquea al exportar GUID!
  • No cuesta una gran cantidad de dinero (no hay una biblioteca empresarial como Aspose). Gratis siempre es genial, pero puede ser una biblioteca comercial.

¿Qué biblioteca me recomiendan? ¿Lo ha usado para grandes cantidades de datos? ¿Hay otras soluciones?

En este momento, estoy usando una herramienta simple que genera HTML que Excel carga más adelante, pero estoy perdiendo algunas capacidades, además Excel se queja cuando lo cargamos. No necesito generar gráficos ni nada de eso, solo exportar datos en bruto.

Estoy pensando en archivos CSV planos, pero Excel es un requisito del cliente. Puedo trabajar con CSV directamente, si tuviera una herramienta para convertir ay desde Excel. Dado que Excel 2007 es un formato de archivo basado en xml (y comprimido), supongo que este tipo de biblioteca debería ser fácil de encontrar. Sin embargo, lo que más me importa son sus comentarios y opiniones.


EDITAR: Irónicamente, en mi opinión y siguiendo la respuesta con la mayoría de los votos, la mejor biblioteca de importación y exportación de Excel no es exportar en absoluto. Este no es el caso para todos los escenarios, pero es para el mío. Los archivos XLS solo admiten 64k filas. XLSX admite hasta 1M. Las bibliotecas gratuitas que he probado presentan un mal rendimiento (un segundo para cargar una fila cuando tienes 200k filas). No he probado los pagos, ya que creo que son demasiado caros por el valor que ofrecen cuando todo lo que necesita es una rápida rutina de conversión XLSX <-> CSV.

Jason Kealey
fuente
18
"Dado que Excel 2007 es un formato de archivo basado en xml (y comprimido), supongo que este tipo de biblioteca debería ser fácil de encontrar" - ¡ja! Es como decir "Excel 97 está basado en bytes, por lo que este tipo de biblioteca debería ser fácil de encontrar". XML no implica simplicidad, y OOXML es el elemento secundario de cómo hacer que XML sea poco especificado e indescifrablemente complejo. :-)
Ken
En realidad no estás del todo correcto al hacer esa suposición. Hay herramientas disponibles que hacen que crear un documento OOXML bien formado, al menos para XLSX, sea muy fácil de hacer con C # .NET.
Tipo anónimo el
3
He creado una propuesta de sitio para dar a preguntas como esta un hogar oficial lejos de Stack Overflow. Se llama Recomendaciones de código. ¡ Ayúdenos a hacerlo realidad uniéndose y haciendo preguntas ahora!
daviewales
¿Qué pasa con Spire.xls? Solo cuesta $ 800 para la Edición Pro. Obtiene todas sus conversiones, así como su importación o exportación de Excel. e-iceblue.com/Introduce/…
Programador DotNet
GemBox.Spreadsheet es otra solución que vale la pena revisar, súper rápida y tiene versiones gratuitas y profesionales. Además, la versión pro es bastante barata y no tiene costos ocultos para la implementación como la mayoría de ellos.
NixonUposseen

Respuestas:

41

Voy a echar mi mano en busca de archivos csv planos, aunque solo sea porque tienes el mayor control sobre el código. Solo asegúrate de leer en las filas y procesarlas de una en una (leer el documento hasta el final y dividirlo consumirá toda tu memoria, lo mismo que escribir, transmitirlo).

Sí, el usuario tendrá que guardar como CSV en Excel antes de que pueda procesarlo, pero ¿tal vez esta limitación pueda superarse entrenando y proporcionando instrucciones claras en la página?

Finalmente, cuando exporta al cliente, si establece el tipo MIME en text / csv, Excel generalmente se asigna a ese tipo, por lo que el usuario parece ser 'un archivo Excel'.

tsimon
fuente
44
También probé el enfoque CSV, pero hay varios problemas con él. Por ejemplo, ¿qué sucede si desea tener un texto de varias líneas en una celda? No pude hacer que Excel importara tal CSV.
Igor Brejc
23
CSV tiene su lugar, pero el póster preguntó sobre Excel, supongo que debe querer Excel, no CSV.
John Scipione
77
CSV se cae al exportar columnas como 0345. Excel lo recorta automáticamente a 345. Lo cual no es de ninguna ayuda cuando ese dígito inicial es importante.
NotMe
2
La tabla HTML con una extensión de archivo de Excel parece funcionar bastante bien ... analizará algunos CSS de una manera peculiar para cosas como formatear múltiples líneas, colores, etc., sin tener que crear un archivo Excel nativo
Oskar Duveborn
3
"Guardar como"? No. Si el cliente está utilizando Excel, ¿por qué debería guardar un segundo archivo mucho más limitado para interactuar con su producto?
mlibby
41

Descubrí el Open XML SDK desde mi respuesta original. Proporciona clases fuertemente tipadas para objetos de hoja de cálculo, entre otras cosas, y parece ser bastante fácil de trabajar. Lo voy a usar para informes en uno de mis proyectos. Lamentablemente, se supone que la versión 2.0 no se lanzará hasta finales de 2009 o 2010.

cdonner
fuente
¡Muy interesante! ¿Lo has probado usando grandes cantidades de datos?
Jason Kealey
No he hecho ninguna prueba de rendimiento. Principalmente haré gráficos e informes de una sola página, por lo que el rendimiento no es un problema para mí. Sin embargo, parece ser tan rápido como puede ser el código administrado.
cdonner
1
@ Jason Kealey: esta es realmente la mejor respuesta en esta publicación: la exportación se vuelve irrelevante con SpreadsheetML. Todos los datos son accesibles desde el archivo. Si necesita los datos en un formato diferente, proporcione una transformación mediante un XSLT o mediante Linq.
Todd Main
1
Sin embargo, esto no funciona para los archivos ".xls".
Quillbreaker
github.com/OfficeDev/Open-XML-SDK ahora es de código abierto y está alojado en github (me gusta hacia dónde se dirige MS recientemente)
Alex
34

la nueva versión de ExcelPackage está aquí http://EPPlus.codeplex.com

Todavía estoy luchando con la función de exportación a Excel, ya que mi aplicación debería exportar algunos datos a Excel-Template 2007

Este proyecto me parece bien, y el desarrollador es muy sensible a los errores y problemas.

Mohannad Otaibi
fuente
3
Funciona bien, pero está licenciado bajo GPL - por ejemplo, cualquier software usando ésta debe estar disponible en el código fuente llano, demasiado .... no siempre es una buena elección ...
marc_s
Exporte en un formato nativo que sea conveniente para usted, escriba un programa. que usa EPPlus para convertir a Excel, que sea gratis. Haga que su programa principal use eso de forma predeterminada, pero permita otros "complementos", oye, su código real está libre de la GPL.
55
Parece que ahora está licenciado bajo la LGPL, por lo que está bien usarlo como una biblioteca vinculada sin las restricciones de copyleft.
Brad R
Tenga en cuenta que si necesita producir un archivo de Excel que tenga grandes cadenas, esta biblioteca tiene una tendencia a producir al azar errores de 'contenido ilegible' en Excel.
Kevin Laity
1
Tenga en cuenta que EPPlus pierde memoria, no es realmente bueno para grandes cantidades de datos.
user3285954
18

¡He estado usando ClosedXML y funciona muy bien!

ClosedXML facilita a los desarrolladores la creación de archivos Excel 2007/2010. Proporciona una buena forma orientada a objetos para manipular los archivos (similar a VBA) sin tener que lidiar con las molestias de los documentos XML. Puede ser utilizado por cualquier lenguaje .NET como C # y Visual Basic (VB).

druida
fuente
8
Me encanta la ironía en el nombre ...
Jagd
Lo usó también y la misma experiencia. Funciona bien y es muy flexible.
AnthonyVO
14

SpreadsheetGear para .NET lee y escribe CSV / XLS / XLSX y hace más.

Puede ver ejemplos de ASP.NET en vivo con código fuente C # y VB aquí y descargar una versión de prueba gratuita aquí .

Por supuesto, creo que SpreadsheetGear es la mejor biblioteca para importar / exportar libros de Excel en ASP.NET, pero soy parcial. Puede ver lo que dicen algunos de nuestros clientes en el lado derecho de esta página .

Descargo de responsabilidad: soy dueño de SpreadsheetGear LLC

Joe Erickson
fuente
@ Joe Erickson: ¿Puede decirnos cómo se lee un CSV y luego se produce un XML a partir del CSV que se acaba de leer usando un equipo de hoja de cálculo y ese XLS que produce un archivo XML resultante que contiene esa estructura? ¿O podemos usar Spreadsheetgear para producir un XML a partir de un CSV directamente?
AnkitSablok
5

He usado Flexcel en el pasado y fue genial. Pero esto fue más para crear y actualizar mediante programación hojas de trabajo de Excel.

Duncan
fuente
No puedo ver que esto sea compatible con Excel 2007 (xlsx). Como xls solo admite 64k filas, esta es una limitación para mí.
Jason Kealey el
@Jason Kealey - Flexcel ahora es compatible con Excel 2007 y 2010.
Pauk
5

La exportación de CSV es simple, fácil de implementar y rápida. Sin embargo, hay un problema potencial que vale la pena señalar. Excel (hasta 2007) no conserva los ceros a la izquierda en los archivos CSV. Esto confundirá códigos postales, identificadores de productos y otros datos textuales que contengan valores numéricos. Hay un truco que hará que Excel importe los valores correctamente (usando delimitadores y valores de prefijo con el signo =, si no recuerdo mal, por ejemplo, .., = "02052", ...). Si tiene usuarios que realizarán tareas de procesamiento posterior con el CSV, deben tener en cuenta que deben cambiar el formato a XLS y no guardar el archivo nuevamente en CSV. Si lo hacen, los ceros iniciales se perderán para siempre.

cdonner
fuente
1
Para cualquier cosa que deba conservarse como texto, simplemente ponga un '(apóstrofe) al principio
phuclv
Otro dato divertido: no puedo abrir un archivo separado por comas en muchos entornos locales, como el alemán. Lo que hace que csv sea un formato deficiente para compartir datos con contactos internacionales
Christian Sauer
4

Durante años, he usado JExcel para esto, un excelente proyecto Java de código abierto. También era compatible con .NET al usar J # para compilarlo, y también he tenido un gran éxito con él en esta encarnación. Sin embargo, recientemente necesitaba migrar el código a .NET nativo para admitir una aplicación IIS de 64 bits en la que creo una salida de Excel. La versión J # de 32 bits no se cargaría.

El código para CSharpJExcel es LGPL y está disponible actualmente en esta página, mientras nos preparamos para implementarlo en el sitio de JExcel SourceForge. Se compilará con VS2005 o VS2008. Los ejemplos en la documentación original de JExcel se moverán bastante intactos a la versión .NET.

Espero que sea útil para alguien aquí afuera.

Chris Laforet
fuente
Ambos enlaces ya no funcionan ... pero encontré algunos fragmentos y parece que es más amigable con Java, no tanto para los desarrolladores de .NET. Sin embargo, encontré otra biblioteca que es opuesta, es una biblioteca nativa .NET ( GemBox.Spreadsheet ), que también fue portada a Java ( GemBox.Spreadsheet para Java ).
Hazel Patton
3

El siguiente sitio muestra cómo exportar un DataTable, DataSet o List <> a un archivo .xlsx Excel 2007 "adecuado" (en lugar de exportar un archivo .csv y hacer que Excel lo abra).

Utiliza las bibliotecas OpenXML, por lo que no necesita tener Excel instalado en su servidor.

Mikes Knowledge Base - ExportToExcel

Todo el código fuente se proporciona, de forma gratuita , así como una aplicación de demostración.

Es muy fácil agregar a sus propias aplicaciones, solo necesita llamar a una función, pasar un nombre de archivo de Excel y su fuente de datos:

DataSet ds = CreateSampleData();
string excelFilename = "C:\\Sample.xlsx";
CreateExcelFile.CreateExcelDocument(ds, excelFilename);

Espero que esto ayude.

Mike Gledhill
fuente
2

Verifique el proyecto ExcelPackage , utiliza el formato de archivo Office Open XML de Excel 2007, es liviano y de código abierto ...

CMS
fuente
1
Se veía bien, pero un comentario dice que es malo con archivos grandes (mi escenario)
Jason Kealey el
1
Interesante: tiene licencia como GPL, no LGPL. Por lo tanto, debe usarse en aplicaciones GPL. (También, desafortunadamente que el desarrollo parece haberse detenido)
Jason Kealey
1
Intenté ExcelPackage, pero tuve que abandonarlo; falla cuando intentas poner comillas simples (') en una celda.
Igor Brejc
2

He intentado CSharpJExcel y no lo recomendaría, al menos no hasta que haya alguna documentación disponible. Contrariamente a los desarrolladores comenta que es no un puerto nativo recta.

usuario483711
fuente
2

Sé que esto es bastante tarde, pero me siento obligado a responder xPorter (escritura) y xlReader (lectura) desde xPortTools.Net . Probamos bastantes bibliotecas y nada se acercó en términos de rendimiento (estoy hablando de escribir millones de filas en segundos aquí). ¡No puedo decir lo suficiente sobre estos productos!

DanP
fuente
2

Puedes usar Microsoft.Jet.OLEDB.4.0

RG.
fuente
1
Uno de mis requisitos es no tener Excel ejecutándose en el servidor.
Jason Kealey
2
¡No lo creo, así que está funcionando!
Soner Gönül
2
MS office no es necesario para "Microsoft.Jet.OLEDB.4.0" (para xls) "Microsoft.ACE.OLEDB.12.0 para xlsx". debe usar solo controladores, por lo que no hay posibilidad de ejecutar Excel en el servidor @ Jason Kealey
Sanjay Goswami
1
Utilicé esto para XLS (no el requisito original), y para completar ... Hay algunos problemas importantes: (1) Es solo de 32 bits, por lo que tendrá que configurar IIS para permitir eso. (2) La exportación es terriblemente lenta. (3) Tiene límites de fila y columna mal documentados. (4) Insiste en "importar el tipo" columnas importadas a menos que tenga acceso al registro, y generalmente se equivoca.
philw
1

Acabamos de identificar una necesidad similar. Y creo que es importante tener en cuenta la experiencia del usuario.

Casi nos desviamos de la misma manera:

  1. Preparar / trabajar en archivo de hoja de cálculo
  2. Guardar el archivo
  3. Importar archivo
  4. Trabajar con datos en el sistema

... flujo de trabajo

Add-in Express le permite crear un botón dentro de Excel sin todo ese trabajo tedioso con VSTO. Entonces el flujo de trabajo se convierte en:

  1. Preparar / trabajar en archivo de hoja de cálculo
  2. Importar archivo (usando el botón dentro de Excel )
  3. Trabajar con datos en el sistema

Haga que el código detrás del botón use la API de Excel "nativa" (a través de Add-in Express) y empuje directamente al sistema del destinatario. No puede ser mucho más transparente para el desarrollador o el usuario. Vale la pena considerarlo.

Program.X
fuente
1

Hay un muy buen artículo y biblioteca en CodeProject por Yogesh Jagota:

Biblioteca Excel Excel Import-Export

Lo he usado para exportar datos de consultas SQL y otras fuentes de datos a Excel, funciona bien para mí.

Salud

marc_s
fuente
1
Interesante, pero requiere archivos XML. No se pueden leer / escribir archivos xls o xlsx.
Jason Kealey el
1

Puede probar la siguiente biblioteca, es bastante fácil y es solo una envoltura ligera sobre el SDK Open XML de Microsoft (incluso puede reutilizar el formato, los estilos e incluso hojas de trabajo completas del archivo secundario de Excel): http://officehelper.codeplex.com

aron.sinoai
fuente
Recientemente se publicó una nueva versión de la biblioteca.
aron.sinoai
0

Spreadsheetgear es la mejor biblioteca comercial que hemos encontrado y estamos usando. Nuestra empresa realiza una gran cantidad de importación y exportación avanzadas de Excel y Spreadsheetgear admite muchas funciones avanzadas de Excel mucho más allá de cualquier cosa que pueda hacer con CSV simple, y es rápido. Sin embargo, no es gratuito ni muy barato, pero vale la pena porque el soporte es excelente. Los desarrolladores realmente te responderán si te encuentras con un problema.

pilavdzice
fuente
0

¿Qué tal la biblioteca apache POI java? No lo he usado para Excel, pero lo hice para Word 2007.

harijay
fuente