[英]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.