Lettura di file Excel da C #

Esiste una libreria libera o open source per leggere i file Excel (.xls) direttamente da un programma C #?

Non ha bisogno di essere troppo elaborato, solo per selezionare un foglio di lavoro e leggere i dati come stringhe. Finora, ho utilizzato la funzione di esportazione di testo Unicode in Excel e l’analisi del file risultante (delimitato da tabulazioni), ma vorrei eliminare il passaggio manuale.

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 uso di solito. È un po ‘diverso perché di solito metto un AsEnumerable () alla modifica delle tabelle:

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

dato che questo mi permette di usare LINQ per cercare e build strutture dai campi.

 var query = data.Where(x => x.Field("phoneNumber") != string.Empty).Select(x => new MyContact { firstName= x.Field("First Name"), lastName = x.Field("Last Name"), phoneNumber =x.Field("Phone Number"), }); 

Se si tratta solo di dati semplici contenuti nel file Excel, è ansible leggere i dati tramite ADO.NET. Vedi le stringhe di connessione elencate qui:

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

-Ryan

Aggiornamento: puoi solo leggere il foglio di lavoro tramite qualcosa come select * from [Sheet1$]

L’approccio ADO.NET è rapido e semplice, ma presenta alcune stranezze di cui dovresti essere a conoscenza, soprattutto per quanto riguarda la gestione dei DataTypes.

Questo eccellente articolo ti aiuterà a evitare alcune trappole comuni: http://blog.lab49.com/archives/196

Questo è quello che ho usato per Excel 2003:

 Dictionary props = new Dictionary(); props["Provider"] = "Microsoft.Jet.OLEDB.4.0"; props["Data Source"] = repFile; props["Extended Properties"] = "Excel 8.0"; StringBuilder sb = new StringBuilder(); foreach (KeyValuePair 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); } } 

Che ne dici di Excel Data Reader?

http://exceldatareader.codeplex.com/

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

