如何使用C#与Interop.Excel库从现有Excel文件中获取特定元素?
我需要从Excel文件中获取数据,以便将它们打印在HTML表格(使用MVC,无gridview)中,并最终将它们存储在数据库中。
表格和Excel之间的映射如下所示:
Excel – >表
第一行 – >表头
其他单元格 – >表格数据
我正在使用Interop.Excel库,它提供了在.NET中处理Excel文件的方法。
使用这段代码,我可以在lworkSheetvariables中获取Excel文件的第N个工作表:
var lworkSheet = xlWorkBook.Worksheets.get_Item(N);
让我们假设Excel文件只有一个工作表(N = 1),我可以使用工作表特定的属性来获取行,列,单元格和范围 。 这些属性返回Interop.Excel.Rangetypes的对象。
问题是,行,列和单元格分别返回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); } }
除了循环所有行和列的计算浪费之外,这些解决scheme仍然是不可接受的,因为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
属性获得这个单元的价值:
要根据位置而不是行/列名称指定UsedRange
内的单元格,请使用Range.Offset
:
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range(v=office.11​).aspx
使用OLEDB访问/处理Excel数据比循环.Cells(); 将一个带有一个SQL语句的工作表放入一个数据库表中,或者将.GetString作为一个HTML表格作为一个没有任何Fors的结果集是很有吸引力的。
con:如果你的数据包含垃圾,高层的ADO / OLEDB设施不会给你一个干扰的机会。
添加:
在做一些关于Excel工作表的“全部”意义的实验时,我偶然发现了一个有趣的事实? 关于“$”。 也许我不是唯一没有意识到这一点的人:
这是我的VBScripttesting脚本的输出:
------------------------------------------------------------------------------- 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]启用的更严格的方法。