使用Excel数据读取器(.Net)读取XLSX时出现意外的空成员

时间:2011-05-13 01:29:14

标签: excel openxml

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

以下是我正在做的更详细的信息:

  1. 在Excel中创建了一个简单的测试电子表格,其中包含一个工作表,一个标题行和两个数据行。保存并关闭Excel。
  2. 打开文件并将流传递到CreateOpenXmlReader()方法并返回IExcelDataReader。
  3. 调用IExcelDataReader上的AsDataSet()方法并返回一个DataSet。
  4. 从表0的第1行获取ItemArray。
  5. 循环通过ItemArray。发现有数据缺失(即有System.DBNull成员,我期望System.string成员)。
  6. 这里有更多分析......

    我调试了代码并查看了ExcelDataReader对象模型。找到一个名为“SST”的非公共字符串数组,它似乎包含来自电子表格的数据,作为单个线性(一维)数组。

    仔细观察后,我发现我正在寻找的数据也从这个数组中丢失了。在这个原始数据中,该成员根本不存在。

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

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

    建议吗

    作为一个止损,我将所有文件转换为二进制格式,但这看起来像一个kludge。有没有办法让我的OOXML格式的Excel文件能够使用Excel Data Reader正确读取?

3 个答案:

答案 0 :(得分:3)

要检索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

答案 1 :(得分:0)

似乎Excel Data Reader中存在一个错误(这是我第一次听说过它)。你必须使用它吗?如果没有,EPPlus将是更好的选择。

答案 2 :(得分:0)

来自codeplex的excel datareader用于直接在Web应用程序上从excel文件中读取数据,而不需要在服务器上进行任何缓存。上面的代码只能在我们可以将excel文件存储到某个地方。我遇到了与exceldatareader类似的问题一些数据丢失的地方。最重要的是我可以找到任何具体的趋势。如果所有行都有值,那么我就会看到没有问题。最好的机会是将xlsx转换为xls。