2015-10-23 10 views
12

Ich habe ein Problem mit dem Lesen von .xlsx (Excel) -Datei. Ich habe versucht, zu verwenden:Wie liest man aus 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)); 
} 

aber wenn aufgrund connectionString fehlgeschlagen. So aktualisiert ich die Linie .xlsx zu unterstützen:

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

aber ich bekomme:

Der 'Microsoft.ACE.OLEDB.12.0' Anbieter ist auf dem lokalen Computer nicht registriert.

(Problem hier ist, dass, ich bin nicht in der Lage eine neue Software auf Remote-Testmaschine zu installieren, so dass ich bin nicht in der Lage, es zu beheben und müssen andere Lösung finden.)

ich auch tun Ich muss sicher sein, dass die importierten Daten auf einfache Weise gespeichert werden (ich bin ein Anfänger Programmierer), damit ich sie durch iterieren kann, zB um Objekte mit Daten der Reihe zu erstellen.

Andere Ansätze, die ich überprüft:

Kommentar: scheint wahrscheinlich für mich zu arbeiten, aber nicht Excel-Dateien von unbekannten Dimensionen (zufällige Anzahl von Zeilen und Spalten unterstützen).

Kommentar: keine Einstellungen Spaltennamen aus anderen Zeile als erste Unterstützung (in einigen meiner Excel-Dateien, gibt es Kommentare in 4-6 ersten Zeilen und dann ist Header Zeile und Daten unten).

Kommentar: wie oben gleiches Problem.

Kommentar: Download Paketgewicht war über 60 MB und es verlangt, dass ich es auf dem System zu installieren, die in meiner Situation nicht möglich ist. Jedenfalls kommentieren die Leute, dass es auf 150 Zeilen beschränkt ist.

In der Zwischenzeit werde ich versuchen, https://code.google.com/p/linqtoexcel/ zu überprüfen, aber alle anderen Ideen sind mehr als willkommen!

EDIT: hätte gerade überprüft, dass LinqToExcel, gleiches Problem wie oben:

Die 'Microsoft.ACE.OLEDB.12.0' Anbieter ist nicht auf dem lokalen Computer registriert.

EDIT2: Letztlich scheint es, dass diese Lösung mein Problem gelöst:

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

+0

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

+0

@Fredou: spielt es keine Tabellen erstellen? Ich muss von einem lesen. Hast du ein Beispiel dafür? –

+0

kann es auch Excel-Datei lesen, überprüfen Sie diese stackoverflow Frage http://StackOverflow.com/Questions/11685204/Reading-Excel-Spreasheet-using-Epplus oder diesen Blog-Eintrag http://blog.fryhard.com/Archive/2010 /10/28/reading-xlsx-files-using-c-and-epplus.aspx – Fredou

Antwort

14

Wenn Sie Daten aus Excel Datei lesen, können Sie EPPlus NuGet Paket, verwenden und

folgenden Code
//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

Danke! Es ist die beste Lösung für mich. Ich habe es nur ein bisschen geändert und ersetzt anhängend mit stringbuilder mit foreach. –

+0

@BlackHat froh, dass es geholfen hat :) –

+1

EPPlus wurde GNU GPL v3 lizenziert. – nyconing

-2

Sind Sie auf dieser Maschine zu entwickeln auch? Wenn nein, würde ich vorschlagen, OpenXml SDK zu verwenden, müssen Sie install it nur auf dem Computer des Entwicklers.

1

Lesen von Excel-Dateien mit OLE-Provider ist nur möglich, wenn MS Jet-Engine (MS Access) installiert ist . Ich habe festgestellt, dass Sie sich entschieden haben, .NET Interop zu API zu verwenden, aber das ist keine gute Idee: es erfordert installiert MS Excel und wird nicht empfohlen, für die Automatisierung auf Servern zu verwenden.

Wenn Sie keine alten (binären) Excel-Formate (xls) unterstützen müssen und das Lesen von XLSX genug ist, empfehle ich die Verwendung der EPPlus-Bibliothek. Es bietet einfache und leistungsstarke API zum Lesen und Schreiben von XLSX-Dateien (und hat viele Beispiele):

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