Чтение электронных таблиц Excel с Delphi


Мне нужно читать и записывать в электронные таблицы Excel с помощью Delphi 2010. Ничего особенного. Просто считывание и запись значений из определенных ячеек и диапазонов на разных листах. Необходимо работать без установки Excel и поддерживать Excel 2007.

Некоторые вещи, на которые я смотрел:

  • Я пробовал использовать ADO , который хорошо работает для выбора всего в целом листе, но мне не очень повезло читать определенные ячейки или диапазоны.

  • NativeExcel выглядел многообещающе, но он, похоже, не находится в активном развитии, и они не отвечают на электронные письма.

  • Axolot имеет несколько продуктов. Основной продукт кажется очень функциональным, но стоит дорого. У них есть облегченная версия, но она не поддерживает Delphi 2010.

Какие-нибудь рекомендации? Бесплатно было бы здорово, но я открыт для коммерческого решения, пока оно надежно и хорошо поддерживается.

10 4

10 ответов:

TMS Flexcel-я знаю, что он выглядит как компонент отчетности для Excel (что он делает очень хорошо и является очень удобным инструментом, чтобы иметь в своем инструментарии), но он также включает в себя компоненты для чтения и отображения файлов Excel. Я был очень впечатлен тем, насколько хорошо Адриан Галлеро, кажется, знает API Excel, включая Excel 2007.

Http://www.tmssoftware.com/site/flexcel.asp

Не бесплатно, конечно, но в 75 евро я думаю, что это хорошее соотношение цены и качества.

Мне очень повезло с ADO, при условии, что лист Excel представляет собой довольно прямой макет строки / столбца.

Ключ с использованием ADO, как я обнаружил, заключается в том, чтобы обращаться с листом Excel как с базой данных. Если ваши листы Excel в основном представляют собой прямые макеты строк и столбцов, просто рассматривайте строки как записи базы данных, а столбцы как поля. Перейдите к нужной строке, сначала отыскав определенное значение столбца (поля) (предпочтительно что-то уникальное), а затем прочитайте нужную ячейку в этой строке. строка, ссылающаяся на поле, являющееся именем столбца.

Если ваши листы Excel имеют более свободную форму, то это будет сложнее.

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

I не знаю, почему они не ответили вам, потому что я обновил их пакет по крайней мере пару раз за последние два года. Когда у меня истечет срок действия лицензии, я обязательно ее продлю.

Я бы рекомендовал SMImport / SMExport из http://www.scalabium.com

Майк всегда был очень полезен и быстро реагировал.

Что действительно помогает, так это если у вас есть какой-то контроль над макетом файла excel.

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

Я сделал все через ADO. Вы можете ограничить свой запрос ADO SQL целым листом, именованным диапазоном или любым диапазоном. По моему мнению и опыту, этот метод очень мощный.

Две вещи, которые заставили меня несколько проблем : 1. в зависимости от того, как называются ваши листы, ADO может видеть или не видеть их (опять же, если у вас есть контроль над макетом, отлично !) 2. будьте осторожны с типом данных, который возвращает ADO при чтении данных, т. е. он может отображать числа в виде строк. Это происходит потому, что ADO пытается, IIRC, угадать тип данных на основе первых нескольких строк.

Отказ от ответственности: я никогда не использовал ни один из инструментов, упомянутых выше. АДО сделал трюк для меня, и я чувствую себя более под контролем, так как я написал код для моего фреймворк (очевидно, сохранить часть ADO...).

Брюс, я использую компонент Axolot XLSReadWriteII уже 10 лет. Это было очень хорошо, и их форумы поддержки (в то время как облегченный контент), кажется, контролируются довольно хорошо. Версия XLSReadWriteII2 ослепительно быстра и поддерживает все виды вещей, таких как диаграммы и графики, именованные диапазоны, добавление формул на лету, форматирование ячеек (включая границы и затенение, слияние ячеек, вертикальное и горизонтальное выравнивание, автоматическое определение ширины столбцов и т. д.).

I не обновили до последней версии (мы все еще используем XLSReadWriteII2), потому что мы все еще можем использовать файлы формата Excel XP, и я вообще не использовал XLSMini. Я могу сказать действительно хорошие вещи о полном продукте, хотя; на самом деле, я просто использовал его для нескольких вещей экспорта базы данных на прошлой неделе.

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

Отказ от ответственности: я не имею никакого отношения к Axolot или любому из их сотрудников. Я просто очень счастливый клиент, который узнал о продукте на предыдущей работе и был достаточно впечатлен, чтобы купить его, когда я начал свою текущую работу.

Не беспокойтесь о версии Xlsmini (lite) от Axolot. Я еще не купил ни один из них, но я спросил о поддержке Excel 2007 в начале 2008 года, и Ларс сказал мне, что XLSMini был основан на XLSReadWriteII и что оба будут обновлены с поддержкой Excel 2007 одновременно. XLSReadWriteII имеет поддержку Excel 2007 с апреля 2008 года; XLSMini до сих пор не имеет ее.

С большой удачей я использую Аксолот уже несколько лет. Форум поддержки не совсем переполнен сообщениями, но, может быть, это потому, что он так хорошо работает?

Вы можете использовать строку соединения ADO как http://www.connectionstrings.com/excel чем включить опции (в третьей вкладке строки подключения ado):

Extended Properties=Excel 8.0;HDR=Yes;IMEX=0  

В целях безопасности Microsoft предотвращает модификации (с IMEX=1) http://support.microsoft.com/kb/904953/en Пример SQL (не забудьте про скобки):

SELECT * FROM [Sheet1$]

Единственное, что вы не можете сделать, это удалить: http://support.microsoft.com/kb/257819/en Итак, чтобы удалить строку, сделайте ее пустой! Вы можете также используйте SQL через ADO для экспорта:

YourADOConnection.Execute('SELECT * INTO aSheet IN "'+ExtractFilePath(ParamStr(0))+'Exported.xls" "Excel 8.0;" FROM YourTable');

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

Мои 2cts.