2015-10-23 16 views
12

Ho un problema con la lettura dal file .xlsx (Excel). Ho provato a utilizzare:Come leggere da XLSX (Excel)?

var fileName = @"C:\automated_testing\ProductsUploadTemplate-2015-10-22.xlsx"; 
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, "XLSData"); 
DataTable data = ds.Tables["XLSData"]; 

// ... Loop over all rows. 
StringBuilder sb = new StringBuilder(); 
foreach (DataRow row in data.Rows) 
{ 
    sb.AppendLine(string.Join(",", row.ItemArray)); 
} 

ma in caso di errore a causa di connectionString. Così ho aggiornato la linea per sostenere .xlsx:

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileName); 

ma ottengo:

Il provider 'Microsoft.ACE.OLEDB.12.0' non è registrato sulla macchina locale.

(problema qui è che, io non sono in grado di installare un nuovo software sul mio computer remoto-test, quindi non sono in grado di risolvere il problema e la necessità di trovare altre soluzioni.)

faccio anche è necessario essere sicuri che i dati importati vengano archiviati in un modo semplice (io sono un programmatore principiante) per farmi scorrere attraverso di esso, cioè per creare oggetti con i dati di una riga.

Altri approcci ho controllato:

commento: sembra funzionare, probabilmente per me, ma non supporta i file di Excel di dimensioni sconosciute (numero casuale di righe e colonne).

commento: non supporta impostazioni nomi delle colonne da riga diversa di prima (in alcuni dei miei file Excel, ci sono i commenti in 4-6 prime file e poi è Testate e dati di seguito).

commento: stesso problema di cui sopra.

commento: scaricato peso del pacchetto era finita 60MB e mi richiede di installarlo sul sistema, che non è possibile nella mia situazione. Ad ogni modo, le persone commentano che è limitato a 150 righe.

Nel frattempo cercherò di controllare https://code.google.com/p/linqtoexcel/, ma tutte le altre idee sono più che benvenuti!

EDIT: appena controllato che LinqToExcel, stesso problema come sopra:

Il provider 'Microsoft.ACE.OLEDB.12.0' non è registrato sulla macchina locale.

EDIT2: In definitiva, sembra che questa soluzione ha risolto il mio problema:

https://stackoverflow.com/a/19065266/3146582

+0

epplus https://epplus.codeplex.com/ – Fredou

+0

@Fredou: non è vero creare fogli di calcolo? Ho bisogno di leggere da uno. Ne hai un esempio? –

+0

può anche leggere file excel, controllare questa domanda stackoverflow http://stackoverflow.com/questions/11685204/reading-excel-spreasheet-using-epplus o questo post di blog http://blog.fryhard.com/archive/2010 /10/28/reading-xlsx-files-using-c-and-epplus.aspx – Fredou

risposta

14

Se stai leggendo i dati da Excel file, è possibile utilizzare EPPlus pacchetto NuGet, e utilizzare seguente codice

//using OfficeOpenXml; 
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(@"C:\YourDirectory\sample.xlsx"))) 
{ 
    var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select sheet here 
    var totalRows = myWorksheet.Dimension.End.Row; 
    var totalColumns = myWorksheet.Dimension.End.Column; 

    var sb = new StringBuilder(); //this is your your data 
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //selet starting row here 
    { 
     var row = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString()); 
     sb.AppendLine(string.Join(",", row)); 
    } 
} 
+0

Grazie! È la soluzione migliore per me. Ho appena cambiato un po 'e sostituito l'accodamento al costruttore di stringhe con foreach. –

+0

@BlackHat contento che abbia aiutato :) –

+1

EPPlus era GNU GPL v3 con licenza. – nyconing

-2

State sviluppando su questa macchina anche tu? In caso negativo, suggerirei di utilizzare OpenXml SDK per il numero install it solo sul computer dello sviluppatore.

1

file di lettura Excel con provider OLE è possibile solo se è installato il motore MS Jet (MS Access) . Ho notato che hai deciso di utilizzare .NET Interop in API ma questa non è una buona idea: richiede MS Excel installato e non è consigliato l'uso per l'automazione sui server.

Se non è necessario supportare i vecchi formati Excel (binari) (xls) e la lettura di XLSX è sufficiente, si consiglia di utilizzare la libreria EPPlus. Esso fornisce API semplice e potente sia per la scrittura di file XLSX lettura e la (e ha un sacco di esempi):

var existingFile = new FileInfo(filePath); 
// Open and read the XlSX file. 
using (var package = new ExcelPackage(existingFile)) { 
    // access worksheets, cells etc 
} 
Problemi correlati