2012-03-14 16 views
6

Próbuję odczytać dane z dokumentu programu Excel w języku C# przy użyciu Microsoft COM Interop.Odczytywanie danych z połączonych kolumn/wierszy programu Excel przy użyciu C#

Do tej pory mogę załadować dokument i odczytać z niego dane. Jednak muszę odczytać dane z dwóch różnych kolumn i wyświetlić je jako json (dla wywołania ajax jquery)

Zrobiłem szybki prototyp tego, jak mój dokument Excel jest zbudowany z nadzieją, że jest nieco łatwiejsze tłumaczyć ;-)

enter image description here

metoda mam nazywa GetExcelDataByCategory(string categoryName) gdzie parametr categoryname będzie używany do znalezienia które kolumny, aby uzyskać dane.

Tak więc, jeśli wykonuję połączenie z "Kategorią 2" jako parametrem, muszę uzyskać wszystkie wartości w kolumnach kolumny C i odpowiednich dat z kolumny A, więc wynik będzie wyglądać tak:

enter image description here

które następnie musi zostać przekształcona/analizowany w JSON.

Szukałem bardzo szybko, jak to osiągnąć, ale bez powodzenia do tej pory :-(Jestem świadomy, że mogę użyć metody get_Range(), aby wybrać zakres, ale wydaje się, że trzeba jawnie powiedzieć, który wiersz i która kolumna ma pobierać dane. Tzn .: get_Range ("A1, C1")

To jest moje pierwsze doświadczenie z czytaniem danych z dokumentu Excel, więc myślę, że trzeba się jeszcze wiele nauczyć ;-) Czy istnieje sposób na uzyskanie wyniku na moim drugim obrazie?

Każda pomoc/podpowiedź jest bardzo doceniana! :-)

Z góry dziękuję.

Wszystko co najlepsze,

Bo

+0

Jednym z najlepszych sposobów na poznanie modelu obiektów programu Excel jest zapisanie makra w programie Excel, w którym ręcznie wykonywane jest zadanie. Następnie przejrzyj wynikowy kod VBA w makrze, aby uzyskać dobry pomysł na strukturę kodu w celu wykonania podobnego zadania. –

Odpowiedz

4

To jest to, co chciałbym zrobić:

using Excel = Microsoft.Office.Interop.Excel; 

Excel.Application xlApp = new Excel.Application(); 
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("path to book"); 
Excel.Worksheet xlSheet = xlWorkbook.Sheets[1]; // get first sheet 
Excel.Range xlRange = xlSheet.UsedRange; // get the entire used range 

int numberOfRows = xlRange.Rows.Count; 
int numberOfCols = xlRange.Columns.Count; 
List<int> columnsToRead = new List<int>(); 
// find the columns that correspond with the string columnName which 
// would be passed into your method 
for(int i=1; i<=numberOfCols; i++) 
{ 
    if(xlRange.Cells[1,i].Value2 != null) // ADDED IN EDIT 
    { 
     if(xlRange.Cells[1,i].Value2.ToString().Equals(categoryName)) 
     { 
      columnsToRead.Add(i); 
     } 
    } 
} 
List<string> columnValue = new List<string>(); 
// loop over each column number and add results to the list 
foreach(int c in columnsToRead) 
{ 
    // start at 2 because the first row is 1 and the header row 
    for(int r = 2; r <= numberOfRows; r++) 
    { 
     if(xlRange.Cells[r,c].Value2 != null) // ADDED IN EDIT 
     { 
      columnValue.Add(xlRange.Cells[r,c].Value2.ToString()); 
     } 
    } 
} 

Jest to kod użyłbym do zapoznania się z Excel. Teraz odczytuje każdą kolumnę, która ma nagłówek (oznaczony tym, co jest w pierwszym rzędzie), a następnie wszystkie wiersze. Nie jest to dokładnie to, o co prosiłeś (nie formatuje się w JSON), ale myślę, że wystarczy, abyś przeszedł przez garb.


EDYCJA: Wygląda na to, że kilka pustych komórek powoduje problemy. Pusta komórka będzie mieć wartość NULL w Interopie, a zatem otrzymamy błędy, jeśli spróbujemy wywołać wartość Value2 lub Value2.ToString(), ponieważ nie istnieją. Dodałem kod do sprawdzenia, aby upewnić się, że komórka nie ma wartości null, zanim cokolwiek z nią zrobię. Zapobiega to błędom.

+0

Cześć Jetti, wielkie dzięki za twój wkład! Doceniony :) Jednak, gdy próbuję kod z moim plik excela (.xls) Ciągle otrzymuję wyjątek "Nie mogę wykonać wiązania wykonawczego przy odwołaniu zerowym" i kiedy przyjrzę się debuggerowi, jest cały ten wyjątek: "Opis: Stary format lub Niepoprawna biblioteka typów", nawet jeśli ustaw CurrentCulture zgodnie z sugestią Microsoft: -/ – bomortensen

+0

@bomortensen Problem jest najprawdopodobniej dlatego, że twoja komórka jest pusta. Dodałem kod do mojej odpowiedzi, który sprawdzi, czy komórka nie jest pusta, zanim coś z nią zrobię. To powinno naprawić problem – Jetti

0

dla Excel-parsowania i tworzenia można wykorzystać ExcelDataReader: http://exceldatareader.codeplex.com/

i JSON można użyć json.net: http://json.codeplex.com/

Oba są dość łatwy w użyciu. Wystarczy spojrzeć na strony internetowe.

+0

Cześć Stephan, wielkie dzięki! :) Próbowałem go, ale otrzymuję indeks poza granicami wyjątku, nawet jeśli wynik się liczy i 252 :(Już dawno temu wygłupiałem się i mam problem ze znalezieniem przyczyny. kiedy próbuję zrobić GetValue (0) na czytniku Próbowałem również z innymi indeksami, z tym samym wynikiem .. – bomortensen

Powiązane problemy