如何使用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吗?

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._worksheet.usedrange(v=office.11​&#x200B;).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​&#x200B;).aspx

要根据位置而不是行/列名称指定UsedRange内的单元格,请使用Range.Offset

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range(v=office.11​&#x200B;).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]启用的更严格的方法。