Работа с Excel из Delphi. Часть 1

Комментарии

32 комментария(ев)
аватар: Kewa2008
Kewa2008
Дата: СБ, 13/11/2010 - 00:04
Звание: Мастер
Сообщений: 1017

Позновательно!
Цитировать

** Delphi не знает о существовании констант, поэтому чтобы посмотреть их значения, нужно воспользоваться средствами VBA. Эти константы соответственно равны 1, 2 и 3.

Вот из-за такого незнания я постоянно мучился Smile

З.Ы.: Последняя фраза звучит как угроза Laughing out loud

аватар: aka_GRAD
aka_GRAD
Дата: СБ, 13/11/2010 - 00:43
Звание: Посвященный
Сообщений: 499

Круто Wink

аватар: Kastor
Kastor
Дата: СБ, 13/11/2010 - 01:38
Звание: Мастер
Сообщений: 1169

Молодец! Полезный материал!
Мне пару раз приходилось создавать отчет из своей программы в Excel. В принципе, информаци из Библии Делфи хватало. Но более конкретной информации для создания "красивых" отчетов в нете я нашел не много.

аватар: psycho-coder
psycho-coder
Дата: СБ, 13/11/2010 - 01:53
Звание: Советник
Сообщений: 764

Цитировать

Далее давайте кинем на форму одну кнопку TButton и кликнем по ней два раза. При этом будет создан шаблон процедуры на событии OnClick:
procedure TForm1.Button1Click(Sender: TObject);
begin

end;

Мне кажется такие подробности лишние. Ведь можно описать как (например): "Для обработчика кнопки по созданию отчета, напишем следующий код ....". (ИМХО)
В остальном мне понравилась Smile

Цитировать

Мне пару раз приходилось создавать отчет из своей программы в Excel. В принципе, информаци из Библии Делфи хватало. Но более конкретной информации для создания "красивых" отчетов в нете я нашел не много.

Мне тоже приходилось делать экспорт в ексель. В сети нашел какую-то статью как это делать и вычитал от туда, что лучше создать шаблон в екселе и использовать его. Причем в этом шаблоне уже провести форматирование. Т.е. остается добавить только данные. Также узнал, что лучше, как можно больше функций по обработке и форматированию данных в шаблоне сделать через ексель. Короче, все что можно сделать в екселе - делать в екселе. Как то так Smile

аватар: Va-Bank
Va-Bank
Дата: СБ, 13/11/2010 - 03:42
Звание: Гуру
Сообщений: 8234

В общем что лишнее в статье вы говорите. Я уберу чтобы не отвлекало. Я статьи то не умею писать, вообще сложная тема очень. Т.к. можно переписать практически все методы и функции из VBA. Еще сложновато разбить на категории что есть что.
Я в начале тоже делал через шаблоны, но потом понял что их неудобно таскать за собой. Тем более если что-то надо поментяь в исходниках, то придется менять и шаблон. Поэтому я последнее время делал только из самой программы.
Основное я не написал. Работу с ячейками. В общем продолжение следует...

аватар: Belketre
Belketre
Дата: СБ, 13/11/2010 - 11:08
Звание: Мастер
Сообщений: 1887

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

По сабжу:
1. Если показывать Excel после добавления данных в лист, то добавление данных будет работать в несколько раз быстрее.
2. Для еще большего ускорения заполнения листа можно отключить обработку событий: FExcel.Application.EnableEvents:=False перед добавлением данных, но перед показом Excel'я пользователю эту опцию надо обязательно включить обратно

аватар: Rafa
Rafa
Дата: СБ, 13/11/2010 - 13:27
Звание: Наблюдатель
Сообщений: 26

Отличная статья! Спасибо!

аватар: Va-Bank
Va-Bank
Дата: СБ, 13/11/2010 - 15:54
Звание: Гуру
Сообщений: 8234

Цитировать

1. Если показывать Excel после добавления данных в лист, то добавление данных будет работать в несколько раз быстрее.

