C#:从xls文档读取数据

我目前正在一个项目遍历一个Excel文档,并使用C#插入数据到数据库。

这个项目的相关数据是:

  • Excel表格有14行,我不在乎。 (有时15,下面参见俄罗斯/西伯利亚)
  • 数据按名称分成2列(date和值),例如:

表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 
  • 我需要获得的名称是直接在“date”上面列出的名称。
  • 我只关心数据库中没有的数据。 在parsing每个列集之前,我将从数据库中获取任何给定名称的最大date,并跳过任何或之前的任何内容。
  • 不能保证列将以恒定的顺序或恒定的间距。
  • 我不希望所有名称的数据,而只是在收集文件之前放在一个列表中的数据。

我目前的计划是这样的:

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

我的问题是:

  • 我目前正在尝试使用Codeplex的ExcelDataReader( http://www.codeplex.com/ExcelDataReader )。 这只喜欢类似csv的工作表,这个工程没有。
  • 我不知道任何替代Excel的读者。
  • 据我所知,直接FileStream遍历此文件只能逐行,而不是逐列。

对于还在读书的人,谢谢你的时间。 任何关于如何进行的build议? 请确保解决scheme可以遍历每列,而不是每行。

另外,请不要担心数据库的东西,或者在遍历之前的名字列表。

附录:我最终想要得到的是某种types的表,我可以用一个嵌套的循环遍历,使得以列为中心的遍历更容易。 因为靠近纸张顶部的地方有太多垃圾(14行以上),所以最简单的解决scheme是不可行的。

如果你想从C#的excel中读取,我已经使用这个库取得了巨大的成功,它会给你灵活地parsing列/行,只是你想:

其他开源库我没有使用,但可能是好的:

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

我已经介绍了如何在这里执行IKVM Java – > C#转换(它并不像你想象的那样糟糕):

我强烈build议您在做任何事情之前先将这个Excel文档保存为CSV格式。 你可以使用这个代码你有了一个CSV之后,你可以使用这个库parsing它,或者为它编写你自己的parsing器。

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

你的数据看起来像是一个pivot-ish表。 我build议“unfivoting”到简单的表格。

例:

  Russia USA Q1 123 323 Q2 456 321 Q3 567 843 

变为:

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

如果是这样的话,不知道我是否在你的问题中得到了正确的答案,而不是使用OleDB驱动程序处理数据,或者是哪种CSVtypes的东西应该变得不那么痛苦。

您可以通过ODBC驱动程序直接使用ADO.NET访问Excel。 请参阅http://www.davidhayden.com/blog/dave/archive/2006/05/26/2973.aspx或Google了解如何做到这一点的更多信息。 你可能希望在你的连接string中尝试HDR = No ,因为你的第一行看起来并不合适。

我已经有一段时间没有这样做了,但是我记得它有点“脾气暴躁”,并且需要一些玩弄才能得到正确的列名,但是它应该起作用。 尝试SELECT * FROM [Sheet1$] ,看看你得到什么。

和以前一样,我更喜欢使用OLEDB连接来连接到Excel文档。

顺便说一下,你可以看看下面的文章的更多信息: http : //www.codeproject.com/KB/office/excel_using_oledb.aspx

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

你可以在这里看到一些活的ASP.NET示例,如果你想自己试试,可以在这里下载免费试用版。

免责声明:我自己的SpreadsheetGear LLC