Lendo arquivos Excel de C#
Pergunta
Existe uma biblioteca gratuita ou de código aberto para ler arquivos Excel (.xls) diretamente de um programa C#?
Não precisa ser muito sofisticado, basta selecionar uma planilha e ler os dados como strings.Até agora, tenho usado a função de texto Exportar para Unicode do Excel e analisado o arquivo resultante (delimitado por tabulação), mas gostaria de eliminar a etapa manual.
Solução
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"];
Isso é o que costumo usar.É um pouco diferente porque costumo colocar um AsEnumerable() na edição das tabelas:
var data = ds.Tables["anyNameHere"].AsEnumerable();
pois isso me permite usar o LINQ para pesquisar e construir estruturas a partir dos 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"),
});
Outras dicas
Se forem apenas dados simples contidos no arquivo Excel, você poderá ler os dados via ADO.NET.Veja as strings de conexão listadas aqui:
http://www.connectionstrings.com/?carrier=excel2007ouhttp://www.connectionstrings.com/?carrier=excel
-Ryan
Atualizar:então você pode simplesmente ler a planilha através de algo como select * from [Sheet1$]
A abordagem ADO.NET é rápida e fácil, mas possui algumas peculiaridades que você deve conhecer, especialmente em relação ao modo como os DataTypes são tratados.
Este excelente artigo o ajudará a evitar algumas armadilhas comuns:http://blog.lab49.com/archives/196
Isto é o que usei no 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);
}
}
Que tal o Leitor de Dados do Excel?
http://exceldatareader.codeplex.com/
Eu usei isso, em um ambiente de produção, para extrair grandes quantidades de dados de uma variedade de arquivos Excel para o SQL Server Compact.Funciona muito bem e é bastante robusto.
Aqui está um código que escrevi em C# usando .NET 1.1 há alguns anos.Não tenho certeza se isso seria exatamente o que você precisa (e pode não ser meu melhor 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 é um componente de código aberto escrito em C# que lê e grava arquivos Excel.
Embora você tenha solicitado especificamente .xls, implicando nos formatos de arquivo mais antigos, para os formatos OpenXML (por exemplo,xlsx) Eu recomendo fortemente o OpenXML SDK (http://msdn.microsoft.com/en-us/library/bb448854.aspx)
Eu li muito arquivos Excel em C# há algum tempo e usamos duas abordagens:
- A API COM, onde você acessa diretamente os objetos do Excel e os manipula através de métodos e propriedades
- O driver ODBC que permite usar o Excel como um banco de dados.
Esta última abordagem foi muito mais rápido:ler uma tabela grande com 20 colunas e 200 linhas levaria 30 segundos via COM e meio segundo via ODBC.Portanto, eu recomendaria a abordagem de banco de dados se tudo que você precisa são os dados.
Saúde,
Carlos
ExcelMapper é uma ferramenta de código aberto (http://code.google.com/p/excelmapper/) que pode ser usado para ler planilhas do Excel como objetos fortemente tipados.Suporta os formatos xls e xlsx.
Quero mostrar um método simples para ler arquivos xls/xlsx com .NET.Espero que o seguinte seja útil para você.
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]; } }
O código é do artigo: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/.Você pode obter mais detalhes dele.
Não é gratuito, mas com o Office mais recente há um muito boa automação .Net API.(existe uma API há muito tempo, mas era um COM desagradável) Você pode fazer tudo o que quiser/precisar no código, enquanto o aplicativo do Office permanece um processo oculto em segundo plano.
Perdoe-me se estou errado aqui, mas não é isso que o PIA do escritório são para?
Ultimamente, em parte para melhorar no LINQ....Tenho usado a API de automação do Excel para salvar o arquivo como planilha XML e, em seguida, processar esse arquivo usando LINQ to XML.
PlanilhaGear para .NET é um componente de planilha compatível com Excel para .NET.Você pode ver o que nossos clientes dizem sobre desempenho no lado direito do nosso página do produto.Você pode experimentar você mesmo com o aplicativo gratuito e totalmente funcional avaliação.
SmartXLS é outro componente de planilha do Excel que suporta a maioria dos recursos de gráficos do Excel, mecanismos de fórmulas e pode ler/gravar o formato openxml do Excel2007.
O componente .NET Excel Reader .NET pode atender às suas necessidades.É bom o suficiente para ler arquivos XLSX e XLS.Então experimente em:
Eu recomendo a Biblioteca FileHelpers que é uma biblioteca .NET gratuita e fácil de usar para importar/exportar dados do EXCEL, comprimento fixo ou registros delimitados em arquivos, strings ou streams + Mais.
A seção de documentação do link de dados do Excel http://filehelpers.sourceforge.net/example_exceldatalink.html
Você pode tentar usar esta solução de código aberto que torna o trabalho com o Excel muito mais limpo.
SpreadsheetGear é incrível.Sim, é uma despesa, mas comparado a mexer com essas outras soluções, vale a pena o custo.É rápido, confiável, muito abrangente e devo dizer que depois de usar este produto em meu trabalho de software em tempo integral por mais de um ano e meio, o suporte ao cliente deles é fantástico!
A solução que usamos precisava:
- Permitir Leitura / escrita de arquivos produzidos em Excel
- Ser Rápido em desempenho (não como usar COMs)
- Seja MS Office Independente (precisava ser utilizável sem clientes com o MS Office instalado)
- Ser Livre ou Código aberto (mas desenvolvido ativamente)
Existem várias opções, mas encontramos NPoi (porta .NET do Java existente há muito tempo Poi projeto de código aberto) para ser o melhor:http://npoi.codeplex.com/
Também permite trabalhar com formatos de arquivo .doc e .ppt
Se forem apenas dados tabulares.Eu recomendaria ajudantes de dados de arquivo de Marcos Melli que podem ser baixados aqui.
Atrasado para a festa, mas sou fã de LinqToExcel
você poderia escrever uma planilha do Excel que carregasse uma determinada planilha do Excel e a salvasse como csv (em vez de fazê-lo manualmente).
então você poderia automatizar isso em c#.
e uma vez em csv, o programa c # pode grok isso.
(além disso, se alguém lhe pedir para programar em Excel, é melhor fingir que não sabe)
(editar:ah sim, Rob e Ryan estão certos)
Eu sei que as pessoas têm feito uma "extensão" do Excel para esse fim.
Você mais ou menos cria um botão no Excel que diz "Exportar para o Programa X" e depois exporta e envia os dados em um formato que o programa possa ler.
http://msdn.microsoft.com/en-us/library/ms186213.aspx deve ser um bom lugar para começar.
Boa sorte
Acabei de fazer um rápido projeto de demonstração que exigia o gerenciamento de alguns arquivos Excel.O componente .NET do software GemBox foi adequado às minhas necessidades.Possui uma versão gratuita com algumas limitações.
Pacote Excel é um componente de código aberto (GPL) para leitura/gravação de arquivos do Excel 2007.Usei-o em um projeto pequeno e a API é simples.Funciona apenas com XLSX (Excel 200&), não com XLS.
O código-fonte também parece bem organizado e fácil de navegar (se você precisar expandir a funcionalidade ou corrigir pequenos problemas como eu fiz).
No início, tentei a abordagem ADO.Net (string de conexão do Excel), mas estava repleta de hacks desagradáveis - por exemplo, se segundo row contém um número, ele retornará ints para todos os campos na coluna abaixo e eliminará silenciosamente todos os dados que não couberem.
Nós usamos FechadoXML em sistemas bastante grandes.
- Livre
- Fácil de instalar
- Codificação direta
- Muito suporte responsivo
- A equipe de desenvolvedores é extremamente aberto a novas sugestões.Muitas vezes, novos recursos e correções de bugs são implementados na mesma semana
Take.io
A planilha fará esse trabalho para você e sem nenhum custo.Basta dar uma olhada esse.
acabei de usar Biblioteca Excel para carregar uma planilha .xls em um DataSet.Funcionou muito bem para mim.