2015-10-23 18 views
12

Mam problem z odczytem z pliku .xlsx (Excel). Próbowałem użyć:Jak odczytać z 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)); 
} 

, ale jeśli się nie powiodło z powodu connectionString. Więc zaktualizowała linię wsparcia .xlsx:

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

ale otrzymuję:

Dostawca „Microsoft.ACE.OLEDB.12.0” nie jest zarejestrowany na komputerze lokalnym.

(problemem jest to, że nie jestem w stanie zainstalować nowe oprogramowanie na moim komputerze zdalnego testowania, więc nie jestem w stanie go naprawić i trzeba znaleźć inne rozwiązanie.)

zrobić także musisz mieć pewność, że zaimportowane dane będą przechowywane w prosty sposób (jestem programistą dla początkujących), aby umożliwić mi iterację, tj. tworzenie obiektów z danymi wiersza.

Inne podejścia Sprawdziłem:

komentarz: wydaje się prawdopodobnie pracować dla mnie, ale nie obsługuje plików Excel nieznanych wymiarami (losową liczbę wierszy i kolumn).

komentarz: nie obsługuje ustawienia nazwy kolumn z innego rzędu niż pierwsza (w niektórych moich plików Excela, są komentarze w 4-6 pierwszych rzędach, a następnie jest wiersz nagłówków i dane poniżej).

Komentarz: sam problem jak wyżej.

komentarz: pobrane waga paczki był ponad 60MB i to wymaga ode mnie, aby zainstalować go w systemie, co nie jest możliwe w mojej sytuacji. W każdym razie, ludzie komentują, że jest on ograniczony do 150 wierszy.

Tymczasem postaram się sprawdzić https://code.google.com/p/linqtoexcel/, ale wszystkie inne pomysły są mile widziane!

EDIT: Właśnie sprawdziliśmy, że LinqToExcel, sam problem jak wyżej:

Dostawca 'Microsoft.ACE.OLEDB.12.0' nie jest zarejestrowany na komputerze lokalnym.

EDIT2: Ostatecznie, wydaje się, że rozwiązanie to rozwiązać mój problem:

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

+0

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

+0

@Fredou: nie tworzyć arkusze kalkulacyjne? Muszę przeczytać od jednego. Czy masz jakiś tego przykład? –

+0

może również przeczytać plik excel, sprawdź to pytanie stackoverflow http://stackoverflow.com/questions/11685204/reading-excel-spreasheet-using-epplus lub ten wpis na blogu http://blog.fryhard.com/archive/2010 /10/28/reading-xlsx-files-using-c-and-epplus.aspx – Fredou

Odpowiedz

14

Jeśli czytasz dane z Excel pliku, można użyć EPPlus pakiet Nuget i użyć następującego kodu

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

Dzięki! To najlepsze rozwiązanie dla mnie. Po prostu zmieniłem trochę i zastąpiłem dodanie do stringbuildera z foreach. –

+0

@BlackHat cieszę się, że pomógł :) –

+1

EPPlus był licencjonowany GNU GPL v3. – nyconing

-2

Czy rozwijanie na tej maszynie też? Jeśli nie, proponuję użyć OpenXml SDK, musisz tylko install it tylko na komputerze programisty.

1

pliki Reading Excel z dostawcy OLE jest to możliwe tylko wtedy, gdy jest zainstalowany silnik MS Jet (MS Access) . Zauważyłem, że zdecydowałeś się używać interfejsu API do API, ale nie jest to dobry pomysł: wymaga zainstalowanego MS Excel i nie jest zalecany do automatyzacji na serwerach.

Jeśli nie potrzebujesz obsługi starych (binarnych) formatów Excel (xls) i wystarczy odczytać XLSX, polecam użyć biblioteki EPPlus. To zapewnia proste i potężne API zarówno dla odczytu i zapisu plików XLSX (i ma wiele przykładów):

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