Как заполнить DataTable из листа Excel в памяти

Наш клиент получает файлы Excel в формате HTML Excel. (Это так, как это происходит; никто не может это контролировать.) Затем нам нужно запустить отчет на основе данных в файле. Использование ADO.NET (OleDbReader) приводит к исключению «Внешний файл не в ожидаемом формате».

Если данные конвертируются в обычный формат Excel, они считываются в порядке. Однако на самом деле это не решение, поскольку оно налагает дополнительный шаг, который они должны предпринять, и они не слишком хорошо разбираются в компьютерах в лучшие времена.

Единственное решение, которое я мог придумать, заключалось в том, чтобы использовать автоматизацию Excel для создания новой электронной таблицы, заполнения ее теми же данными и чтения вместо нее. Но ADO.NET, похоже, может читать только из файла на диске. Конечно, я мог бы сохранить файл и удалить его, когда закончу с ним (что, как я убедился, сработает). Но мне не нравится идея возиться с их файловой системой. Итак, мой первый вопрос: есть ли способ заполнить DataTable из рабочего листа Excel в памяти?

Кроме того, мне не нравится весь бизнес с использованием автоматизации; это невероятно медленно. Операция занимает более 30 секунд даже без заполнения DataTable. Таким образом, решение, которое делает его медленнее, не принесет никакой пользы. Это подводит меня ко второму вопросу: есть ли лучший способ выполнить то, что я пытаюсь здесь сделать?


person Community    schedule 28.11.2008    source источник


Ответы (2)


Попробуйте HTML Agility Pack: http://www.codeplex.com/htmlagilitypack.

Я использую его в аналогичном сценарии. В моем случае:...

  • кто-то вставил таблицу из excel в буфер обмена
  • получить текст HTML
  • используйте HTML Agility, чтобы найти теги TABLE, TR, TH, TD
  • а затем построить DataTable из него

В моем случае HTML никогда не сохраняется на диске

person namenlos    schedule 25.12.2008

Я не уверен, что вы подразумеваете под «форматом HTML Excel». Последние версии Excel имеют формат файла XML, и я Excel могу открыть файл HTML, содержащий таблицу, и преобразовать его в рабочий лист, но я не знаю какого-либо конкретного формата HTML Excel.

Что касается решения с использованием автоматизации Excel, то, когда у вас есть рабочий лист в памяти, вы можете получить значения в двумерном массиве объектов, используя свойство Value2, а затем использовать его для создания DataTable. Я не думаю, что это добавит много дополнительных накладных расходов помимо первоначальных накладных расходов на использование автоматизации (которой необходимо создать процесс Excel).

Есть ли способ лучше? Разбор произвольного HTML не является тривиальным, но если файлы, которые вы получаете, имеют согласованный формат, их можно разобрать.

person Joe    schedule 28.11.2008