如何使用C#和Interop.Excel库从现有Excel文件中获取特定元素?

时间:2011-04-27 13:08:55

标签: c# .net excel office-interop

我需要从 Excel 文件中获取数据,以便将它们打印在HTML表格中(使用MVC,无网格视图)并最终将它们存储在数据库中。

表和Excel之间的映射如下:

Excel - >表

第一行 - >表格标题

其他细胞 - >表数据

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

使用此代码,我在 lworkSheet 变量中获取Excel文件的第N 个工作表:

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

假设Excel文件只有一个工作表(N = 1),我可以使用工作表特定属性来获取行,列,单元格和范围。这些属性返回 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()方法返回范围对象!!为了获取单元格中的项目,我必须使用 get_Range(cell_start,cell_end)方法并指定“A1”,“A2”等格式的单元格。

问题:

1)能否识别行和列中的最后一项?

2)如何在不指定范围的情况下获取单元格中的值?

3)任何实现 Excel.Range增量的库? (即(A1 ++)== A2等......)。

4)如果以上都不可行,是否可以通过 OLEDB 轻松阅读Excel?

由于

弗朗西斯

2 个答案:

答案 0 :(得分:1)

没有使用过这个库,所以我只是从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

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

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

答案 1 :(得分:1)

使用OLEDB访问/处理Excel数据比循环遍历.Cells();将一个包含一个SQL语句的表单(选择)放入数据库表或.GetString结果集作为没有任何Fors的HTML表是有吸引力的。

con:如果您的数据包含垃圾,那么高级ADO / OLEDB设施将不会给您干扰的机会。

增加:

在做一些“全部”对于Excel表单的实验时,我偶然发现了一个有趣的事实?关于“$”。也许我不是唯一一个没有意识到这一点的人:

这是我的VBScript测试脚本的输出:

-------------------------------------------------------------------------------
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]启用的更严格方法更多的行。