Чего-то я не понял. Если показывать после добавления данных, то добавление будет быстрее это как? Ведь мы уже добавили данные.
Кстати. Это ты тесты проводил? Я если честно не проверял. Просто не показывал пользователю Excel и все, зачем ему дополнительные окна? Тем более он может по рефлексу закрыть сам Excel и тогда в основной программе будет вызвано исключение и может все пойти не так как задумывалось. Поэтому я предпочитаю не показывать.
Кстати. Когда я в свое время программировал на VBA, то опытным путем было выявлено, что заполнение ячеек происходило в несколько раз быстрее, если сделать заполняему страницу неактивной, т.е. просто перейти на другую страницу. Кстати иногда Excel выдавал ошибку, если делать заполнение на активной странице.
Цитировать
2. Для еще большего ускорения заполнения листа можно отключить обработку событий: FExcel.Application.EnableEvents:=False перед добавлением данных, но перед показом Excel'я пользователю эту опцию надо обязательно включить обратно

Я полностью с этим согласен. Я так и делаю всегда в проектах. Только вот упустил момент. Наверно надо было к каждому методу рекомендации написать, когда стоит включать, а когда отключать, как считаете?

аватар: Belketre
Belketre
Дата: СБ, 13/11/2010 - 19:21
Звание: Мастер
Сообщений: 1887

Я имел ввиду что быстрее будет
1. открыть Excel
2. сформировать отчет
3. показать результат
чем
1. открыть Excel
2. показать пустой лист
3. наблюдать как забавно программа заполняет лист

Еще стоит заметить, что заполнение ячеек по-одной, когда значений много (метод, описанный в бесплатном варианте Библии Delphi), значительно уступает по скорости методу заполнения массива вариантов с последующим его присвоением региону

аватар: Kewa2008
Kewa2008
Дата: СБ, 13/11/2010 - 16:08
Звание: Мастер
Сообщений: 1017

Мне нравилось смотреть на то как Excel "волшебным" образом формирует ответ со всеми краивостями. Это у меня занимало секунд по 5. Когда тестил прогу, каждый раз с удовольствием смотрел Laughing out loud
А потом оказалось, что мой алгоритм можно ускорить в несколько раз Big smile
Ну ессно показывать отчет да и сам Excel нужно когда отчет уже сформирован.

аватар: Kastor
Kastor
Дата: СБ, 13/11/2010 - 23:44
Звание: Мастер
Сообщений: 1169

Цитировать

Мне нравилось смотреть на то как Excel "волшебным" образом формирует ответ со всеми краивостями. Это у меня занимало секунд по 5. Когда тестил прогу, каждый раз с удовольствием смотрел

О, я тебя понимаю. Жмакнул по кнопке и любуешься, как на мониторе твоя программа построчно выводит столбики, ячейки, текст в документ Excel =)

аватар: Lord_of_fear
Lord_of_fear
Дата: СБ, 13/11/2010 - 17:18
Звание: Мастер
Сообщений: 2213

Va-Bank написал(а):

Я статьи то не умею писать

Да ну ты брось! Отлично получилось! Респект Wink

аватар: Va-Bank
Va-Bank
Дата: СБ, 13/11/2010 - 20:17
Звание: Гуру
Сообщений: 8234

Цитировать

Я имел ввиду что быстрее будет
1. открыть Excel
2. сформировать отчет
3. показать результат
чем
1. открыть Excel
2. показать пустой лист
3. наблюдать как забавно программа заполняет лист

Да. Целиком и полностью согласен!

Цитировать

Еще стоит заметить, что заполнение ячеек по-одной, когда значений много (метод, описанный в бесплатном варианте Библии Delphi), значительно уступает по скорости методу заполнения массива вариантов с последующим его присвоением региону

Я читал об этом в инете. Но на всех сайтах всегда находил один и тот же исходник. Вот думаю, может переделать, чтобы не было похоже, модернизировать так сказать. Ну там посмотрим.

