簡體   English   中英

如何使用帶有 Interop.Excel 庫的 C# 從現有 Excel 文件中獲取特定元素?

[英]How to get specific elements from an existing Excel file using C# with the Interop.Excel library?

我需要從Excel文件中獲取數據以將它們打印到 HTML 表中(使用 MVC,沒有 gridview),並最終將它們存儲在數據庫中。

表與Excel的映射如下:

Excel -> 表

第一行 -> 表頭

其他單元格 -> 表格數據

我正在使用Interop.Excel庫,它提供了在 .NET 中操作 Excel 文件的方法。

使用此代碼,我在lworkSheet變量中獲得了 Excel 文件的第 N 個工作表:

var lworkSheet = xlWorkBook.Worksheets.get_Item(N);

假設 Excel 文件只有一個工作表(N = 1),我可以使用工作表特定屬性來獲取Rows、Columns、Cells 和 Range 這些屬性返回類型為Interop.Excel.Range的對象。

問題是行、列和單元格分別返回 Excel 文件中的所有行、列和單元格,而不僅僅是那些填充了數據的行、列和單元格。 因此,為了得到我做的數據(Excel 項目的索引是從 1 開始的):

var lheaders = xlWorkSheet.Rows.get_Item(1);
var lexcelItems = new Excel.Range[xlWorkSheet.Rows.Count, xlWorkSheet.Columns.Count];

for (var i=0; i < xlWorkSheet.Rows.Count; i++)
{
    for(var j=0; j < xlWorkSheet.Columns.Count; j++)
    {
        lexcelItems[i,j] = xlWorkSheet.Cells.get_Item(i+2, j+1);
    }
}

除了循環所有行和列的計算浪費之外,這些解決方案仍然不可接受,因為get_Item()方法返回Range對象! 為了獲取單元格中的項目,我必須使用get_Range(cell_start, cell_end)方法並以“A1”、“A2”等格式指定單元格。

問題:

1)有什么方法可以識別行和列中的最后一項?

2)有什么方法可以在不指定范圍的情況下獲取單元格中的值?

3) 任何實現Excel.Range 增量的庫? (即(A1++)== A2,等等...)。

4)如果以上都不可行,有沒有一種簡單的方法可以用OLEDB讀取 Excel ?

謝謝

弗朗切斯科

沒有使用過這個庫,所以我只是從 MSDN 文檔中做出有根據的猜測。 您在尋找Worksheet.UsedRange嗎?

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._worksheet.usedrange(v=office.11).aspx

擁有Range后,您似乎可以使用Range.Cells屬性(類似於您正在使用的Worksheet.Cells屬性)獲取單個單元格的范圍,然后使用Range.ValueRange.Value2屬性獲取該單元格的值:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range_properties(v=office.11).aspx

要基於 position 而不是行/列名稱指定UsedRange中的單元格,請使用Range.Offset

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range(v=office.11).aspx

使用 OLEDB 訪問/處理 Excel 數據優於循環。Cells(); 將帶有一個 SQL 語句的工作表(選擇)放入數據庫表中,或者將結果集作為 HTML 表而不使用任何 Fors 是很有吸引力的。

缺點:如果您的數據包含垃圾,高級 ADO/OLEDB 設施不會給您干預的機會。

添加:

在對 Excel 表的“全部”含義進行一些實驗時,我偶然發現了一個有趣的事實? 關於“$”。 也許我不是唯一一個不知道這一點的人:

這是我的 VBScript 測試腳本中的 output:

-------------------------------------------------------------------------------
SELECT * FROM [SakAct$]
-------------------------------------------------------------------------------
|actor_id|first_name|last_name|last_update         |
|       3|ED        |CHASE    |2/15/2006 4:34:33 AM|
|       4|JENNIFER  |DAVIS    |2/15/2006 4:34:33 AM|
|       1|PENELOPE  |GUINESS  |2/15/2006 4:34:33 AM|
|       2|NICK      |WAHLBERG |2/15/2006 4:34:33 AM|
|  <NULL>|ED        |CHASE    |2/15/2006 4:34:33 AM|
|       5|          |DAVIS    |2/15/2006 4:34:33 AM|
|       6|PENELOPE  |         |2/15/2006 4:34:33 AM|
|       7|NICK      |WAHLBERG |       <NULL>       |
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
SELECT * FROM [SakAct]
-------------------------------------------------------------------------------
|actor_id|first_name|last_name|last_update         |
|       3|ED        |CHASE    |2/15/2006 4:34:33 AM|
|       4|JENNIFER  |DAVIS    |2/15/2006 4:34:33 AM|
|       1|PENELOPE  |GUINESS  |2/15/2006 4:34:33 AM|
|       2|NICK      |WAHLBERG |2/15/2006 4:34:33 AM|
-------------------------------------------------------------------------------

看起來 [Sheet$] 打開了 Excel Quirks 模式,這將考慮比 [Sheet] 啟用的更嚴格方法更多的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM