c# - Forma óptima de leer un archivo de Excel(.xls/.xlsx)
oledb openxml-sdk (4)
Eche un vistazo a Linq-to-Excel . Es bastante limpio.
var book = new LinqToExcel.ExcelQueryFactory(@"File.xlsx");
var query =
from row in book.Worksheet("Stock Entry")
let item = new
{
Code = row["Code"].Cast<string>(),
Supplier = row["Supplier"].Cast<string>(),
Ref = row["Ref"].Cast<string>(),
}
where item.Supplier == "Walmart"
select item;
También permite el acceso a filas fuertemente tipadas.
Sé que hay diferentes formas de leer un archivo de Excel:
Iterop
-
Oledb
-
Open Xml SDK
La compatibilidad no es una pregunta porque el programa se ejecutará en un entorno controlado.
Mi requisito:
Lea un archivo en una CUstom Entitie
DataTable
/ CUstom Entitie
(no sé cómo hacer propiedades / campos dinámicos a un objeto [los nombres de las columnas variarán en un archivo Excel])
Use DataTable/Custom Entities
para realizar algunas operaciones utilizando sus datos.
Actualizar DataTable
con los resultados de las operaciones
Escríbela de nuevo al excel file
.
Que sería más simple.
Además, si es posible, infórmenme sobre Entidades personalizadas (agregando propiedades / campos a un objeto dinámicamente)
Intenta usar esta forma gratuita para esto, https://freenetexcel.codeplex.com
Workbook workbook = new Workbook();
workbook.LoadFromFile(@"../../parts.xls",ExcelVersion.Version97to2003);
//Initialize worksheet
Worksheet sheet = workbook.Worksheets[0];
DataTable dataTable = sheet.ExportDataTable();
Si puede restringirlo a solo (formato XML de Open Office) * .xlsx, probablemente la biblioteca más popular sea EPPLus .
La ventaja es que no hay otras dependencias. Simplemente instale usando nuget:
Install-Package EPPlus
Usando OLE Query, es bastante simple (por ejemplo, sheetName es Sheet1 $):
DataTable LoadWorksheetInDataTable(string fileName, string sheetName)
{
DataTable sheetData = new DataTable();
using (OleDbConnection conn = this.returnConnection(fileName))
{
conn.Open();
// retrieve the data using data adapter
OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn);
sheetAdapter.Fill(sheetData);
}
return sheetData;
}
private OleDbConnection returnConnection(string fileName)
{
return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=/"Excel 8.0;/"");
}
Para versiones de Excel más recientes:
return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=Excel 12.0;");
También puede usar Excel Data Reader como un proyecto de código abierto en CodePlex. Funciona muy bien para exportar datos de hojas de Excel.
El código de muestra proporcionado en el enlace especificado:
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
//1. Reading from a binary Excel file (''97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//...
//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();
//5. Data Reader methods
while (excelReader.Read())
{
//excelReader.GetInt32(0);
}
//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();
Referencia: ¿Cómo importo desde Excel a un DataSet usando Microsoft.Office.Interop.Excel?