![](/img/trans.png)
[英]How to remove read-only mode from excel file using interop.excel in C#
[英]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
嗎?
擁有Range
后,您似乎可以使用Range.Cells
屬性(類似於您正在使用的Worksheet.Cells
屬性)獲取單個單元格的范圍,然后使用Range.Value
或Range.Value2
屬性獲取該單元格的值:
要基於 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.