Чтение таблиц Excel с Delphi - PullRequest
4 голосов
/ 17 марта 2010

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

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

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

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

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

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

Ответы [ 10 ]

7 голосов
/ 17 марта 2010

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

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

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

6 голосов
/ 17 марта 2010

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

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

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

3 голосов
/ 22 марта 2010

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

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

3 голосов
/ 18 марта 2010

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

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

2 голосов
/ 18 марта 2010

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

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

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не связан ни с Аксолотом, ни с их сотрудниками. Я просто очень довольный покупатель, который узнал о продукте на предыдущей работе и был достаточно впечатлен, чтобы купить его, когда я начал свою текущую.

2 голосов
/ 18 марта 2010

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

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

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

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

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

1 голос
/ 09 февраля 2012

Вы можете использовать строку подключения 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');
1 голос
/ 17 марта 2010

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

1 голос
/ 17 марта 2010

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

0 голосов
/ 18 марта 2010

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

My 2cts.

...