Ecco un codice che ho scritto in C # usando .NET 1.1 alcuni anni fa. Non sono sicuro se questo sarebbe esattamente quello che ti serve (e potrebbe non essere il mio miglior codice :)).

 using System; using System.Data; using System.Data.OleDb; namespace ExportExcelToAccess { ///  /// Summary description for ExcelHelper. ///  public sealed class ExcelHelper { private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;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("", 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 } ///  /// This method checks if the user entered sheetName exists in the Schema Table ///  /// Sheet name to be verified /// schema table  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 componente open source scritto in C # che legge e scrive file Excel.

Mentre hai chiesto espressamente per .xls, implicando i vecchi formati di file, per i formati OpenXML (es. Xlsx) consiglio vivamente l’SDK OpenXML ( http://msdn.microsoft.com/en-us/library/bb448854.aspx )

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

  • L’API COM, in cui accedi direttamente agli oggetti di Excel e li manipoli attraverso metodi e proprietà
  • Il driver ODBC che consente di utilizzare Excel come un database.

Quest’ultimo approccio è stato molto più veloce: la lettura di un grande tavolo con 20 colonne e 200 linee richiederebbe 30 secondi tramite COM e mezzo secondo tramite ODBC. Quindi consiglierei l’approccio al database se tutto ciò di cui hai bisogno sono i dati.

Saluti,

Carl

ExcelMapper è uno strumento open source ( http://code.google.com/p/excelmapper/ ) che può essere utilizzato per leggere fogli di lavoro Excel come oggetti fortemente tipizzati. Supporta entrambi i formati xls e xlsx.

Voglio mostrare un metodo semplice per leggere il file xls / xlsx con .NET. Spero che quanto segue ti sarà utile.

  DataTable privata ReadExcelToTable (percorso stringa)    
  {

      // stringa di connessione

      string connstring = "Provider = Microsoft.ACE.OLEDB.12.0; Origine dati =" + percorso + "; Proprietà estese =" Excel 8.0; HDR = NO; IMEX = 1 '; ";  
      // lo stesso nome 
      // stringa connstring = Provider = Microsoft.JET.OLEDB.4.0; Origine dati = "+ percorso + //"; Proprietà estese = 'Excel 8.0; HDR = NO; IMEX = 1'; "; 

      using (OleDbConnection conn = new OleDbConnection (connstring))
      {
         conn.Open ();
         // Ottieni il nome di tutti i fogli
         DataTable sheetsName = conn.GetOleDbSchemaTable (OleDbSchemaGuid.Tables, nuovo object [] {null, null, null, "Table"});  

         // Ottieni il nome del primo foglio
         string firstSheetName = sheetsName.Rows [0] [2] .ToString (); 

         //Stringa della domanda 
         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];   
    }
  } 

Il codice è tratto dall’articolo: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/ . Puoi ottenere maggiori dettagli da esso.

Non è gratuito, ma con l’ultimo Office c’è una molto bella API di automazione .Net. (C’è stata un’API da molto tempo ma era ctriggers COM) Puoi fare tutto ciò che vuoi / hai bisogno di codice tutto mentre l’applicazione Office rimane un processo in background nascosto.

Perdonami se sono fuori base qui, ma non è questo ciò che sono per gli Office PIA ?

Ultimamente, in parte per migliorare in LINQ …. Ho utilizzato l’API di automazione di Excel per salvare il file come foglio di calcolo XML e quindi ottenere l’elaborazione di quel file utilizzando LINQ in XML.

SpreadsheetGear per .NET è un componente del foglio di calcolo compatibile con Excel per .NET. Puoi vedere cosa dicono i nostri clienti sulle prestazioni sul lato destro della nostra pagina di prodotto . Puoi provare tu stesso con la valutazione gratuita e completamente funzionale.

SmartXLS è un altro componente del foglio di calcolo Excel che supporta la maggior parte delle funzioni di grafici Excel, motori di formule e può leggere / scrivere il formato openxml excel2007.

Il componente .NET Excel Reader .NET può soddisfare i tuoi requisiti. È abbastanza buono per leggere i file XLSX e XLS. Quindi provalo da:

http://www.devtriogroup.com/ExcelReader

Raccomando la libreria FileHelpers che è una libreria .NET gratuita e facile da usare per importare / esportare dati da EXCEL, record di lunghezza fissa o delimitati in file, stringhe o stream + Altro.

La sezione Documentazione Excel Data Link http://filehelpers.sourceforge.net/example_exceldatalink.html

Puoi provare a utilizzare questa soluzione open source che rende molto più pulito l’utilizzo di Excel.

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear è fantastico. Sì, è una spesa, ma rispetto a giocherellare con queste altre soluzioni, ne vale la pena. È veloce, affidabile, molto completo, e devo dire che dopo aver usato questo prodotto nel mio lavoro a tempo pieno per oltre un anno e mezzo, il loro supporto clienti è fantastico!

La soluzione che abbiamo usato, doveva:

  • Consenti lettura / scrittura di file prodotti da Excel
  • Sii veloce nelle prestazioni (non come usare le COM)
  • Essere MS Office Independent (necessario per essere utilizzabile senza client con MS Office installato)
  • Sii libero o open source (ma sviluppato triggersmente)

Ci sono diverse scelte, ma abbiamo trovato NPoi (porta .NET del progetto di open source Poi a lungo esistente di Java) per essere il migliore: http://npoi.codeplex.com/

Permette anche di lavorare con i formati di file .doc e .ppt

Se si tratta solo di dati tabulari. Consiglierei gli helper dei dati di file di Marcos Melli che possono essere scaricati qui .

In ritardo alla festa, ma sono un fan di LinqToExcel

puoi scrivere un foglio di calcolo Excel che carica un dato foglio di calcolo Excel e lo salva come csv (piuttosto che farlo manualmente).

allora puoi automatizzarlo da c #.

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

(inoltre, se qualcuno ti chiede di programmare in Excel, è meglio fingere di non sapere come)

(modifica: ah si, rob e ryan hanno entrambi ragione)

So che le persone hanno fatto un’estensione “Excel” per questo scopo.
Più o meno fai un pulsante in Excel con scritto “Esporta a programma X”, quindi esporta e invia i dati in un formato leggibile dal programma.

http://msdn.microsoft.com/en-us/library/ms186213.aspx dovrebbe essere un buon punto di partenza.

In bocca al lupo

Ho appena fatto un rapido progetto dimostrativo che richiedeva la gestione di alcuni file Excel. Il componente .NET del software GemBox era adeguato alle mie esigenze. Ha una versione gratuita con alcune limitazioni.

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

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

Il codice sorgente sembra anche ben organizzato e facile da aggirare (se è necessario espandere la funzionalità o risolvere problemi minori come ho fatto io).

All’inizio, ho provato l’approccio ADO.Net (stringa di connessione Excel), ma era pieno di brutti hack – ad esempio se la seconda riga contiene un numero, restituirà valori per tutti i campi nella colonna sottostante e trascurerà silenziosamente qualsiasi dato quello non va bene.

Usiamo ClosedXML in sistemi piuttosto grandi.

  • Gratuito
  • Facile da installare
  • Codifica diretta
  • Supporto molto reattivo
  • Il team di sviluppatori è estremamente aperto a nuovi suggerimenti. Spesso nuove funzionalità e correzioni di bug sono implementate nella stessa settimana

Take.io Spreadsheet farà questo lavoro per te, e senza alcun costo. Dai un’occhiata a questo .

Ho appena usato ExcelLibrary per caricare un foglio di calcolo .xls in un DataSet. Ha funzionato alla grande per me.