C#:从xls文档中读取数据

时间:2009-12-16 21:41:31

标签: c# excel parsing

我目前正在开发一个项目,用于遍历excel文档并使用C#将数据插入数据库。

该项目的相关数据是:

  • excel表格顶部有14行,我不在乎。 (有时15,见下面的俄罗斯/西伯利亚)
  • 数据按名称分为2列(日期和值),例如:

第1页

USA                        China                      Russia  
Date         Value         Date         Value         Siberia           
1/1/09       4.3654        1/1/09       2.7456        Date          Value        
1/2/09       3.5545        1/3/09       9.3214        2/5/09        0.2454
1/3/09       3.2322        1/21/09      5.2234        2/6/09        0.5557
  • 我需要获取的名称是“日期”上方直接列出的名称。
  • 我只关心数据库中没有的日期数据。在解析每个列集之前,我将从数据库中获取任何给定名称的最大日期,并在其之前或之前跳过任何内容。
  • 无法保证列将处于常量顺序或具有恒定间距。
  • 我不想要所有名称的数据,而只需要在获取文件之前放在一起的列表中的数据。

我目前的计划是:

  • 对于每一列,如果日期字段位于第16行,则将名称保存为其上方第15行中的值,检查数据库中该名称的最后日期,仅插入日期大于获取日期的数据日期。
  • 如果日期字段位于第17行,则执行相同操作,但在18处开始每行的for循环。
  • 如果名称不在列表中,请跳过该列。如果是,请确保抓住其旁边的列以获取必要的值。

我的问题是:

  • 我目前正在尝试使用Codeplex中的ExcelDataReader(http://www.codeplex.com/ExcelDataReader)。这只是像csv一样的表,这个项目没有。
  • 我不知道有任何其他Excel读者。
  • 据我所知,这个文件的直接FileStream遍历只能逐行,而不是逐列。

对于仍在阅读的人,谢谢你的时间。有关如何进行的任何建议?请确保解决方案可以遍历每列,而不是每行。

另外,请不要担心数据库内容或遍历之前的名称列表。

附录:我最想得到的是某种类型的表格,我可以使用嵌套循环进行遍历,使以列为中心的遍历变得更加容易。因为在纸张顶部附近有很多垃圾(14行以上),所以大多数简单的解决方案都不可行。

6 个答案:

答案 0 :(得分:3)

如果你想在C#中读取excel,我已经非常成功地使用了这个库,它会让你灵活地解析列/行,只是你想要:

我还没有使用过的其他开源库但可能很好:

或者,您可以使用许多优秀的Java库之一,并使用IKVM将其转换为C#程序集:

我已经介绍了如何使用IKVM Java - > C#转换在这里(它真的不像你想象的那么可怕):

答案 1 :(得分:0)

我强烈建议您在使用CSV格式之前保存此Excel文档。您可以使用this code 拥有CSV后,您可以使用该库解析它,也可以为它编写自己的解析器。

答案 2 :(得分:0)

不是你问题的直接答案,而是另一个想法:

您的数据看起来像一个pivot-ish表。我建议将它“解开”到简单的表格中。

示例:

           Russia      USA 
Q1            123       323
Q2            456       321
Q3            567       843

变为:

Quarter Country  Value
Q1      Russia    123       
Q1      USA       323 
Q2      Russia    321
....

如果是这种情况,不确定我是否在你的问题中做到了这一点,而不是使用OleDB驱动程序或任何CSV类型的东西处理数据应该变得更加痛苦。

答案 3 :(得分:0)

您可以通过ODBC驱动程序使用ADO.NET直接访问Excel。有关如何执行此操作的详细信息,请参阅http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx或Google。您可能希望在连接字符串中尝试 HDR =否,因为它的第一行不是真正合适的标题。

我暂时没有这样做,但是我记得它有点“气质”并且需要一些游戏以使列名正确,但它应该有效。试试SELECT * FROM [Sheet1$],看看你得到了什么。

答案 4 :(得分:0)

正如我之前所做的那样,我更喜欢使用OLEDB连接来连接到Excel文档。

顺便说一句,您可以查看以下文章以获取更多信息: http://www.codeproject.com/KB/office/excel_using_oledb.aspx

答案 5 :(得分:0)

SpreadsheetGear for .NET可以按任意顺序加载工作簿并访问任何工作表上的任何单元格。您可以获取单元格的格式化文本(例如“1/1/09”)或基础值(“1/1/09”在Excel或SpreadsheetGear中存储为double 39814.0)。

如果您想亲自试用,可以查看一些实时ASP.NET样本here并下载免费试用here

免责声明:我拥有SpreadsheetGear LLC