繁体   English   中英

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

[英]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吗?

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

要基于 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM