我正在使用http://exceldatareader.codeplex.com/中的Excel数据阅读器阅读XLSX(Microsoft Excel XML文件),并且遇到数据丢失问题。库中返回的数据集中缺少源Excel电子表格中的数据。
以下是我正在做的更详细的信息:
这里有更多分析......
我调试了代码并查看了ExcelDataReader对象模型。找到一个名为“SST”的非公共字符串数组,它似乎包含来自电子表格的数据,作为单个线性(一维)数组。
仔细观察后,我发现我正在寻找的数据也从这个数组中丢失了。在这个原始数据中,该成员根本不存在。
我的猜测是,由于某种原因,解析器没有从OOXML中获取数据并得出该单元格为空的结论。看看OOXML本身,数据似乎是在sharedStrings.xml和sheet1.xml文件中分开的,所以解析器可能很难把所有这些放在一起。
以二进制格式保存文件(Excel 97到2003)并阅读它以解决问题所以表面上似乎证实了我的怀疑是阅读OOXML格式。
建议吗
作为一个止损,我将所有文件转换为二进制格式,但这看起来像一个kludge。有没有办法让我的OOXML格式的Excel文件能够使用Excel Data Reader正确读取?
答案 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)