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

使用Excel数据读取器(.Net)读取XLSX时出现意外的空成员,excel,openxml,Excel,Openxml,我正在使用Excel数据读取器从中读取一个XLSX(Microsoft Excel XML文件),但遇到数据丢失的问题。库返回的数据集中缺少源Excel电子表格中的数据 以下是我所做工作的更多细节: 在Excel中创建了一个简单的测试电子表格,其中包含一个工作表、一个标题行和两个数据行。保存并关闭Excel 打开文件并将流传递到CreateOpenXmlReader()方法中,然后获取一个IExcelDataReader 在IExcelDataReader上调用AsDataSet()方法并获取数

我正在使用Excel数据读取器从中读取一个XLSX(Microsoft Excel XML文件),但遇到数据丢失的问题。库返回的数据集中缺少源Excel电子表格中的数据

以下是我所做工作的更多细节:

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

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

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

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

    将文件保存为二进制格式(Excel97到2003)并在中读取解决了问题,因此表面上看来,这似乎证实了我对读取OOXML格式的怀疑

    建议?


    作为权宜之计,我正在将所有文件转换为二进制格式,但这似乎是个难题。有什么方法可以让我的OOXML格式的Excel文件通过Excel Data Reader正确读取吗?

    Excel Data Reader中似乎有一个bug(这是我第一次听说)。你一定要用它吗?如果没有,则是更好的选择。

    要检索Excel电子表格(.xlsx)并将其加载到数据集中,您不需要使用XML读取器或像Excel Data Reader这样的单独库。在.NET中使用普通OleDb函数时,将整个电子表格读入数据集的代码非常简单:

    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
    

    codeplex中的excel datareader用于直接在web应用程序上读取excel文件中的数据,而无需在服务器上进行任何缓存。只有当我们可以将excel文件存储到某个位置时,上述代码才有效。我在excel datareader中遇到过类似的问题,其中一些数据丢失。最重要的是,我无法找到任何特定的数据我想,如果所有的行都有值,那么就没有问题了。最好的机会是将xlsx转换为xls