аватар: Kewa2008
Kewa2008
Дата: СБ, 13/11/2010 - 20:24
Звание: Мастер
Сообщений: 1017

Цитировать

Но на всех сайтах всегда находил один и тот же исходник.

Я тоже постоянно натыкаюсь на эту проблемму, не только касаемо экспорта в Excel. Так что "Даешь рабочие, оригинальные (и не только) исходники!" Laughing out loud

аватар: Belketre
Belketre
Дата: СБ, 13/11/2010 - 23:26
Звание: Мастер
Сообщений: 1887

И ничего не поделаешь, поколение "копипасты" Laughing out loud

аватар: fedr
fedr
Дата: ВС, 14/11/2010 - 16:18
Звание: Посвященный
Сообщений: 388

кстате а вот с OpenOffice работа идет точно также? только там наверно нужно изменить значения ключей при проверке наличия в системе office...?ибо... файлы то одного типа...xls...

аватар: Belketre
Belketre
Дата: ВС, 14/11/2010 - 23:11
Звание: Мастер
Сообщений: 1887

У OpenOffice формат odc, а не xls, а взаимодействовать с ним, в принципе, аналогично, но все таки довольно много различий

аватар: Va-Bank
Va-Bank
Дата: ВС, 14/11/2010 - 21:20
Звание: Гуру
Сообщений: 8234

По поводу OpenOffice не могу сказать. Я его в галаза даже не видел. Надо будет попробывать на виртуальной машине. Но потом, когда закончу статью полностью, ща пока семейные передряги. Выйду на работу: понедельник - вторник, думаю тогда закончу.

аватар: dust_buster
dust_buster
Дата: ЧТ, 05/01/2012 - 13:16
Звание: Наблюдатель
Сообщений: 1

Статья не окончена. Продолжение следует...
Информация выглядит очень обнадеживающе с точки зрения неопытного новичка, т.е. меня, автору благодарность и уважение.
Когда же будет продолжение?

аватар: Va-Bank
Va-Bank
Дата: ЧТ, 05/01/2012 - 22:09
Звание: Гуру
Сообщений: 8234

Да уже задумался над продолжением, но сейчас халтуры много, авансы понасобирал, надо отрабатывать Laughing out loud

аватар: DrBlack
DrBlack
Дата: ЧТ, 05/01/2012 - 23:14
Звание: Мастер
Сообщений: 1786

Va-Bank, с тебя готовый компанент по работе с екселем, мне как раз в недалеком будещем это понадобится... Smile

аватар: Va-Bank
Va-Bank
Дата: ЧТ, 05/01/2012 - 23:49
Звание: Гуру
Сообщений: 8234

Да ты офигел, какой компонент Smile COMObj тебе в помощь Big smile

аватар: WhiteP
WhiteP
Дата: Втр, 21/02/2012 - 18:56
Звание: Наблюдатель
Сообщений: 89

Мне вот интересно, насколько быстро отработает импорт->обработка->экспорт данных через COM, учитывая, что обработка занимает относительно мало времени? Мне необходимо написать программу, которая будет анализировать довольно большие массивы данных (матрица 65000 x 45) и возвращать результаты анализа обратно в Excel (примерно 1000x10). Сейчас все это реализовано на макросах (не мною) - но это довольно долго, криво и неудобно. Если мне не изменяет память, то работа с Excel через COM - это АХТУНГ как тормознуто. Может я просто не умею готовить COM?.
p.s. Сейчас обложился 500 страничными спецификациями структуры файлов Excel и помаленько ваяю свою библиотеку для работы с xls на низком уровне (люблю велосипеды Smile )

аватар: Va-Bank
Va-Bank
Дата: Втр, 21/02/2012 - 20:13
Звание: Гуру
Сообщений: 8234

