Pregunta

¿Existe una biblioteca gratuita o de código abierto para leer archivos de Excel (.xls) directamente desde un programa C#?

No es necesario que sea demasiado sofisticado, simplemente seleccione una hoja de trabajo y lea los datos como cadenas.Hasta ahora, he estado usando la función Exportar a texto Unicode de Excel y analizando el archivo resultante (delimitado por tabulaciones), pero me gustaría eliminar el paso manual.

¿Fue útil?

Solución

var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();

adapter.Fill(ds, "anyNameHere");

DataTable data = ds.Tables["anyNameHere"];

Esto es lo que suelo usar.Es un poco diferente porque normalmente coloco un AsEnumerable() en la edición de las tablas:

var data = ds.Tables["anyNameHere"].AsEnumerable();

ya que esto me permite usar LINQ para buscar y construir estructuras a partir de los campos.

var query = data.Where(x => x.Field<string>("phoneNumber") != string.Empty).Select(x =>
                new MyContact
                    {
                        firstName= x.Field<string>("First Name"),
                        lastName = x.Field<string>("Last Name"),
                        phoneNumber =x.Field<string>("Phone Number"),
                    });

Otros consejos

Si se trata solo de datos simples contenidos en el archivo de Excel, puede leerlos a través de ADO.NET.Vea las cadenas de conexión enumeradas aquí:

http://www.connectionstrings.com/?carrier=excel2007ohttp://www.connectionstrings.com/?carrier=excel

-Ryan

Actualizar:entonces puedes leer la hoja de trabajo a través de algo como select * from [Sheet1$]

El enfoque ADO.NET es rápido y fácil, pero tiene algunas peculiaridades que debes tener en cuenta, especialmente en lo que respecta a cómo se manejan los tipos de datos.

Este excelente artículo le ayudará a evitar algunos errores comunes:http://blog.lab49.com/archives/196

Esto es lo que usé para Excel 2003:

Dictionary<string, string> props = new Dictionary<string, string>();
props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
props["Data Source"] = repFile;
props["Extended Properties"] = "Excel 8.0";

StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> prop in props)
{
    sb.Append(prop.Key);
    sb.Append('=');
    sb.Append(prop.Value);
    sb.Append(';');
}
string properties = sb.ToString();

using (OleDbConnection conn = new OleDbConnection(properties))
{
    conn.Open();
    DataSet ds = new DataSet();
    string columns = String.Join(",", columnNames.ToArray());
    using (OleDbDataAdapter da = new OleDbDataAdapter(
        "SELECT " + columns + " FROM [" + worksheet + "$]", conn))
    {
        DataTable dt = new DataTable(tableName);
        da.Fill(dt);
        ds.Tables.Add(dt);
    }
}

¿Qué tal el lector de datos de Excel?

http://exceldatareader.codeplex.com/

Lo he utilizado en un entorno de producción para extraer grandes cantidades de datos de una variedad de archivos de Excel a SQL Server Compact.Funciona muy bien y es bastante robusto.

Aquí hay un código que escribí en C# usando .NET 1.1 hace unos años.No estoy seguro de si esto sería exactamente lo que necesita (y puede que no sea mi mejor código :)).

using System;
using System.Data;
using System.Data.OleDb;

namespace ExportExcelToAccess
{
    /// <summary>
    /// Summary description for ExcelHelper.
    /// </summary>
    public sealed class ExcelHelper
    {
        private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";";

