使用Excel Data Reader(.Net)读取XLSX时意外的空成员

我正在使用http://exceldatareader.codeplex.com/中的Excel数据读取器读取XLSX(Microsoft Excel XML文件),并且遇到数据丢失的问题。 数据库返回的数据集中缺less源Excel电子表格中的数据。

以下是我正在做的更多细节:

  1. 在Excel中创build一个简单的testing电子表格,其中包含一个表格,一个标题行和两个数据行。 保存并closuresExcel。
  2. 打开文件并将stream传递给CreateOpenXmlReader()方法并取回一个IExcelDataReader。
  3. 调用IExcelDataReader上的AsDataSet()方法并获取一个DataSet。
  4. 从表0的第1行获取ItemArray。
  5. 通过ItemArray循环。 发现有数据丢失(即有System.DBNull成员,我期待System.string成员)。

这里有更多的分析

我debugging了代码,看了一下ExcelDataReader对象模型。 find一个名为“SST”的非公共string数组,它看起来像电子表格一样包含单个线性(一维)数组。

经仔细检查,我发现我所查找的数据也是从这个数组中丢失的。 在这个原始数据中,成员根本不存在。

我的猜测是,由于某种原因,parsing器没有从OOXML中获取数据,并得出结论,单元格是空的。 看着OOXML本身,数据似乎被分割到了sharedStrings.xml和sheet1.xml文件中,所以parsing器可能会把所有这些放在一起。

以二进制格式(Excel 97到2003)保存文件,并在表面上解决这个问题,似乎证实我的怀疑是阅读OOXML格式。

build议?

作为一个停止差距,我将所有的文件转换为二进制格式,但这似乎是一个kludge。 有没有办法让我的OOXML格式的Excel文件正确读取Excel数据读取器?

要检索Excel电子表格(.xlsx)并将其加载到DataSet中,您不必混淆XML阅读器或单独的库(如Excel Data Reader)。 在.NET中使用正常的OleDb函数时,将整个电子表格读取到DataSet中的代码非常简单:

Sub readInMyExcelFile Dim xlsFile as string = "myexcelfile" Dim conStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & xlsFile & ";Extended Properties=""Excel 12.0 Xml;HDR=YES""" Dim dtSheets As New DataTable Dim tmp As String Dim sqlText as Sting Using cn As New OleDbConnection(conStr) cn.Open() dtSheets = cn.GetSchema("Tables") End Using //Dataset for the spreadsheet Dim ds as New DataSet /Loop through the names of all the worksheets in the file. For Each rw as DataRow in dtSheets.Rows tmp = rw("TABLE_NAME") tmp = "[" & tmp & "]" Dim dt as New DataTable Using cn as New OleDbConnection(conStr) cn.Open /Retrieve all the records from the worksheet. sqlText = "SELECT * FROM " & tblName Dim adp As New OleDbDataAdapter(sqlText, cn) /Fill the data table with the all the data. adp.Fill(dt) End Using ds.Tables.Add(dt) Next End Sub 

在Excel数据读取器中似乎有一个错误(这是我第一次听说它)。 你必须使用它吗? 如果没有, EPPlus将是一个更好的select。

excel datareader从codeplex用于直接从web应用程序的excel文件中读取数据,而无需在服务器上进行任何caching。上面的代码只有当我们可以将excel文件存储在某处时才会有效。我遇到了类似的问题,其中一些exceldatareader数据是missing.Most重要我coludntfind任何具体趋势。所有我cud看到,如果所有的行都有值,那么没有问题。 最好的机会是将xlsx转换为xls。