Domanda

C'è un libero o open source libreria per leggere i file di Excel (.xls) direttamente da un programma in C#?

Non è necessario essere troppo di fantasia, solo per selezionare un foglio di lavoro e leggere i dati come stringhe.Finora ho usato l'Esportazione di testo Unicode funzione di Excel, e l'analisi della risultante (delimitato da tabulazione) file, ma vorrei eliminare il passaggio manuale.

È stato utile?

Soluzione

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"];

Questo è quello che di solito uso.È un po ' diverso, perché io di solito bastone un AsEnumerable() alla modifica delle tabelle:

var data = ds.Tables["anyNameHere"].AsEnumerable();

questo mi permette di utilizzare LINQ per la ricerca e costruire le strutture dai campi.

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"),
                    });

Altri suggerimenti

Se si tratta solo di semplici dati contenuti nel file Excel è possibile leggere i dati via ADO.NET.Vedere le stringhe di connessione elencati qui:

http://www.connectionstrings.com/?carrier=excel2007 o http://www.connectionstrings.com/?carrier=excel

-Ryan

Aggiornamento:poi si può semplicemente leggere il foglio di via qualcosa di simile select * from [Sheet1$]

Il ADO.NET l'approccio è semplice e veloce, ma ha alcuni problemi che si dovrebbe essere a conoscenza, in particolare per quanto riguarda come i tipi di dati vengono trattati.

Questo eccellente articolo vi aiuterà a evitare alcuni errori comuni:http://blog.lab49.com/archives/196

Questo è quello che ho usato per 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);
    }
}

Come circa i Dati di Excel Reader?

http://exceldatareader.codeplex.com/

Ho utilizzato la rabbia, in un ambiente di produzione, per estrarre grandi quantità di dati da una varietà di file di Excel in SQL Server Compact.Funziona molto bene ed è molto robusto.

Ecco il codice che ho scritto in C# utilizzando .NET 1.1 un paio di anni fa.Non sono sicuro se questo sarebbe esattamente di che cosa avete bisogno (e non può essere il mio migliore codice :)).

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 è un open-source componente scritto in C# che legge e scrive i file di Excel.

Mentre avete fatto specifica richiesta .xls, implicando i formati di file precedenti, per OpenXML formati (es.xlsx) mi raccomando il OpenXML SDK (http://msdn.microsoft.com/en-us/library/bb448854.aspx)

Ho fatto un sacco di lettura da file di Excel in C# un po ' di tempo fa, e abbiamo usato due approcci:

  • L'API COM, dove l'accesso di Excel direttamente gli oggetti e manipolarli attraverso metodi e proprietà
  • Il driver ODBC che permette di utilizzare Excel come database.

Quest'ultimo approccio è stato molto più veloce:la lettura di un grande tavolo con 20 colonne e 200 linee sarebbero voluti 30 secondi tramite COM, e la metà di un secondo tramite ODBC.Quindi, vorrei raccomandare il database approccio se avete bisogno di dati.

Ciao

Carl

ExcelMapper è uno strumento open source (http://code.google.com/p/excelmapper/) che può essere utilizzato per leggere i fogli di lavoro di Excel come Oggetti Fortemente Tipizzati.Supporta sia xls e xlsx.

Voglio mostrarvi un metodo semplice per leggere xls/xlsx file .NET.Spero che il seguito sarà utile per voi.

 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];   
   }
 }

Codice articolo: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/.È possibile ottenere ulteriori dettagli.

Non è gratuito, ma con la più recente per Office c'è un molto nice automazione .Net API.(c'è stato un API per un po di tempo, ma è stato brutto COM) Si può fare tutto quello che vuole / bisogno in codice il tutto mentre l'Ufficio app rimane nascosto processo in background.

Perdonatemi se sono off-base qui, ma non è questo ciò che il Ufficio di PIA sono per?

Ultimamente, in parte per arrivare meglio a LINQ....Sto usando Excel API di automazione per salvare il file come file di Foglio di calcolo XML e quindi ottenere il processo di file utilizzando LINQ to XML.

SpreadsheetGear per .NET è compatibile con Excel componente foglio di lavoro .NET.Si può vedere che cosa i nostri clienti dicono di prestazioni sul lato destro del nostro pagina del prodotto.Si può provare voi stessi con l'gratuita completamente funzionale valutazione.

