我需要从 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?
由于
弗朗西斯
答案 0 :(得分:1)
没有使用过这个库,所以我只是从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
答案 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]启用的更严格方法更多的行。