Работать через ком можно разными методами. По идее быстрым методом будет, если поместить данные из Excel в массив, а потом уже работать с массивом. Работать напрямую с каждой ячейкой через COM это тормоз еще тот, ты прав.
UPD
А и еще. Как у тебя выполняются макросы? Смотри, у Excel есть одна хитрость/тупость х.з., короче во время выполнения операции на страничке, эту страничку надо убрать в инвиз, либо просто перейти на другую страницу. Т.о. все операции будут выполнятся в "фоновом режиме". Разница в скорости поразительна.

аватар: WhiteP
WhiteP
Дата: Втр, 21/02/2012 - 20:34
Звание: Наблюдатель
Сообщений: 89

Application.ScreenUpdating = False - это программный аналог перехода на другую страницу, ЕМНИП. Да, выигрыш есть.
Но если сравнивать даже с копированием и обработкой огромных массивов в памяти, то импорт-экспорт в Эксель - самая долгая операция, имхо.
Сегодня приду домой, попробую сразу большие range импортировать.

аватар: Kastor
Kastor
Дата: ПТ, 03/05/2013 - 22:41
Звание: Мастер
Сообщений: 1169

Сейчас вот делаю отчет в Excel на Delphi и столкнулся с задачей изменить масштаб страницы со 100% до 60%.

Пробовал сделать как Va-Bank писал:
FSheet.PageSetup.Zoom := 60
Но вылазила ошибка "Невозможно изменить свойство Zoom класса PageSetup". И я офигел немного, когда узнал что ошибка из-за того, что у меня не установлен принтер по умолчанию. Установил принтер (не настоящий, а виртуальный) и ошибка пропала, но масштаб не изменялся.

Так что, может кому пригодится, нашел такое решение:

XLApp := CreateOleObject('Excel.Application');
XLApp.Visible := true;
XLApp.WorkBooks.Add(-4167);

name := 'Название листа';
XLApp.WorkBooks[1].WorkSheets[1].Name := name;

//изменяем масштаб страницы до 60%
XLApp.ActiveWindow.Zoom := 60;

Кажется работает даже если принтер не установлен.

аватар: Va-Bank
Va-Bank
Дата: СБ, 04/05/2013 - 22:10
Звание: Гуру
Сообщений: 8234

Что-то мне подсказывает что это два разных зума. Т.е. один зум изменяет размер листа при выводе на печать, т.е. на листе А4, а другой зум просто меняет масштаб внутри самого Excel, ну просто сколько на экран монитора влезет. Вот и вся разгадка Wink

аватар: Kastor
Kastor
Дата: СБ, 04/05/2013 - 22:15
Звание: Мастер
Сообщений: 1169

Да, скорее всего это так и есть!

Мне как раз второй зум нужен, что бы просто масштаб документа изменить (не для печати).

аватар: Modesty
Modesty
Дата: Втр, 21/05/2013 - 16:28
Звание: Наблюдатель
Сообщений: 32

Собаку съел по работе с импортом и экспортом Excel, Word.
Наиболее интересными вещами в плане реализации для меня показалось вывод текста и таблиц по маркерам в шаблоне, конструктор таблиц в Ворде по маркерам.

Всегда использовал стандартные компоненты c вкладки Servers.

Почему многие избегают их?

аватар: Kastor
Kastor
Дата: Втр, 21/05/2013 - 16:35
Звание: Мастер
Сообщений: 1169

Я даже и не знал, что с их помощью можно с Excel работать.

аватар: angryvitum
angryvitum
Дата: Пнд, 30/06/2014 - 21:56
Звание: Посвященный
Сообщений: 551

Пополню коллекцию...

Количество страниц в размеченной книге Excel

Пример использования:

Номер страницы на листе размеченного документа Excel, которой принадлежит ячейка

Пример использования:

аватар: Va-Bank
Va-Bank
Дата: СБ, 12/07/2014 - 22:16
Звание: Гуру
Сообщений: 8234

Надо бы собраться и дописать статью Puzzled