c# - org - mapwindows 5
Leyendo archivos de Excel desde C# (30)
Últimamente, en parte para mejorar en LINQ ... He estado usando la API de automatización de Excel para guardar el archivo como una hoja de cálculo XML y luego procesar ese archivo usando LINQ to XML.
¿Existe una biblioteca de código abierto o gratuita para leer archivos de Excel (.xls) directamente desde un programa de C #?
No es necesario que sea demasiado sofisticado, solo para seleccionar una hoja de trabajo y leer los datos como cadenas. Hasta ahora, he estado usando la función de exportación a texto Unicode de Excel y analizando el archivo resultante (delimitado por tabulaciones), pero me gustaría eliminar el paso manual.
¿Qué hay de Excel Data Reader?
http://exceldatareader.codeplex.com/
He utilizado la ira, en un entorno de producción, para extraer grandes cantidades de datos de una variedad de archivos de Excel en SQL Server Compact. Funciona muy bien y es bastante robusto.
Acabo de hacer un proyecto de demostración rápida 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.
Acabo de usar ExcelLibrary para cargar una hoja de cálculo .xls en un DataSet. Funcionó muy bien para mí.
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 necesitas (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;
}
}
}
El componente .NET Excel Reader .NET puede satisfacer sus requisitos. Es lo suficientemente bueno para leer archivos XLSX y XLS. Así que pruébalo desde:
El enfoque de ADO.NET es rápido y fácil, pero tiene algunas particularidades que debe tener en cuenta, especialmente con respecto a cómo se manejan los DataTypes.
Este excelente artículo lo 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);
}
}
ExcelMapper es una herramienta de código abierto ( http://code.google.com/p/excelmapper/ ) que se puede usar para leer las hojas de cálculo de Excel como Objetos con Escritura Fuerte. Es compatible con los formatos xls y xlsx.
Hice mucha lectura de archivos de Excel en C # hace un tiempo, y usamos dos enfoques:
- La API de COM, donde puede acceder directamente a los objetos de Excel y manipularlos a través de métodos y propiedades
- El controlador ODBC que permite utilizar Excel como una base de datos.
El último enfoque fue mucho más rápido: leer una tabla grande con 20 columnas y 200 líneas tomaría 30 segundos a través de COM y medio segundo a través de ODBC. Así que recomendaría el enfoque de base de datos si todo lo que necesita son los datos.
Aclamaciones,
Carl
La solución que usamos, necesitaba:
- Permitir la lectura / escritura de archivos producidos en Excel
- Ser rápido en el rendimiento (no como usar COM)
- Sea independiente de MS Office (debe ser utilizable sin que los clientes tengan instalado MS Office)
- Ser libre o de código abierto (pero desarrollado activamente)
Hay varias opciones, pero encontramos que NPoi (el puerto .NET del proyecto de código abierto Poi existente en Java) es la mejor: http://npoi.codeplex.com/
También permite trabajar con formatos de archivo .doc y .ppt.
No es gratis, pero con la última versión de Office hay una automatización muy agradable API .Net. (ha habido 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 Office sigue siendo un proceso de fondo oculto.
Perdóneme si estoy fuera de la base aquí, pero ¿no es esto para lo que son los PIA de Office ?
Puede intentar usar esta solución de código abierto que hace que tratar con Excel sea mucho más limpio.
Quiero mostrar un método simple para leer el archivo xls / xlsx con .NET. Espero que lo siguiente te sea de utilidad.
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.
Recomiendo la Biblioteca de FileHelpers, que es una biblioteca .NET gratuita y fácil de usar para importar / exportar datos de EXCEL, longitud fija o registros delimitados en archivos, cadenas o transmisiones + Más.
La sección de documentación de enlace de datos de Excel http://filehelpers.sourceforge.net/example_exceldatalink.html
Sé que la gente ha estado haciendo una "extensión" de Excel para este propósito.
Más o menos haces un botón en Excel que dice "Exportar al programa X", y luego exportas y envías los datos en un formato que el programa puede leer.
http://msdn.microsoft.com/en-us/library/ms186213.aspx debe ser un buen lugar para comenzar.
Buena suerte
Si bien solicitó específicamente .xls, lo que implica los formatos de archivo más antiguos, para los formatos OpenXML (por ejemplo, xlsx), recomiendo altamente el OpenXML SDK ( http://msdn.microsoft.com/en-us/library/bb448854.aspx )
Si solo son datos simples contenidos en el archivo de Excel, puede leer los datos a través de ADO.NET. Vea las cadenas de conexión listadas aquí:
http://www.connectionstrings.com/?carrier=excel2007 o http://www.connectionstrings.com/?carrier=excel2007
-Ryan
Actualización: entonces simplemente puede leer la hoja de trabajo a través de algo como select * from [Sheet1$]
Si son solo datos tabulares. Recomendaría a los ayudantes de datos de archivos de Marcos Melli, que se pueden descargar here .
SpreadsheetGear es impresionante. Sí, es un gasto, pero en comparación con la combinación de 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 a tiempo completo durante más de un año y medio, ¡su atención al cliente es fantástica!
Utilizamos ClosedXML en sistemas bastante grandes.
- Gratis
- Fácil de instalar
- Codificación directa
- Soporte muy sensible
- El equipo de desarrolladores está extremadamente abierto a nuevas sugerencias. A menudo se implementan nuevas funciones y correcciones de errores dentro de la misma semana
podría escribir una hoja de cálculo de Excel que carga una hoja de cálculo de Excel determinada y la guarda como csv (en lugar de hacerlo manualmente).
entonces podrías automatizar eso desde c #.
y una vez que está en csv, el programa c # puede asimilar eso.
(también, si alguien te pide que programes en Excel, es mejor que finjas que no sabes cómo)
(Edit: ah sí, rob y ryan tienen razón)
LinqToExcel tarde a la fiesta, pero soy fan de LinqToExcel
El paquete de 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 manejar (si necesita expandir la funcionalidad o solucionar problemas menores como lo hice).
Al principio, probé el enfoque ADO.Net (cadena de conexión de Excel), pero estaba lleno de hacks desagradables; por ejemplo, si la segunda fila contiene un número, devolverá entradas para todos los campos en la columna a continuación y descartará cualquier información eso no encaja
Koogra es un componente de código abierto escrito en C # que lee y escribe archivos de Excel.
SmartXLS es otro componente de la hoja de cálculo de Excel que admite la mayoría de las funciones de Excel Chart, los motores de fórmulas y puede leer / escribir el formato excelx7 openxml.
SpreadsheetGear para .NET es un componente de hoja de cálculo compatible con Excel para .NET. Puede ver lo que dicen nuestros clientes sobre el rendimiento en el lado derecho de nuestra página de productos . Puede probarlo usted mismo con la evaluation gratuita y totalmente funcional.
Take.io
Spreadsheet hará este trabajo por usted, y sin costo alguno. Solo mira this .
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 usualmente pego 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 desde 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"),
});