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.

Foi útil?

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:

http://www.devtriogroup.com/ExcelReader

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.

http://excelwrapperdotnet.codeplex.com/

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.

http://www.gemboxsoftware.com/GBSpreadsheet.htm

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top