SmartXLS è un altro componente foglio di calcolo di excel che supportano la maggior parte delle funzioni di Grafici di excel,le formule di motori, e in grado di leggere/scrivere la excel2007 formato openxml.

L' .Componente NETTA Lettore di Excel .NET può soddisfare le vostre esigenze.È buona abbastanza per la lettura XLSX e XLS.Quindi, provare dai:

http://www.devtriogroup.com/ExcelReader

Mi raccomando la FileHelpers Biblioteca, che è un libero e facile da usare .Libreria di rete per importare/esportare i dati da EXCEL, lunghezza fissa o delimitato da record nel file, stringhe o flussi di + Più.

Excel I Dati Di Collegamento Sezione Documentazione http://filehelpers.sourceforge.net/example_exceldatalink.html

Si può provare a utilizzare questa soluzione open source che permette di affrontare con Excel molto più pulito.

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear è impressionante.Sì è una spesa, ma rispetto a giocare con queste altre soluzioni, vale la pena il costo.È veloce, affidabile, molto completo, e devo dire che dopo l'utilizzo di questo prodotto nel mio tempo pieno il lavoro di software per più di un anno e mezzo, il loro servizio clienti è fantastico!!!

La soluzione che abbiamo utilizzato per:

  • Consentire Lettura/Scrittura di Excel prodotta file
  • Essere Veloce in termini di prestazioni (non come l'utilizzo di COMs)
  • Essere di MS Office Indipendente (necessario per essere utilizzabile, senza che i clienti debbano MS Office installato)
  • Essere Gratis o Open Source (ma attivamente sviluppate)

Ci sono diverse scelte, ma abbiamo trovato NPoi (.NETTO porto di Java lunga esistenti Pdi un progetto open source) di essere i migliori:http://npoi.codeplex.com/

Esso permette anche di lavorare con .doc e .formati di file ppt

Se si tratta solo di dati in formato tabellare.Vorrei raccomandare file di dati di helper per Marcos Melli, che può essere scaricato qui.

In ritardo alla festa, ma io sono un fan di LinqToExcel

si potrebbe scrivere un foglio di calcolo excel che carica un determinato foglio di calcolo di excel e salvarlo come file csv (invece di farlo manualmente).

poi si potrebbe automatizzare che da c#.

e una volta che è in formato csv, il programma in c# può capire che.

(inoltre, se qualcuno ti chiede di programma in excel, è meglio far finta di non sapere come)

(edit:ah sì, rob e ryan sono sia a destra che a)

So che la gente ha sempre fatto un Excel "estensione" per questo scopo.
Si più o meno creare un pulsante in Excel che dice "Esportare Programma X", e quindi esportare e inviare i dati in un formato che il programma può leggere.

http://msdn.microsoft.com/en-us/library/ms186213.aspx dovrebbe essere un buon posto per iniziare.

Buona fortuna

Appena fatto una rapida demo del progetto che ha richiesto la gestione di alcuni file di excel.L' .Componente NETTA da GemBox software è stato sufficiente per le mie esigenze.Ha una versione gratuita con alcune limitazioni.

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

Excel Pacchetto è un open-source (GPL) componente per la lettura/scrittura di file di Excel 2007.Io l'ho usato su un piccolo progetto, e l'API è semplice.Funziona con XLSX solo (Excel 200&), non con XLS.

Il codice sorgente sembra anche ben organizzata e facile da ottenere intorno (se avete bisogno di espandere le funzionalità o correggere problemi minori, come ho fatto io).

In un primo momento, ho provato il ADO.Net (Excel stringa di connessione) approccio, ma era pieno di brutti hack, per esempio se secondo riga contiene un numero, verrà restituito int per tutti i campi nella colonna qui sotto e tranquillamente cadere tutti i dati che non rientrano.

Usiamo ClosedXML piuttosto elevato di sistemi.

  • Gratis
  • Facile da installare
  • Dritto in avanti di codifica
  • Molto supporto reattivo
  • Team di sviluppatori è estremamente aperto a nuovi suggerimenti.Spesso le nuove caratteristiche e correzioni di bug sono implementati all'interno della stessa settimana

Take.io Foglio di calcolo farà questo lavoro per voi, e gratuitamente.Basta dare un'occhiata a questo.

Ho appena usato ExcelLibrary per caricare un .xls foglio di calcolo in un set di dati.Ha lavorato per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top