2013-04-03 41 views
46

La mia applicazione ha bisogno di leggere i dati da un file Excel. Sto usando .Net e C# per lo sviluppo. Non riesco a installare MS Office nel sistema. Per questo motivo la mia applicazione non riesce a leggere il file excel e genera un errore durante il caricamento della DLL per Excel.Come leggere i dati da file Excel utilizzando C#

Come posso accedere al file excel nella mia applicazione in un sistema in cui non è installato MS Office?

+2

OleDB o salvarlo come file CSV (come suggerito da Robert Harvey di seguito). – Tim

+0

per OleDB, dobbiamo avere ms excel installato nella macchina, giusto ?? – TutuGeorge

+0

La conversione di excel in csv tramite codice può essere eseguita anche se non abbiamo installato ms excel ??? – TutuGeorge

risposta

74

C'è la possibilità di utilizzare OleDB e utilizzare i fogli di Excel come DataTable in un database ...

Solo un esempio .....

string con = 
    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" + 
    @"Extended Properties='Excel 8.0;HDR=Yes;'";  
using(OleDbConnection connection = new OleDbConnection(con)) 
{ 
    connection.Open(); 
    OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); 
    using(OleDbDataReader dr = command.ExecuteReader()) 
    { 
     while(dr.Read()) 
     { 
      var row1Col0 = dr[0]; 
      Console.WriteLine(row1Col0); 
     } 
    } 
} 

questo esempio utilizzare il provider Microsoft.Jet.OleDb.4.0 a apri e leggi il file di Excel. Tuttavia, se il file è di tipo xlsx (da Excel 2007 e versioni successive), è necessario scaricare i componenti Microsoft Access Database Engine e installarlo sul computer di destinazione.

Il fornitore si chiama Microsoft.ACE.OLEDB.12.0;. Presta attenzione al fatto che ci sono due versioni di questo componente, uno per 32 bit e uno per 64 bit. Scegliere quello appropriato per il controllo della propria applicazione e quale versione di Office è installata (se presente). Ci sono un sacco di stranezze per far funzionare correttamente quel driver per la tua applicazione. See this question for example.

Naturalmente non è necessario Office installata sul computer di destinazione.

Mentre questo approccio ha alcuni meriti, penso che dovresti prestare particolare attenzione al link segnalato da un commento nella tua domanda Reading excel files from C#. Ci sono alcuni problemi riguardo all'interpretazione corretta dei tipi di dati e quando la lunghezza dei dati, presente in una singola cella Excel, supera i 255 caratteri

+2

Ricevo un'eccezione con il codice. Che cos'è Sheet1 $? –

+2

È il nome di un foglio di lavoro nel file excel. Ogni foglio è considerato come una tabella diversa con il nome del foglio e con un suffisso $. Ovviamente, se cambi il nome del foglio devi cambiare il nome della tabella (foglio1 $) usato sopra – Steve

+0

. Grazie –

4

salvare il file di Excel in formato CSV, e leggere il file risultante con C# utilizzando una libreria del lettore CSV come FileHelpers.

+1

[Classe TextFieldParser] (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic. fileio.textfieldparser.aspx) in Microsoft.VisualBasic.FileIO assembly è incluso in .NET ed è molto buono con i file CSV, IMO. – Tim

+1

Il salvataggio in CSV comporterà il file con valori formattati, anziché i valori sottostanti (ad esempio, arrotondato a due posizioni decimali quando la precisione completa è 6). Questo potrebbe essere un problema a seconda delle esigenze dei tuoi dati. – atheaos

3

Converti il ​​file excel nel file .csv (con valori separati da virgola) e ora puoi facilmente leggerlo.

17

CSharpJExcel per la lettura di file Excel 97-2003 (XLS): http://sourceforge.net/projects/jexcelapi/

e ExcelPackage per la lettura di Excel 2007/2010 file (Office Open XML formato, xlsx): http://excelpackage.codeplex.com/

e ExcelDataReader, che sembra hanno la capacità di gestire entrambi i formati: https://github.com/ExcelDataReader/ExcelDataReader

Buona fortuna!

+3

ExcelDataReader sembra essere il più recente mantenuto. È anche disponibile tramite NuGet. Ho avuto molta fortuna con questo. –

+3

Per gli utenti futuri, provare con ExcelDataReader. È un'opzione molto buona, specialmente se si crea un'applicazione con Platform Target 'AnyCpu'. Altrimenti il ​​dolore dell'installazione di x86 o x64 sulle macchine client è un grosso problema. – MegaMind

+0

Ci scusiamo per dirottare questo thread ... Come importare questa cartella excelreader nel mio progetto? Sono nuovo di C# .. please help – nick

6

Non ho una macchina disponibile per testarlo ma dovrebbe funzionare . Per prima cosa probabilmente sarà necessario installare il 2007 Office System Driver: Data Connectivity Components o lo Microsoft Access Database Engine 2010 Redistributable. Quindi provare il seguente codice, nota che si sarà necessario modificare il nome del foglio nella Select qui sotto per abbinare sheetname nel file excel:

using System.Data; 
using System.Data.OleDb; 

namespace Data_Migration_Process_Creator 
{ 
    class Class1 
    { 
     private DataTable GetDataTable(string sql, string connectionString) 
     { 
      DataTable dt = null; 

      using (OleDbConnection conn = new OleDbConnection(connectionString)) 
      { 
       conn.Open(); 
       using (OleDbCommand cmd = new OleDbCommand(sql, conn)) 
       { 
        using (OleDbDataReader rdr = cmd.ExecuteReader()) 
        { 
         dt.Load(rdr); 
         return dt; 
        } 
       } 
      } 
     } 

     private void GetExcel() 
     { 
      string fullPathToExcel = "<Path to Excel file>"; //ie C:\Temp\YourExcel.xls 
      string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=yes'", fullPathToExcel); 
      DataTable dt = GetDataTable("SELECT * from [SheetName$]", connString); 

      foreach (DataRow dr in dt.Rows) 
      { 
       //Do what you need to do with your data here 
      } 
     } 
    } 
} 

Nota: Non ho un ambiente per testare questo in (Uno con Office installato) quindi non posso dire se funzionerà nel tuo ambiente o no, ma non vedo perché non dovrebbe funzionare.

+3

Ecco qualcosa di cui non ho mai sentito parlare prima: https://code.google.com/p/linqtoexcel/ –

+0

Linq to Excel aiuta molto. grazie –

+0

Function_Library.DatabaseFunctions Questa riga mi dà il seguente errore L'oggetto non contiene la definizione di 'DatabaseFunctions' – wearybands

Problemi correlati