Неожиданные нулевые члены при чтении XLSX с помощью Excel Data Reader (.Net) - PullRequest
1 голос
/ 13 мая 2011

Я читаю XLSX (файл Microsoft Excel XML) с помощью Excel Data Reader из http://exceldatareader.codeplex.com/, и у меня проблема с отсутствующими данными. Данные, находящиеся в исходной электронной таблице Excel, отсутствуют в наборе данных, возвращаемом библиотекой.

Вот немного подробнее о том, что я делаю:

  1. Создана простая тестовая электронная таблица в Excel с одним листом, строкой заголовка и двумя строками данных. Сохраните и закройте Excel.
  2. Откройте файл и передайте поток в метод CreateOpenXmlReader () и верните IExcelDataReader.
  3. Вызвать метод AsDataSet () в IExcelDataReader и вернуть DataSet.
  4. Получить ItemArray из строки 1 таблицы 0.
  5. Цикл по массиву элементов. Обнаружено, что отсутствуют данные (то есть есть члены System.DBNull, где я ожидал членов System.string).

Вот еще немного анализа ...

Я отладил код и заглянул внутрь объектной модели ExcelDataReader. Найден непубличный массив строк с именем «SST», который, по-видимому, содержит данные из электронной таблицы в виде одного линейного (одномерного) массива.

При ближайшем рассмотрении я обнаружил, что искомые данные также отсутствовали в этом массиве. В этих исходных данных элемент вообще не существует.

Я предполагаю, что по какой-то причине парсер не получает данные из OOXML и делает вывод, что ячейка пуста. Глядя на сам OOXML, кажется, что данные разделены по файлам sharedStrings.xml и sheet1.xml, поэтому, возможно, анализатору сложно собрать все это вместе.

Сохранение файла в двоичном формате (от Excel 97 до 2003) и чтение, которое решает проблему, поэтому на первый взгляд кажется, что я подозреваю, что это чтение в формате OOXML.

Предложения

В качестве пробела я конвертирую все файлы в двоичный формат, но это похоже на пометку. Есть ли способ заставить мои файлы Excel, отформатированные в OOXML, правильно читать с помощью Excel Data Reader?

Ответы [ 3 ]

3 голосов
/ 13 мая 2011

Чтобы извлечь электронную таблицу Excel (.xlsx) и загрузить ее в DataSet, вам не нужно связываться с программами чтения XML или отдельной библиотекой, такой как Excel Data Reader.Код для чтения всей электронной таблицы в DataSet довольно прост при использовании обычных функций OleDb в .NET:

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
0 голосов
/ 18 июля 2012

Excel datareader из codeplex используется для чтения данных из файла excel непосредственно в веб-приложении без какого-либо кэширования на сервере. Приведенный выше код действует только тогда, когда мы можем где-то сохранить файл excel. Я столкнулся с аналогичными проблемами с exceldatareader где некоторые данные отсутствуют. Наиболее важно найти какой-либо конкретный тренд. Все я могу видеть, что если все строки имеют значения, то проблем нет. Лучший шанс - конвертировать xlsx в xls.

0 голосов
/ 13 мая 2011

Кажется, есть ошибка в Excel Data Reader (я впервые слышу об этом). Вы должны использовать это? Если нет, то EPPlus будет лучшим выбором.

...