Как заполнить DataTable из листа Excel в памяти - PullRequest
1 голос
/ 28 ноября 2008

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

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

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

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

Ответы [ 2 ]

1 голос
/ 25 декабря 2008

Попробуйте пакет гибкости HTML: http://www.codeplex.com/htmlagilitypack

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

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

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

0 голосов
/ 28 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...