        public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName)
        {
            OleDbConnection objConnection = new OleDbConnection();
            objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName));
            DataSet dsImport = new DataSet();

            try
            {
                objConnection.Open();

                DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if( (null == dtSchema) || ( dtSchema.Rows.Count <= 0 ) )
                {
                    //raise exception if needed
                }

                if( (null != sheetName) && (0 != sheetName.Length))
                {
                    if( !CheckIfSheetNameExists(sheetName, dtSchema) )
                    {
                        //raise exception if needed
                    }
                }
                else
                {
                    //Reading the first sheet name from the Excel file.
                    sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();
                }

                new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection ).Fill(dsImport);
            }
            catch (Exception)
            {
                //raise exception if needed
            }
            finally
            {
                // Clean up.
                if(objConnection != null)
                {
                    objConnection.Close();
                    objConnection.Dispose();
                }
            }


            return dsImport.Tables[0];
            #region Commented code for importing data from CSV file.
            //              string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + System.IO.Path.GetDirectoryName(fullFileName) +";" +"Extended Properties=\"Text;HDR=YES;FMT=Delimited\"";
            //
            //              System.Data.OleDb.OleDbConnection conText = new System.Data.OleDb.OleDbConnection(strConnectionString);
            //              new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(fullFileName).Replace(".", "#"), conText).Fill(dsImport);
            //              return dsImport.Tables[0];

            #endregion
        }

        /// <summary>
        /// This method checks if the user entered sheetName exists in the Schema Table
        /// </summary>
        /// <param name="sheetName">Sheet name to be verified</param>
        /// <param name="dtSchema">schema table </param>
        private static bool CheckIfSheetNameExists(string sheetName, DataTable dtSchema)
        {
            foreach(DataRow dataRow in dtSchema.Rows)
            {
                if( sheetName == dataRow["TABLE_NAME"].ToString() )
                {
                    return true;
                }   
            }
            return false;
        }
    }
}

Koogra es un componente de código abierto escrito en C# que lee y escribe archivos de Excel.

