Ótima maneira de ler um arquivo Excel (.xls/.xlsx)
Eu sei que existem diferentes maneiras de ler um arquivo Excel:
Iterop
Oledb
Open Xml SDK
a compatibilidade não é uma questão porque o programa será executado num ambiente controlado.
As Minhas Exigências:
Ler um ficheiro para um DataTable
/ CUstom Entitie
s (eu não sei como fazer propriedades/campos dinâmicos para um objeto[os nomes de colunas serão variando em um arquivo Excel])
utilize DataTable/Custom Entities
para efectuar algumas operações usando a sua dado.
actualizar DataTable
com os resultados das operações
escreva de volta para excel file
.
também, se possível, me aconselhe sobre entidades personalizadas (adicionando propriedades/campos a um objecto dinamicamente) {[[10]}
4 answers
Olha paraLinq-to-Excel . É muito fixe.
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;
Também permite um acesso de linha fortemente tipado.
Usando a consulta OLE, é bastante simples (por exemplo, o nome sheetName é 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 versões mais recentes do Excel:
return new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=Excel 12.0;");
Também pode usar O leitor de dados do Excel um projecto de código aberto no CodePlex. Seu trabalho realmente bom para exportar dados a partir de folhas do Excel.
O código da amostra indicado na ligação especificada:
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();
Referência: Como posso importar do Excel para um conjunto de dados usando a Microsoft.Escritorio.Interop.Excel?
Tente usar este caminho livre para isto, 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();
Se puder restringi-lo a apenas (Open Office XML format)*.arquivos xlsx, então provavelmente a biblioteca mais popular seria EPPLus .
O bónus é que não há outras dependências. Apenas instale usando nuget:
Install-Package EPPlus