Разберём взаимодействие Delphi с Excel с помощью OLE объектов, на примере программы Statistic.
Исходный код программы можно скачать на странице программы или по этой ссылке: Statistic_source.
В этой программе обращение к Excel происходит, в двух местах. При добавлении нового шаблона формы в программу и при вычислениях.
Разберём как происходит добавление формы в программу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
procedure TFOptions.Button3Click(Sender: TObject); //Предварительная обработка шаблона var DatFile:File of integer; k1,k2,k3,k4,length : integer; IniFile:TIniFile; begin If OpenDialog1.Execute Then BEGIN Main.XLApp:= CreateOleObject('Excel.Application'); Main.XLApp.DisplayAlerts:=false; Main.XLApp.WorkBooks.Open(OpenDialog1.FileName); AssignFile (DatFile,Main.ProgDir+'\dat\ '+ChangeFileExt (ExtractFileName(OpenDialog1.FileName),'.dat')); //* Rewrite(DatFile); for k1:=1 to Main.XLApp.Workbooks[1].WorkSheets.Count do for k2:=1 to Main.XLApp.WorkBooks[1].WorkSheets[k1].UsedRange.Columns.Count do for k3:=1 to Main.XLApp.WorkBooks[1].WorkSheets[k1].UsedRange.Rows.Count do begin write(DatFile,k1); write(DatFile,k2); write(DatFile,k3); k4:=0; if (Main.XLApp.WorkBooks[1].WorkSheets[k1].Cells[k3,k2].Style.Name ='sum') then begin k4:=1; end else if (Main.XLApp.WorkBooks[1].WorkSheets[k1].Cells[k3,k2].Style.Name ='set') then begin k4:=2 end else if (Main.XLApp.WorkBooks[1].WorkSheets[k1].Cells[k3,k2].Style.Name ='mean') then begin k4:=3; end; write(DatFile,k4); end; CloseFile(DatFile) ; Main.XLApp.WorkBooks[1].SaveAs(Main.ProgDir+'\forms\ '+ExtractFileName(OpenDialog1.FileName)); //* Main.XLApp.WorkBooks[1].close; IniFile:=TIniFile.Create(Main.ProgDir+'\Statistic.ini'); length:=IniFile.ReadInteger('ListForms','length',length); IniFile.WriteInteger('ListForms','length',length+1); IniFile.WriteString('ListForms',IntToStr(length+1),ChangeFileExt(ExtractFileName(OpenDialog1.FileName),'')); IniFile.Free; END; UpdateList(); end; |
*Плагин отображающий код не правильно отображает символы \’ поэтому между этими символами я поставил пробел в действительности этот пробел не нужен
Добавление формы происходит при нажатии кнопки. После этого должен открыться экселевский файл, в котором проверяются все заполненые ячейки на наличие ячеек со стилями sum, mean и set. Позиции данных ячеек записываются в файл, для дальнейшего использования.
Рассмотрим код по подробнее:
в этой роцедуре мы будем пользоваться переменной XLApp типа — variant.
Объявленной в классе TMain — unit Statistic_U;
50 51 52 53 54 55 56 57 58 59 60 61 62 |
... public ... ... ... XLApp: variant; ... |
Так же мы объявляем Файл данных. Тип данных будет integer
2 |
var DatFile:File of integer; |
Что бы начать работать с OLE объектами надо для начала создать Com объект:
8 |
Main.XLApp:= CreateOleObject('Excel.Application'); |
Синтаксис этой функции следующий: function CreateOleObject(const ClassName: string): IDispatch;
Тоесть в функции мы указываем имя класса ClassNam в виде string а на выходе функции мы получаем ID данного объекта.
После мы запрещаем показывать различные сообщения пользователю. Устанавливая свойство DisplayAlerts Com объекта в состояние false
9 |
Main.XLApp.DisplayAlerts:=false; |
Дальше мы может открыть файл Excel который мы выбрали в самом начале нашей процедруры:
6 |
If OpenDialog1.Execute Then |
Данную операцию мы проделываем используя метод Open Рабочей книги:
10 |
Main.XLApp.WorkBooks.Open(OpenDialog1.FileName); |
Данный метод имеет следующий ситнтаксис: .Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
Параметры
FileName — имя файла который надо открыть.
UpdateLinks — этот параметр указывает как поступить с ссылками на другие файлы, по умолчанию при открытии пользователю будет задаваться вопрос.
ReadOnly — если указано, как true. То файл будет открыт только для чтения.
Format — если открывается текстовый документ, то в этом параметре можно указать символ разделитель, иначе используется символ разделитель по умолчанию.
Password — если книга защищена от просмотра, то здесь можно указать пароль в виде строки(type String), по умолчанию пользователю будет задан вопрос.
WriteResPassword — Если в файле стоит пароль на запись, а нам надо изменить данные, то здесь можно указать пароль в виде строки. По умолчанию пользователю будет задан вопрос.
IgnoreReadOnlyRecommended — Если файл был сохранён с рекомендацией, только для чтения. То если установить значение True в этот параметр, то пользователю не покажется это сообщение.
Origin — Если открывается текстовый файл, то здесь можно указать место его создания есть три варианта : xlMacintosh, xlWindows, or xlMSDOS. По умолчанию будет использоваться текущая операционная система. Этот параметр помогает правильно определить конец строки.
Delimiter — Здесь можно указать символ разделитель для вкладок. При этом если внести строку то будет использоваться первый символ.
Editable — Данная настройка не работае для версий Microsoft Excel 5.0 и выше. Она определяла состояние видимости документа после открытия.
Notify — если необходимо открыть файл на чтение, но это не возможно то при указании этого значения в true файл добавится в список уведомлений, и когда это станет возможным пользователю отобразится уведомление. При значении false файл не сможет открыться.
Converter — с помощью данного аргумента можно использовать файлы конвертеры.
AddToMru — если значение указано как true книга добавится в список недавно открывавшихся, по умолчанию стотит false.
Local — при использовании значения true сохраняет файлы с языковыми настройками Microsoft Excel (включая параметры панели управления). При указании значения false— сохранение файлов с языковыми настройками Visual Basic. По умалчанию используется сохранение файлов с языковыми настройками Visual Basic.
CorruptLoad — принимает три значения xlNormalLoad (0) рабочая книга открывается «Нормально» , xlRepairFile (1) рабочая книга открывается в режиме восстановления, xlExtractData (2) рабочая книга открывается в режиме извлечения данных.
Дальше мы открываем файл с данными для записи в файл получаемых значений, но так как статья об OLE объектах мы не будем подробно описывать:
11 |
AssignFile (DatFile,Main.ProgDir+'\dat\'+ChangeFileExt (ExtractFileName(OpenDialog1.FileName),'.dat')); |
Для того, что бы пробежать по всему файлу мы используем 3 вложенных цикла:
13 14 15 |
for k1:=1 to Main.XLApp.Workbooks[1].WorkSheets.Count do for k2:=1 to Main.XLApp.WorkBooks[1].WorkSheets[k1].UsedRange.Columns.Count do for k3:=1 to Main.XLApp.WorkBooks[1].WorkSheets[k1].UsedRange.Rows.Count do |
Где Main.XLApp.Workbooks[1].WorkSheets.Count — количество закладок в книге Workbooks[1]. Цифра [1] так как мы только что создали com объект и открыли в нём всего одну книгу.
Main.XLApp.WorkBooks[1].WorkSheets[k1].UsedRange.Columns.Count — кол-во используемых колонок на данной вкладке.
Main.XLApp.WorkBooks[1].WorkSheets[k1].UsedRange.Rows.Count — кол-во используемых строк на данной вкладке.
Дальше смотрим, если стиль данной ячейки соответствует нашим требованиям, то в файл записываются нужные данные
21 |
if (Main.XLApp.WorkBooks[1].WorkSheets[k1].Cells[k3,k2].Style.Name ='sum') then |
26 |
if (Main.XLApp.WorkBooks[1].WorkSheets[k1].Cells[k3,k2].Style.Name ='set') then |
31 |
if (Main.XLApp.WorkBooks[1].WorkSheets[k1].Cells[k3,k2].Style.Name ='mean') then |
После просмотра всего документа на поиск нужных ячеек. Сохраняем шаблон формы в теле программы.
38 |
Main.XLApp.WorkBooks[1].SaveAs(Main.ProgDir+'\forms\'+ExtractFileName(OpenDialog1.FileName)); |
Синтаксис данного метода: .SaveAs ( Filename, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
FileName — имя файла с которым будет сохранён документ.
Password — если мы хотим защитить файл от просмотра, то здесь можно указать пароль на просмотр в виде строки(type String). Длинна пароля не должна быть больше 15 символов.
WriteResPassword — если нужно защитить файл от записи, то здесь можно указать пароль на запись
ReadOnlyRecommended — сделать пометку с рекомендацией открывать этот файл в режиме только для чтения. Данная рекомендация отобразится пользователю при открытии файла.
CreateBackup — создасть резервную копию файла если значение указано true.
AccessMode — возможно указать следующие значения xlExclusive запись будет производится в монопольном режиме, xlNoChange не изменяет Режим доступа, xlShared возможно открытие на запись файла несколькими пользователями одновременно. По умолчанию используется режим xlNoChange и режим доступа не меняется.
ConflictResolution — При режиме общей книги. Иногда возникают конфликты записи когда два пользователя пытаются записать различные данные в одну ячейку. Этот параметр может принимать три значения: xlLocalSessionChanges всегда соглашаться перезаписывать данные, xlOtherSessionChanges — всегда отклонять перезапись данных, xlUserResolution — спросить у пользователя, как разрешить конфликт.
AddToMru — если значение указано как true книга добавится в список недавно открывавшихся, по умолчанию стотит false.
TextCodepage — Игнорируется для всех языков в Microsoft Excel.
TextVisualLayout — Игнорируется для всех языков в Microsoft Excel.
Local — при использовании значения true сохраняет файлы с языковыми настройками Microsoft Excel (включая параметры панели управления). При указании значения false— сохранение файлов с языковыми настройками Visual Basic. По умалчанию используется сохранение файлов с языковыми настройками Visual Basic.
И наконец мы заканчиваем работу с книгой. Закрывая рабочую книгу:
39 |
Main.XLApp.WorkBooks[1].close; |
Данный метод имеет следующий синтаксис .Close(SaveChanges, Filename, RouteWorkbook)
SaveChanges — если данный параметр имеет значение true, то если в документе были изменения, документ будет сохранён при выходе.
Filename — имя с которым будет сохранятся документ.
RouteWorkbook — Если книгу надо направить дальше по маршруту, то это можно сделать этим параметром. true — книга отправится дальше по маршруту, false — книга не будет отправлятся.
Зашкаливающее количество орфографических и пунктуационных ошибок. А за материал спасибо!
Простите. Я как в панк музыке… желание играть превышает умение. Так и у меня желание помочь и чего нибудь объяснить, превышает умение писать текст. Если вы укажете ошибки я обязательно их поправлю, могу даже дать автора. Но понимаю, что это очень сложно трудоёмко и мучительно больно. 🙂