Это первая статья из серии «Работа с Excel в Delphi
Видимо, те, кто любит экономить килобайты ОЗУ, могут бросить в меня помидоры или даже хуже, но все же скажу, что интеграция приложений (мегабайты ОЗУ) — большой плюс текущей разработки приложений.
Что ни говори, но время DOS и килобайт ОЗУ прошло. Вряд ли кто-то всерьез задумывается, куда пропали мегабайты с винчестера? А использование функциональных возможностей программ, которые вы не писали, но которые делают что-то лучше в ваших приложениях, — это даже больший прогресс, чем изучение программы в течение года или двух, а затем обнаружение, что время прошло.
Скрыть содержимое 1 Введение 2 1. Как проверить, установлен ли Excel на компьютере пользователя? 3 2. Определите, работает ли Excel 4 3. Как запустить Excel? 5 4. Создайте пустую книгу Excel 6 5. Сохраните книгу и закройте книжную полку Excel 7
Введение
Итак, цель сегодняшней статьи — поделиться с вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспоминаю теперь аварию. Когда я только начинал работать по специальности, меня пригласили написать вычислительную программу для экологов на нашем нефтеперерабатывающем заводе. В принципе, ничего серьезного: программа рассчитывает мощность нагревательной печи и публикует таблицу результатов, которую необходимо распечатать и поместить в толстую папку с отчетами. Конечно, я далеко не пионер в разработке таких приложений, поэтому мне дали взглянуть на аналог будущей программы, работающей под DOS, и распечатывали отчеты на писклявом матричном принтере с 12 иглами. Ну посмотрел, элементарная таблица, расчет немного запутанный, но жить можно — тихонько начал писать. И тут я наткнулся на статью о том, как работать с Excel в Delphi. Вот и я решил попробовать оформить отчет не только на анкете, но и ввести в заблуждение весь курс исчисления с формулами и прочим в Excel .. Надо сказать, что детской радости начальника я не видел отдел подальше :). Люди, проработавшие в DOS всю свою жизнь, видели, как тот же расчет может выглядеть в современных условиях. Теперь при определении технических характеристик любой новой программы всегда есть пункт, который гласит, что программа должна передавать данные в MS Word или MS Excel, в результате цена разработки возрастает, иногда значительно.
Из этого можно сделать простой и однозначный вывод: клиенты готовы жертвовать дополнительные деньги только для того, чтобы все в программе выглядело хорошо. Excel может придать вашему приложению красоту и удобство.
Что ж, чтобы не беспокоиться о том, чтобы каждый раз выполнять одни и те же операции, я разработал небольшой модуль для работы с Excel. В настоящее время я работаю над тем же модулем для другого занятия, но об этом позже. Сегодня основы работы с Excel в Delphi.
1. Как проверить установлен ли Excel на компьютере пользователя?
Создайте новую единицу и включите в использование следующие единицы:
использует ComObj, ActiveX, Variants, Windows, Messages, SysUtils, Classi;
теперь мы объявляем глобальную переменную:
var MyExcel: OleVariant;
Константа (для удобства):
const ExcelApp = ‘Excel.Application’;
И напишем простую функцию:
функция CheckExcelInstall: логическая; var ClassID: TCLSID; Rez: HRESULT; begin // Находим CLSID объекта OLE Rez: = CLSIDFromProgID (PWideChar (WideString (ExcelApp)), ClassID); if Rez = S_OK then // Объект найден Результат: = true иначе Результат: = false; конец;
Или даже короче:
функция CheckExcelInstall: логическая; var ClassID: TCLSID; начало Результат: = CLSIDFromProgID (PWideChar (WideString (ExcelApp)), ClassID) = S_OK; конец;
Если функция CLSIDFromProgID находит CLSID объекта OLE, в результате устанавливается Excel.
Но проверка установленного Excel — это лишь часть необходимых операций перед началом работы. Еще одна важная проверка — проверить, запущен ли уже экземпляр Excel. Если этого не сделать, может возникнуть такая плохая ситуация, когда система логирует .. двадцать процессов Excel и вся оперативная память волшебным образом утекает «в трубу» — за это они могут по ушам надрать. Но мы заботимся о своих ушах. Напишем вторую управляющую функцию.
2. Определяем запущен ли Excel
функция CheckExcelRun: логическая; начать пробовать MyExcel: = GetActiveOleObject (ExcelApp); Результат: = True; кроме Результат: = ложь; конец; конец;
Думаю, в дальнейших объяснениях нет необходимости? Все предельно просто: если есть активный процесс Excel, мы просто получаем ссылку на него и можем использовать Excel в своих корыстных целях. Главное не забыть проверить — может, кто-то забыл закрыть именно этот Excel, но это уже другой момент. Предположим, что Excel находится в нашем полном распоряжении.
3. Как запустить Excel?
Одно дело, когда в нашем распоряжении уже работает Excel, другое дело, когда Excel нужно запускать из Delphi. Напишем функцию запуска Excel:
функция RunExcel (DisableAlerts: boolean = true; Visible: boolean = false): boolean; start try {проверьте, установлен ли Excel} если CheckExcelInstall, затем запустите MyExcel: = CreateOleObject (ExcelApp); // показывать / не показывать системные сообщения Excel (лучше не показывать) MyExcel.Application.EnableEvents: = DisableAlerts; MyExcel.Visible: = Видимый; Результат: = true; end else begin MessageBox (0, «MS Excel не установлен на этом компьютере», «Ошибка», MB_OK + MB_ICONERROR); Результат: = false; конец; кроме Результат: = ложь; конец; конец;
Здесь мы сначала проверяем, установлен ли Excel в принципе, и если он установлен, то запускается. В этом случае мы можем сразу показать окно Excel пользователю: для этого параметр Visible должен иметь значение True.
Я также рекомендую всегда отключать системные сообщения Excel, иначе, когда программа начнет говорить голосом Excel, пользователь может нервничать.
Переходим к следующему этапу работы — созданию рабочей тетради.
4. Создаем пустую рабочую книгу Excel
Чтобы создать пустую книгу, я обычно использую эту функцию:
функция AddWorkBook (AutoRun: boolean = true): boolean; запускать, если CheckExcelRun, затем запускать MyExcel.WorkBooks.Add; Результат: = true; конец иначе, если AutoRun затем запускает RunExcel; MyExcel.WorkBooks.Add; Результат: = true; конец иначе Результат: = false; конец;
Второй (более лаконичный) вариант):
функция AddWorkBook (AutoRun: boolean = true): boolean; Результат запуска: = CheckExcelRun; если (не Результат) и (Автозапуск), то запустите RunExcel; Результат: = CheckExcelRun; конец; если Результат, то MyExcel.WorkBooks.Add; конец;
То есть сразу проверяю, запущен ли Excel, а если не работает, запускаю и добавляю книгу или просто выхожу — все зависит от ситуации.
Здесь, я думаю, следует помнить, что если вы запустите эту функцию, например, пять раз, вы получите пять открытых рабочих книг и будете работать с ними как хотите. Главное, правильно обратиться к нужной книге, а для этого можно воспользоваться следующей функцией:
функция GetAllWorkBooks: TStringList; var i: целое число; начать попытку Результат: = TStringList.Create; для i: = 1 MyExcel.WorkBooks.Count do Result.Add (MyExcel.WorkBooks.Item [i] .FullName), кроме MessageBox (0, ‘Ошибка списка открытых книг’, ‘Ошибка’, MB_OK + MB_ICONERROR); конец; конец;
Функция возвращает список TStringList всех открытых в данный момент книг Excel. Обратите внимание, что, в отличие от Delphi, Excel присваивает первой книге индекс 1, а не 0, как это обычно бывает в Delphi при работе, например, с теми же индексами в ComboBox.
Ну и наконец, поработав с книгами, их нужно закрыть. Точнее сохранить, а потом закрыть.
5. Сохраняем рабочую книгу и закрываем Excel
Чтобы сохранить книгу, я использовал такую функцию:
функция SaveWorkBook (FileName: TFileName; WBIndex: integer): Boolean; начать пробовать MyExcel.WorkBooks.Item [WBIndex] .SaveAs (FileName); если MyExcel.WorkBooks.Item [WBIndex] .Saved, то Результат: = true иначе Результат: = false; кроме Результат: = ложь; конец; конец;
Если у вас открыто 10 книг, вызовите функцию 10 раз, изменив значение параметра WBIndex и имя файла, и все.
И Excel закрывается так:
функция StopExcel: логическая; начать пробовать, если MyExcel.Visible, то MyExcel.Visible: = false; MyExcel. Выход; MyExcel: = Не назначено; Результат: = True; кроме Результат: = ложь; конец; конец;
Вот набор тех основных функций, с которых начинается вся интеграция Excel в приложения, написанные на Delphi.