Ó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 Entities (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.

O que seria mais simples.

também, se possível, me aconselhe sobre entidades personalizadas (adicionando propriedades/campos a um objecto dinamicamente) {[[10]}

Author: shA.t, 2012-10-21

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.

 58
Author: Enigmativity, 2015-11-04 20:58:00

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?

 18
Author: Furqan Safdar, 2017-09-19 16:05:32

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();
 3
Author: Hark.Tenl, 2014-04-24 10:37:01

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
 1
Author: davewasthere, 2017-10-19 10:02:15