2012-03-14 49 views
6

我想從C#中使用Microsoftofts COM Interop的Excel文檔讀取數據。使用C#從組合的Excel列/行讀取數據

到目前爲止,我可以加載文檔並從中讀取一些數據。然而,我需要從兩個不同的列中讀取數據,並將它們輸出爲json(用於jQuery的ajax調用)

我已經制作了一個快速的原型來說明我的Excel文檔的結構,希望它更容易解釋;-)

enter image description here

我的方法被稱爲GetExcelDataByCategory(string categoryName)在類別名稱參數將被用於查找列從獲取數據。因此,即如果我以「Category 2」作爲參數進行調用,則需要獲取C列行中A列相應日期的所有值,因此輸出將會是這樣的:

enter image description here

,然後需要轉換/解析成JSON。

我已經搜索瞭如何實現這一目標的高低,但迄今爲止沒有運氣:-(我知道我可以使用get_Range()方法來選擇一個範圍,但似乎你需要明確地告訴方法哪一行和哪一列獲取數據。即:get_Range(「A1,C1」)

這是我第一次從Excel文檔中讀取數據的經驗,所以我猜想有很多東西需要學習;-)有沒有辦法讓我的第二個圖像輸出?

任何幫助/提示是非常感謝! :-)

在此先感謝。

一切順利,

+0

一個學習Excel對象模型的最佳方法是記錄在Excel宏,可以手動執行手頭的任務。然後,查看宏中生成的VBA代碼,瞭解如何構建代碼以執行類似任務。 – 2012-03-14 14:12:32

回答

4

這是我會做:

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()); 
     } 
    } 
} 

這是代碼,我會用閱讀Excel中。現在它讀取標題中的每一列(由第一行中的任何內容指定),然後讀取所有行。這不完全是你問的(它沒有格式化成JSON),但我認爲這足以讓你超越駝峯。


編輯:看起來像有幾個空白單元格導致問題。 Interop中的空白單元格將爲NULL,因此如果我們嘗試調用Value2或Value2.ToString(),則會出現錯誤,因爲它們不存在。我添加了代碼來檢查以確保單元格在執行任何操作之前不是空的。它可以防止錯誤。

+0

嗨Jetti,非常感謝您的輸入!感謝:)然而,當我嘗試用我的代碼Excel文件(.xls的),我不斷收到異常「無法執行運行時對空引用結合」,當我看看調試器,有此異常遍:「描述:舊格式或無效的類型庫」即使我設置的CurrentCulture微軟建議: -/ – bomortensen 2012-03-14 21:12:05

+0

@bomortensen的問題很可能是因爲您的電池是空的。我在我的答案中添加了一些代碼,在執行任何操作之前,將檢查單元是否爲空。這應該解決問題 – Jetti 2012-03-14 21:38:41

0

爲Excel,解析和創作,你可以使用ExcelDataReader:http://exceldatareader.codeplex.com/

和JSON,你可以使用json.net:http://json.codeplex.com/

兩者都是相當容易使用。只要看看網站。

+0

嗨斯蒂芬,非常感謝! :)我試了一下,但我發現即使結果計數我252 :(被它鬼混了一段時間,我有一個很難找出原因,唯一的例外發生索引越界異常當我嘗試做的GetValue(0)的讀者,我與其他指標試圖藏漢,具有相同的結果.. – bomortensen 2012-03-14 21:14:28