Si bien solicitó específicamente .xls, lo que implica los formatos de archivo más antiguos, para los formatos OpenXML (p. ej.xlsx) Recomiendo encarecidamente el SDK de OpenXML (http://msdn.microsoft.com/en-us/library/bb448854.aspx)

Leí mucho archivos de Excel en C# hace un tiempo y utilizamos dos enfoques:

  • La API COM, donde accede directamente a los objetos de Excel y los manipula a través de métodos y propiedades.
  • El controlador ODBC que permite utilizar Excel como base de datos.

Este último enfoque fue mucho más rápido:leer una tabla grande con 20 columnas y 200 líneas tomaría 30 segundos vía COM y medio segundo vía ODBC.Por lo tanto, recomendaría el enfoque de base de datos si todo lo que necesita son los datos.

Salud,

carlos

ExcelMapper es una herramienta de código abierto (http://code.google.com/p/excelmapper/) que se puede utilizar para leer hojas de cálculo de Excel como objetos fuertemente tipados.Admite formatos xls y xlsx.

Quiero mostrar un método simple para leer archivos xls/xlsx con .NET.Espero que lo siguiente te sea útil.

 private DataTable ReadExcelToTable(string path)    
 {

     //Connection String

     string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  
     //the same name 
     //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 

     using(OleDbConnection conn = new OleDbConnection(connstring))
     {
        conn.Open();
        //Get All Sheets Name
        DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  

        //Get the First Sheet Name
        string firstSheetName = sheetsName.Rows[0][2].ToString(); 

        //Query String 
        string sql = string.Format("SELECT * FROM [{0}]",firstSheetName); 
        OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);
        DataSet set = new DataSet();
        ada.Fill(set);
        return set.Tables[0];   
   }
 }

El código es del artículo: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/.Puede obtener más detalles de él.

No es gratis, pero con la última versión de Office hay una muy buena automatización .Net API.(Ha existido una API durante mucho tiempo, pero era un COM desagradable) Puede hacer todo lo que quiera o necesite en el código mientras la aplicación de Office sigue siendo un proceso oculto en segundo plano.

Perdónenme si me equivoco aquí, pero ¿no es esto lo que PIA de oficina ¿son para?

Últimamente, en parte para mejorar en LINQ...He estado usando la API de automatización de Excel para guardar el archivo como hoja de cálculo XML y luego procesar ese archivo usando LINQ to XML.

Hoja de cálculoGear para .NET es un componente de hoja de cálculo compatible con Excel para .NET.Puede ver lo que nuestros clientes dicen sobre el rendimiento en el lado derecho de nuestra página del producto.Puedes probarlo tú mismo con la versión gratuita y totalmente funcional. evaluación.

SmartXLS es otro componente de hoja de cálculo de Excel que admite la mayoría de las funciones de gráficos y motores de fórmulas de Excel y puede leer/escribir el formato openxml de Excel 2007.

El componente .NET Excel Reader .NET puede satisfacer sus necesidades.Es lo suficientemente bueno para leer archivos XLSX y XLS.Así que pruébalo desde:

http://www.devtriogroup.com/ExcelReader

Recomiendo la biblioteca FileHelpers, que es una biblioteca .NET gratuita y fácil de usar para importar/exportar datos desde EXCEL, registros de longitud fija o delimitados en archivos, cadenas o secuencias y más.

La sección de documentación de enlace de datos de Excel http://filehelpers.sourceforge.net/example_exceldatalink.html

Puede intentar utilizar esta solución de código abierto que hace que trabajar con Excel sea mucho más limpio.

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear es increíble.Sí, es un gasto, pero en comparación con jugar con estas otras soluciones, vale la pena.Es rápido, confiable, muy completo y debo decir que después de usar este producto en mi trabajo de software de tiempo completo durante más de un año y medio, ¡su atención al cliente es fantástica!

La solución que utilizamos necesitaba:

  • Permitir Leyendo escribiendo de archivos Excel producidos
  • Ser Rápido en rendimiento (no es como usar COM)
  • Sea MS Office Independiente (necesario poder utilizarse sin que los clientes tengan instalado MS Office)
  • Ser Gratis o Fuente abierta (pero desarrollado activamente)

Hay varias opciones, pero encontramos NPoi (Puerto .NET del ya existente Java poi proyecto de código abierto) para ser el mejor:http://npoi.codeplex.com/

También permite trabajar con formatos de archivos .doc y .ppt.

Si son solo datos tabulares.Recomendaría ayudantes de datos de archivos de Marcos Melli que se pueden descargar aquí.

Llegué tarde a la fiesta, pero soy fanático de LinqToExcel

podría escribir una hoja de cálculo de Excel que cargue una hoja de cálculo de Excel determinada y la guarde como csv (en lugar de hacerlo manualmente).

entonces podrías automatizarlo desde c#.

y una vez que esté en csv, el programa c# puede asimilarlo.

(además, si alguien te pide que programes en excel, es mejor fingir que no sabes)

(editar:Ah, sí, Rob y Ryan tienen razón)

Sé que la gente ha estado creando una "extensión" de Excel para este propósito.
Más o menos crea un botón en Excel que dice "Exportar al programa X" y luego exporta y envía los datos en un formato que el programa pueda leer.

http://msdn.microsoft.com/en-us/library/ms186213.aspx debería ser un buen punto de partida.

Buena suerte

Acabo de realizar un proyecto de demostración rápido que requería administrar algunos archivos de Excel.El componente .NET del software GemBox era adecuado para mis necesidades.Tiene una versión gratuita con algunas limitaciones.

http://www.gemboxsoftware.com/GBSpreadsheet.htm

Paquete Excel es un componente de código abierto (GPL) para leer/escribir archivos de Excel 2007.Lo usé en un proyecto pequeño y la API es sencilla.Funciona solo con XLSX (Excel 200&), no con XLS.

El código fuente también parece estar bien organizado y es fácil de utilizar (si necesita ampliar la funcionalidad o solucionar problemas menores como lo hice yo).

Al principio, probé el enfoque ADO.Net (cadena de conexión de Excel), pero estaba lleno de trucos desagradables, por ejemplo si segundo La fila contiene un número, devolverá enteros para todos los campos de la columna siguiente y eliminará silenciosamente cualquier dato que no encaje.

Usamos CerradoXML en sistemas bastante grandes.

  • Gratis
  • Fácil de instalar
  • Codificación sencilla
  • Muy soporte receptivo
  • El equipo de desarrolladores es extremadamente abierto a nuevas sugerencias.A menudo, se implementan nuevas funciones y correcciones de errores en la misma semana.

Take.io Hoja de cálculo hará este trabajo por usted y sin costo alguno.Sólo echa un vistazo a este.

acabo de usar Biblioteca Excel para cargar una hoja de cálculo .xls en un DataSet.Funcionó muy bien para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top