Тесный контакт между Delphi и Excel [Ван Аньпэн ([email protected]) 2002/4/14] Мощная функция базы данных Delphi, являющаяся отличным RAD, является одной из его наиболее важных функций, но сложный в использовании элемент управления QuickReport часто не может этого сделать. удовлетворить потребности в отчетности базы данных. Если ваш отчет очень сложен или требует гибкости в изменении формата, то использование Excel в качестве сервера отчетов является хорошим выбором. Компонент Excel, предоставляемый Delphi, начиная с версии 5, значительно упрощает применение технологии автоматизации OLE. Однако отсутствие файлов справки всегда было наиболее критикуемым аспектом Delphi, и эти новые компоненты не являются исключением. Объектная модель Excel представляет собой древовидную иерархическую структуру. Корнем является само приложение. WorkBook — это объект атрибута корневого объекта. WorkSheet, используемый для обмена данными, в основном обсуждается в этой статье, является объектом атрибута книги. Подробности см. в файле справки MSOffice VBA. Чтобы управлять Excel в Delphi, необходимо сначала установить соединение с серверной программой, открыть книгу, затем обменяться данными с целевым листом и, наконец, отключиться. Откройте книгу Excel. Наш пример начинается с основной формы с TStringGrid (конечно, необходимо заполнить некоторые данные) и двумя кнопками. Перетащите элемент управления TExcelapplication с вкладки «Серверы» панели управления и поместите его в форму. Сначала задайте для ConnectKind значение ckRunningOrNew, что означает, что если работающий экземпляр Excel может быть обнаружен, установите с ним контакт, в противном случае запустите Excel. Кроме того, если вы хотите, чтобы программа установила контакт с серверной программой сразу после ее запуска, вы можете установить для свойства AutoConnect значение True. Все, что нужно для установления связи с Excel, — это один оператор: Excel . Connect. Возможно, вы заметили, что на вкладке «Серверы» есть несколько других элементов управления Excel. Эти элементы управления можно связать с предыдущим Excel с помощью метода ConnectTo: ExcelWorkbook1.ConnectTo(. Excel . ActiveWorkbook); ExcelWorksheet1.ConnectTo(Excel . ActiveSheet as _Worksheet); ExcelWorksheet2.ConnectTo(Excel . Worksheets.Item['Sheet2'] as _Worksheet); Следует отметить, что перед использованием метода ConnectTo необходимо открыть соответствующую книгу или рабочий лист. Кроме того, эти элементы управления в большинстве случаев не принесут дополнительного удобства, поэтому лучше всего использовать только одно TExcelApplication. После установления контакта с сервером Excel можно создать новую книгу: var wkBook : _WorkBook; LCID : Integer; ... LCID := GetUserDefaultLCID(); wkBook := Excel.Workbooks.Add(EmptyParam, LCID); функция Первый параметр используется для определения шаблона, используемого для новой книги. Вы можете использовать xlWBATChart, xlWBATExcel4IntlMacroSheet, Константа xlWBATExcel4MacroSheet или xlWBATWorksheet, либо это может быть имя существующего файла xls. Здесь EmptyParam — это модуль Variants и определенная переменная, что означает использование универсального шаблона по умолчанию для создания новой книги. Если вы открываете существующий документ xls, вам следует передать имя открываемого файла в качестве первого параметра функции Open: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam , ПустойПарам,ПустойПарам,ПустойПарам,ПустойПарам, EmptyParam,EmptyParam,LCID); Вы должны знать, что все операции с данными в основном предназначены для активного листа. Следующий оператор использует переменную _WorkSheet для представления текущей активной ячейки. Если вы знаете имя листа, порядковый номер можно заменить на имя листа: wkSheet:=wkBook.Sheets[1] as _WorkSheet После завершения обмена данными необходимо сохранить книгу: Excel.ActiveWorkBook.SaveAs; ('МойВыход', ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, EmptyParam, EmptyParam, LCID); или: Excel.ActiveWorkBook.Save(LCID); Наконец, закройте книгу и отключитесь от Excel: wkBook.Close(True, SaveAsName, EmptyParam, LCID); //Excel.Quit; ; Здесь метод Close содержит функцию сохранения. Первый параметр указывает, следует ли сохранять изменения перед закрытием книги. Второй параметр указывает имя файла, который необходимо сохранить. Третий параметр используется для обработки документа несколькими авторами. Во второй строке предлагается завершить работу Excel. Обмен данными с рабочим листом. Входные данные выполняются в определенной ячейке или диапазоне активного рабочего листа. Оба диапазона и ячейки являются свойствами объекта рабочего листа. Ячейки — это коллекция ячеек. Если конкретное местоположение не указано, оно может представлять все ячейки на всем листе. Однако обычно оно используется для ссылки на конкретную ячейку. Например, WS.Cells.Item[1,1]. представляет самую последнюю ячейку. Ячейка A1 в верхнем левом углу. Обратите внимание, что Item является свойством по умолчанию для ячеек в VBA и может быть опущен, но в Delphi такой возможности нет. Чтобы присвоить значение ячейке, необходимо обратиться к ее свойству Value. Само собой разумеется, что это свойство является переменной Variant, например: wkSheet.Cells.Item[1, 1].Value := 'Адресная книга'; Конечно, вы также можете присвоить значение ячейке. Укажите формулу: var AFormula:String …… AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula Описанный выше метод очень прямой и простой, но он очень медленный и не подходит для больших отчетов; Так можно ли последовательно перенести все данные в Excel? Мы можем использовать Range. Этот объект представляет собой область на листе. При перетаскивании мышью это обычно прямоугольная область. Просто укажите позиции ее верхнего левого угла и нижнего правого угла, например Range[ 'C3]. ','J42']. Здесь есть небольшая проблема, поскольку если данные превышают 26 столбцов (например, столбцов 100) или если целевой диапазон необходимо определять на лету, то использовать имена символов для обозначения ячеек сложнее. Напомним, что поскольку «C3» — это метка ячейки, мы, конечно, также можем использовать ячейки, например Range[Cells.Item[1,1], Cells.Item[100,100]]. Вполне возможно, что значение Range должно быть массивом, но вы не должны использовать Array в Delphi для присвоения ему значения! Помните, что в Delphi значение объекта Excel всегда имеет тип Variant. var Datas: Variant; Ir, ic: Integer; …… Datas:= varArrayCreate([1,ir,1,ic],varVariant); //Создаем здесь динамический массив 100*100… //Присвояем значения элементы массива здесь с помощью wkSheet do Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; Следует отметить, что и рабочий лист, и диапазон имеют свойство Cells. Для ясности здесь используется оператор with. Кроме того, Range является направленным. Одномерный массив, созданный с помощью VarArrayCreate, можно назначить только диапазону с одной строкой. Если вы хотите определить значение для диапазона с одним столбцом, вы должны использовать двумерный массив, например. пример: Datas:=VarArrayCreate([1,100,1,1], varVariant); //Создаем динамический массив 100*1. Кстати, Cells.Item[] фактически возвращает объект Range. Получение данных из рабочего листа — это, по сути, процесс, обратный записи данных. Необходимо обратить внимание на то, как определить диапазон данных рабочего листа: var ir, ic : Integer; …… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam). ).Activate ; ir := Excel.ActiveCell.Row ic := Excel.ActiveCell.Column; Здесь умело используется специальная функция ячейки SpecialCells для получения последней ячейки, содержащей данные. Редактирование данных Ниже приведены два примера редактирования данных. var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); В приведенном выше примере копируется содержимое 8 ячеек. Если вы передаете пустой параметр функции копирования, данные в этой области копируются в буфер обмена и могут быть вставлены в другие места с помощью метода Paste позже. var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //Копируем данные с рабочего листа в буфер обмена WS := Excel.Activesheet as _Worksheet; //Изменяем действие Worksheet WS; .Range['C1', 'D4'].Select; WS.Paste(EmptyParam, EmptyParam, lcid); //Вставляем содержимое буфера обмена в новый лист. Параметры формата. Выберите Excel в качестве сервера отчетов главным образом из-за его мощных возможностей форматирования. Сначала мы объединяем ячейки с заголовком «Адресная книга» и отображаем его в центре, а затем меняем шрифт на «официальный сценарий» размером 18 пунктов, выделенный жирным шрифтом: с помощью wkSheet.Range['A1','D1'],Font do Begin Merge(True); //Объединяем ячейки HorizontalAlignment:= xlCenter; Name:='official script';=Bold; Если содержимое ячейки длинное, часть содержимого не будет отображаться. Обычный подход заключается в двойном щелчке по правому краю выбранной области, чтобы ширина каждого столбца автоматически адаптировалась к длине содержимого. В Delphi адаптивной ширины столбца и высоты строки также можно добиться с помощью метода AutoFit. Следует отметить, что этот метод можно использовать только для всей строки и всего столбца, иначе будет выдано сообщение об ошибке отказа выполнения OLE-метода: wkSheet.Columns.EntireColumn.AutoFit; Отчеты в китайском стиле обычно требуют верхних и нижних строк таблицы, и вы можете использовать свойство коллекции Borders. Следует отметить, что объекты коллекций в VBA обычно имеют свойство Item по умолчанию, которое нельзя опустить в Delphi. Свойство Weight используется для определения толщины строк таблицы. .Вес: =xlТонкий; item[xlInsideVertical].Weight:=xlThin; end; Параметры страницы и страницы печати задаются через свойство объекта PageSetUp рабочего листа. В Excel VBA предустановлено более 40 констант бумаги. Следует отметить, что некоторые принтеры поддерживают только некоторые типы бумаги. Атрибут Orientation используется для управления направлением печати, а константа Landscape = 2 указывает на горизонтальную печать. Логические свойства CenterHorizontally и CenterVertically используются для определения того, центрировано ли печатное содержимое по горизонтали или по вертикали. с wkSheet.PageSetUp do Begin PaperSize:=xlPaperA4; //Тип бумаги A4 PRintTitleRows := 'A1:D1'; //Повторяем эту строку/страницу LeftMargin:=18; //0,25" Левое поле RightMargin:=18; // 0,25" будет различаться в зависимости от принтера TopMargin:=36; //0,5" BottomMargin:=36; //0,5" CenterHorizontally:=True; Ориентация:=1; //Горизонтальная печать (альбомная)=2, портрет=1 конец; Чтобы распечатать отчет, вы можете вызвать метод PrintOut рабочего листа. Этот метод, определенный в VBA, имеет 8 дополнительных параметров, первые два используются для указания начальной и конечной страниц, а также количества копий, которые будут напечатаны в третьем формате. Однако в Delphi в конце добавляется параметр LCID, и EmptyParam использовать нельзя. для этого параметра. Аналогично, метод предварительного просмотра печати PrintPreview не имеет параметров в VBA, но требует двух параметров при вызове в Delphi. // wkBook.PrintPreview(True,LCID); //для предварительного просмотра wkSheet.PrintOut(EmptyParam,EmptyParam,1, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID); Если формат отчета. более сложный подход. Лучше всего назвать конкретные диапазоны таблиц, а затем ссылаться на них по имени. Names — это свойство объекта коллекции WorkBook, у которого есть метод Add, который может выполнять эту работу. Var Aname : Excel2000.Name; …… Aname := wkBook.Names.Add('Адресная книга','=Лист1!$A$3:$D$7', EmptyParam, EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam, ПустойПарам,ПустойПарам); Первый параметр функции Add — это определенное имя, а второй параметр — диапазон ячеек, представленный именем. Следует отметить, что тип имени диапазона должен использовать квалификатор. Если используется библиотека типов (D4), квалификатором является Excel_TLB. Кроме того, в именованном диапазоне следует использовать абсолютную ссылку, то есть добавлять символ «$». После того как вы назовете диапазон, вы сможете ссылаться на него по этому имени. Следующая строка кода выделяет содержимое адресной книги жирным шрифтом: AName.RefersToRange.Font.Bold:=True Но, пожалуй, самое удивительное, что вы можете сделать это динамически; модифицируйте макросы Excel в Delphi! Следующий код создает макрос для нашей книги, который записывает время последнего доступа при закрытии книги: var LineNo: целое число; sDate:String; начало CM := WkBook.VBProject.VBComponents.Item('ThisWorkbook'). Codemodule; LineNo := CM.CreateEventProc('BeforeClose', 'Workbook'); SDate:='Дата последнего доступа:'+DateToStr(Date()); CM.InsertLines(LineNo + 1, ' Range("B2").Value = "'+sDate+''"'); Требуется изменить; макрос Добавьте модуль в предыдущий раздел использования: VBIDE2000. Если используется библиотека типов, соответствующий модуль — VBIDE_TLB. Ключом к этому коду является объект CodeModule. К сожалению, в справочном документе Excel VBA нет никаких следов этого объекта, поэтому мы можем искать только в MSDN. Delphi4 и предыдущие версии Delphi4 не предоставляет объект TExcelApplication, и для использования технологии автоматизации OLE необходимо ввести библиотеку типов. Библиотекой типов Excel97 является Excel8.olb. Основное различие между этими двумя методами заключается в методе установления соединения с серверной программой. Ниже представлена программа для управления Excel через библиотеку типов: использует Windows, ComObj, ActiveX, Excel_TLB: _Application: целое число; ; Неизвестно: IUnknown; Результат: HResult; начать LCID: = LOCALE_USER_DEFAULT; Результат: = GetActiveObject(CLASS_Application, nil, Unknown); //Попытаемся захватить запущенный экземпляр программы if (Result = MK_E_UNAVAILABLE) then Excel := CoApplication.Create //Запускаем новый экземпляр программы else Begin {Проверка ошибок во время вызова метода GetActiveObject} OleCheck(Result); (Unknown.QueryInterface(_Application, Excel)); end;…… //Выполняем обработку данных Excel.Visible[LCID] := True; // Excel.DisplayAlerts[LCID] := False; //Отображение диалогового окна подсказки Excel.Quit End; Обычная структура try...Exception здесь не используется, поскольку механизм обработки исключений требует сложных проверок OLE, что сокращает; стоимость Скорость выполнения исключаемой части. Следует отметить, что сопутствующая функция CoApplication и некоторые имена констант, генерируемые разными версиями Delphi, могут отличаться, поэтому вам следует проверить соответствующую библиотеку типов. Перед вызовом метода Quit обязательно освободите все переменные книги и листа, созданные в программе, иначе Excel может находиться в памяти и запускаться (для просмотра можно нажать Ctrl+Alt+Del). Существует небольшая проблема с вызовом GetActiveObject для захвата экземпляра программы. Если Excel находится в свернутом рабочем состоянии, может отображаться только основной кадр программы, а область пользователя не видна. Кроме того, если вы не хотите вводить библиотеку типов, вы также можете использовать отстающую привязку, но это намного медленнее. В следующем примере объявляется переменная Variant для представления приложения Excel: var Excel: Variant; ... try Excel := GetActiveOleObject('Excel.Application'); кроме Excel := CreateOleObject('Excel.Application'); .Видимый := Истина; При использовании отстающей привязки компилятор не проверяет вызываемый метод объекта Excel, а оставляет эти задачи серверной программе для выполнения во время выполнения. Таким образом, большое количество параметров по умолчанию, установленных VBA (часто более дюжины) используются как следует, поэтому этот метод имеет неожиданное преимущество — код краток: var WBk, WS, SheetName: OleVariant ..... WBk := Excel.WorkBooks.Open('C:/Test. хлс') ;WS := WBk.Worksheets.Item['SheetName']; WS.Activate; …… WBk.Close(SaveChanges := True); Помимо медленной работы, если вы хотите использовать константы, определенные в библиотеке типов. , просто Вы можете сделать это только сами: const xlWBATWorksheet = -4167; …… XLApp.Workbooks.Add(xlWBatWorkSheet); Наконец, не забудьте освободить переменные после закрытия Excel: Excel := Unassigned Ниже приведен исходный код, используемый в примере этой статьи, переданный в Delphi6+MSOffice2000. модуль Unit1; интерфейс использует Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоги, OleServer, Excel2000, Grids, StdCtrls; тип TForm1 = class(TForm) Button1: TButton; TStringGrid; Excel: TExcelApplication; процедура FormActivate (Отправитель: процедура TObject); Button1Click (Отправитель: TObject); процедура Write2Xls; процедура CloseExl; процедура NameSheet; процедура AddMacro; процедура Printit; public {публичные декларации } end; ; реализация {$R *.dfm} использует VBIDE2000 var ir,ic:Integer; wkSheet:_WorkSheet; LCID: Целое число; wkBook:_WorkBook; Rows[1].CommaText:='Чжан Сан, мужчина, 25,010-33775566'; Rows[2].CommaText:='Ли Си, мужчина, 47,012-6574906'; Rows[3].CommaText:='Пятница, женщина ,18,061-7557381'; Rows[4].CommaText:='Сун Тао, женщина, 31,3324559'; end; , LCID); wkSheet:=wkBook.Sheets[1] как _WorkSheet; конец процедуры; TForm1.Write2Xls; var Datas:Variant; i,j:Integer; start ir:=StringGrid1.RowCount; ic:=StringGrid1.ColCount; Datas:=varArrayCreate([1,ir,1,ic],varVariant); :=1 до ir do для j:=1 до ic do Datas[i,j]:=StringGrid1.Cells[j-1,i-1]; с помощью wkSheet начать Activate(LCID);Item[1,1].Value:='Адресная книга'; .Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; end; // Excel.Visible[LCID]:=True; Datas:=Unassigned; =Excel.ActiveCell.Column; Datas:=Range[Cells.Item[1,1],Cells.Item[ir,ic]].Value; с StringGrid1 начать ColCount:=ic; RowCount:=ir; ScrollBars:=ssBoth for i:=0; для ir-1 do for j:=0 to ic-1 do Cells[j,i]:=Datas[i+1,j+1] end; Данные: = UnAssigned; конец; процедура TForm1.CloseExl; const SaveAsName = 'test.xls'; начать wkBook.Close (True, SaveAsName, EmptyParam, LCID); Excel.Disconnect; Таблица имен; начало; AName:=wkBook.Names.Add('Адресная книга','=Лист1!$A$3:$D$7',EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam end; .AddFormula; вар AFormula: Начало строки; AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula; процедура TForm1.Formats; начинается с wkSheet.Range['A1','D1'], Font do Begin Merge(True); //Объединяем ячейки HorizontalAlignment:= xlCenter Size:=18; Name:='official script'; FontStyle:=Bold; end; wkSheet.Columns.EntireColumn.AutoFit; с Aname.RefersToRange,Borders начинается HorizontalAlignment:= xlRight; Item[xlEdgeBottom].Weight:=xlMedium; Item[xlEdgeTop].Weight:=xlMedium; Item[xlInsideHorizontal].Weight:=xlThin; item[xlInsideVertical].Weight:=xlThin; конец; процедура TFOrm1.AddMacro; var LineNo: целое число; sDate:String; VBComponents.Item('ThisWorkbook').Codemodule; := CM.CreateEventProc('BeforeClose', 'Workbook'); SDate:='Дата последнего доступа:'+DateToStr(Date()); CM.InsertLines(LineNo + 1, ' Range("B2").Value = "'+sDate+'"'); процедура TForm1.Printit; начинается с wkSheet.PageSetUp do Begin. PaperSize:=xlPaperA4; //Тип бумаги A4 PrintTitleRows := 'A1:D1' //Повторите эту строку/страницу LeftMargin:=18; //0,25" Левое поле RightMargin:=18; //0,25" будет варьироваться в зависимости от принтера. TopMargin:=36; //0,5" BottomMargin:=36; //0,5" CenterHorizontally:=True; Ориентация:=1; //Ландшафт=2, портрет=1 end; wkSheet.PrintOut(EmptyParam,EmptyParam,1, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,LCID); end; процедура TForm1.Button1Click(Отправитель: TObject) ; начать попробовать OpenExl; NameSheet; PrintIt; AddMacro; наконец CloseExl; end; end. Тесный контакт Delphi с Excel [Ван Анпэн ([email protected]) 2002/4/14] Delphi как отличная RAD, мощная функция базы данных. одна из его наиболее важных функций, но сложный в использовании элемент управления QuickReport часто не может удовлетворить потребности отчетов базы данных. Если ваш отчет очень сложен или требует гибкости в изменении формата, то использование Excel в качестве сервера отчетов является хорошим выбором. Компонент Excel, предоставляемый Delphi, начиная с версии 5, значительно упрощает применение технологии автоматизации OLE. Однако отсутствие файлов справки всегда было наиболее критикуемым аспектом Delphi, и эти новые компоненты не являются исключением. Объектная модель Excel представляет собой древовидную иерархическую структуру. Корнем является само приложение. WorkBook — это объект атрибута корневого объекта. WorkSheet, используемый для обмена данными, в основном обсуждается в этой статье, является объектом атрибута книги. Подробности см. в файле справки MSOffice VBA. Чтобы управлять Excel в Delphi, необходимо сначала установить соединение с серверной программой, открыть книгу, затем обменяться данными с целевым листом и, наконец, отключиться. Откройте книгу Excel. Наш пример начинается с основной формы с TStringGrid (конечно, необходимо заполнить некоторые данные) и двумя кнопками. Перетащите элемент управления TExcelApplication с вкладки «Серверы» панели управления и поместите его в форму. Сначала задайте для ConnectKind значение ckRunningOrNew, что означает, что если работающий экземпляр Excel может быть обнаружен, установите с ним контакт, в противном случае запустите Excel. Кроме того, если вы хотите, чтобы программа установила контакт с серверной программой сразу после ее запуска, вы можете установить для свойства AutoConnect значение True. Все, что нужно для установления связи с Excel, — это один оператор: Excel . Connect. Возможно, вы заметили, что на вкладке «Серверы» есть несколько других элементов управления Excel. Эти элементы управления можно связать с предыдущим Excel с помощью метода ConnectTo: ExcelWorkbook1.ConnectTo(. Excel . ActiveWorkbook); ExcelWorksheet1.ConnectTo(Excel . ActiveSheet as _Worksheet); ExcelWorksheet2.ConnectTo(Excel . Worksheets.Item['Sheet2'] as _Worksheet); Следует отметить, что перед использованием метода ConnectTo необходимо открыть соответствующую книгу или рабочий лист. Кроме того, эти элементы управления в большинстве случаев не принесут дополнительного удобства, поэтому лучше всего использовать только одно TExcelApplication. После установления контакта с сервером Excel можно создать новую книгу: var wkBook : _WorkBook; LCID : Integer; ... LCID := GetUserDefaultLCID(); wkBook := Excel.Workbooks.Add(EmptyParam, LCID); функция Первый параметр используется для определения шаблона, используемого для новой книги. Вы можете использовать xlWBATChart, xlWBATExcel4IntlMacroSheet, Константа xlWBATExcel4MacroSheet или xlWBATWorksheet, либо это может быть имя существующего файла xls. Здесь EmptyParam — это модуль Variants и определенная переменная, что означает использование универсального шаблона по умолчанию для создания новой книги. Если вы открываете существующий документ xls, вам следует передать имя открываемого файла в качестве первого параметра функции Open: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam , ПустойПарам,ПустойПарам,ПустойПарам,ПустойПарам, EmptyParam,EmptyParam,LCID); Вы должны знать, что все операции с данными в основном предназначены для активного листа. Следующий оператор использует переменную _WorkSheet для представления текущей активной ячейки. Если вы знаете имя листа, порядковый номер можно заменить на имя листа: wkSheet:=wkBook.Sheets[1] as _WorkSheet После завершения обмена данными необходимо сохранить книгу: Excel.ActiveWorkBook.SaveAs; ('МойВыход', ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, ПустойПарам, EmptyParam, EmptyParam, LCID); или: Excel.ActiveWorkBook.Save(LCID); Наконец, закройте книгу и отключитесь от Excel: wkBook.Close(True, SaveAsName, EmptyParam, LCID); //Excel.Quit; ; Здесь метод Close содержит функцию сохранения. Первый параметр указывает, следует ли сохранять изменения перед закрытием книги. Второй параметр указывает имя файла, который необходимо сохранить. Третий параметр используется для обработки документа несколькими авторами. Во второй строке предлагается завершить работу Excel. Обмен данными с рабочим листом. Входные данные выполняются в определенной ячейке или диапазоне активного рабочего листа. Оба диапазона и ячейки являются свойствами объекта рабочего листа. Ячейки — это коллекция ячеек. Если конкретное местоположение не указано, оно может представлять все ячейки на всем листе. Однако обычно оно используется для ссылки на конкретную ячейку. Например, WS.Cells.Item[1,1]. представляет самую последнюю ячейку. Ячейка A1 в верхнем левом углу. Обратите внимание, что Item является свойством по умолчанию для ячеек в VBA и может быть опущен, но в Delphi такого удобства нет. Чтобы присвоить значение ячейке, необходимо обратиться к ее свойству Value. Само собой разумеется, что это свойство является переменной Variant, например: wkSheet.Cells.Item[1, 1].Value := 'Адресная книга'; Конечно, вы также можете присвоить ячейке значение. Укажите формулу: var AFormula:String …… AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula Описанный выше метод очень прямой и простой, но он очень медленный и не подходит для больших отчетов. Так можно ли последовательно перенести все данные в Excel? Мы можем использовать Range. Этот объект представляет собой область на листе. При перетаскивании мышью это обычно прямоугольная область. Просто укажите позиции ее верхнего левого угла и нижнего правого угла, например Range[ 'C3]. ','J42']. Здесь есть небольшая проблема, поскольку если данные превышают 26 столбцов (например, столбцов 100) или если целевой диапазон необходимо определять на лету, то использовать имена символов для обозначения ячеек сложнее. Напомним, что поскольку «C3» — это метка ячейки, мы, конечно, также можем использовать ячейки, например Range[Cells.Item[1,1], Cells.Item[100,100]]. Вполне возможно, что значение Range должно быть массивом, но вы не должны использовать Array в Delphi для присвоения ему значения! Помните, что в Delphi значение объекта Excel всегда имеет тип Variant. var Datas: Variant; Ir, ic: Integer; …… Datas:= varArrayCreate([1,ir,1,ic],varVariant); //Создаем здесь динамический массив размером 100*100… //Присвояем значения элементы массива здесь с помощью wkSheet do Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; Следует отметить, что и рабочий лист, и диапазон имеют свойство Cells. Для ясности здесь используется оператор with. Кроме того, Range является направленным. Одномерный массив, созданный с помощью VarArrayCreate, можно назначить только диапазону с одной строкой. Если вы хотите определить значение для диапазона с одним столбцом, вы должны использовать двумерный массив, например. пример: Datas:=VarArrayCreate([1,100,1,1], varVariant); //Создаем динамический массив 100*1. Кстати, Cells.Item[] фактически возвращает объект Range. Получение данных из рабочего листа — это, по сути, процесс, обратный записи данных. Необходимо обратить внимание на то, как определить диапазон данных рабочего листа: var ir, ic : Integer; …… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam). ).Активировать ; ir := Excel.ActiveCell.Row ic := Excel.ActiveCell.Column; Здесь умело используется специальная функция ячейки SpecialCells для получения последней ячейки, содержащей данные. Редактирование данных Ниже приведены два примера редактирования данных. var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); В приведенном выше примере копируется содержимое 8 ячеек. Если вы передаете пустой параметр функции копирования, данные в этой области копируются в буфер обмена и могут быть вставлены в другие места с помощью метода Paste позже. var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //Копируем данные с рабочего листа в буфер обмена WS := Excel.Activesheet as _Worksheet; //Изменяем действие Worksheet WS; .Range['C1', 'D4'].Select; WS.Paste(EmptyParam, EmptyParam, lcid); //Вставляем содержимое буфера обмена в новый лист. Параметры формата. Выберите Excel в качестве сервера отчетов главным образом из-за его мощных возможностей форматирования. Сначала мы объединяем ячейки с заголовком «Адресная книга» и отображаем его в центре, а затем меняем шрифт на «официальный сценарий» размером 18 пунктов, выделенный жирным шрифтом: с помощью wkSheet.Range['A1','D1'],Font do Begin Merge(True); //Объединяем ячейки HorizontalAlignment:= xlCenter; Name:='official script';=Bold; Если содержимое ячейки длинное, часть содержимого не будет отображаться. Обычный подход заключается в двойном щелчке по правому краю выбранной области, чтобы ширина каждого столбца автоматически адаптировалась к длине содержимого. В Delphi адаптивной ширины столбца и высоты строки также можно добиться с помощью метода AutoFit. Следует отметить, что этот метод можно использовать только для всей строки и всего столбца, иначе будет выдано сообщение об ошибке отказа выполнения OLE-метода: wkSheet.Columns.EntireColumn.AutoFit; Отчеты в китайском стиле обычно требуют верхних и нижних строк таблицы, и вы можете использовать свойство коллекции Borders. Следует отметить, что объекты коллекций в VBA обычно имеют свойство Item по умолчанию, которое нельзя опустить в Delphi. Свойство Weight используется для определения толщины строк таблицы. .Вес: =xlТонкий; item[xlInsideVertical].Weight:=xlThin; end; настройки страницы и страницы печати задаются через свойство объекта PageSetUp рабочего листа. В Excel VBA предустановлено более 40 констант бумаги. Следует отметить, что некоторые принтеры поддерживают только некоторые типы бумаги. Атрибут Orientation используется для управления направлением печати, а константа Landscape = 2 указывает на горизонтальную печать. Логические свойства CenterHorizontally и CenterVertically используются для определения того, центрировано ли печатное содержимое по горизонтали или по вертикали. с wkSheet.PageSetUp do Begin PaperSize:=xlPaperA4; //Тип бумаги A4 PrintTitleRows := 'A1:D1'; //Повторите эту строку/страницу LeftMargin:=18; //0,25" Левое поле RightMargin:=18; // 0,25" будет различаться в зависимости от принтера TopMargin:=36; //0,5" BottomMargin:=36; //0,5" CenterHorizontally:=True; Orientation:=1; //Горизонтальная печать (альбомная)=2, портрет=1 end; Чтобы распечатать отчет, вы можете вызвать метод PrintOut рабочего листа. Всего в VBA имеется 8 методов. необязательные параметры, первые два. Используется для указания начальной и конечной страниц и количества копий, печатаемых в третьем формате. Однако в Delphi в конце добавляется параметр LCID, и для этого параметра нельзя использовать EmptyParam. Аналогично, метод предварительного просмотра печати PrintPreview не имеет параметров в VBA, но требует двух параметров при вызове в Delphi. // Wkbook.printpreview (True, LCID); Более сложный, лучшим подходом является название конкретных таблиц, а затем ссылаться на них по имени. Имена является свойством объекта коллекции рабочей книги, которая имеет метод добавления, который может выполнять эту работу. Var Aname: Excel2000.name; EmptyParam, EmptyParam); Первым параметром функции добавления является определенное имя, а второй параметр - это диапазон ячейки, представленная именем. Следует отметить, что тип имени диапазона должен использовать квалификацию. Кроме того, названный диапазон должен использовать абсолютную ссылку, то есть добавить символ "$". После того, как вы назовите диапазон, вы можете ссылаться на его имя. Измените макропрограммы Excel в Delphi! Следующий код создает макрос для нашей рабочей книги, который записывает последнее время доступа при закрытии рабочей книги: var Lineno: Integer; Codemodule; SDATE: = «Последний доступ: '+DateToStr (date ()); Макро Добавьте устройство к предыдущему разделу использования: VBIDE2000. Ключом к этому коду является объект Codemodule. Delphi4 и предыдущие версии Delphi4 не предоставляют объект TexcelApplication, а библиотека типа должна быть введена для использования технологии автоматизации OLE. Основное различие между этими двумя методами заключается в том, чтобы установить соединение с серверной программой Неизвестно: iunknown; Неизвестно); (Неизвестно. QueryInterface (_Application, Excel)); True; Стоимость скорости выполнения за исключением части. Следует отметить, что сопроводительное уклейка функции и некоторые постоянные имена, сгенерированные различными версиями Delphi, могут быть разными, поэтому вы должны проверить соответствующую библиотеку типов. Прежде чем вызывать метод брошения, обязательно выпустите все переменные рабочей книги и рабочего листа, созданные в программе, в противном случае Excel может находиться в памяти и запустить (вы можете нажать Ctrl+Alt+Del для просмотра). Существует небольшая проблема с вызовом GetActiveObject для захвата экземпляра программы. Кроме того, если вы не хотите вводить библиотеку типов, вы также можете использовать отставание, но она намного медленнее. Следующий пример объявляет вариант, чтобы представить приложение Excel: var Excel: Variant; .Visible: = true; Когда используется задержка, компилятор не проверяет метод Excel объекта, но оставляет эти задачи в программу сервера для выполнения во время выполнения. используются как должны. XLS '); WS : = Wbk.workshiets.item ['sheetname']; , только вы можете сделать это только самостоятельно: const xlwbatworksheet = -4167; Наконец, не забудьте выпустить переменные после закрытия Excel: Excel: = Unassigned; Unit1; Процедура FormActivate (отправитель: Tobject); Button1click (Sender: Tobject); ; WKSHEET: _WorkSheet; Ряды [1] .commatext: = 'Zhang San, мужчина, 25 010-33775566'; , 18 061-7557381 '; Ряды [4] , Lcid); Tform1.write2xls; :: = 1 к ir do для j: = 1 для ic do DataS [i, j]: = StringGrid1.cells [J-1, I-1]; .Item [3,1], cells.item [ir+2, ic]. DATAS: var warts; = Excel.ActiveCell.column; DataS: = range [cells.item [1,1], Cells.Item [IR, IC] IR-1 для j: = 0 к IC-1 DO ячейки [j, i]: = DataS [i+1, j+1]; DATAS: UNASSINGED; Имени; Aname: = wkbook.names.Add ('Адрестная книга', '= лист1! $ A $ 3: $ D $ 7 .Addformula; Aformula: = '= rand ()'; Font Do Merge (True); FontStyle: = BOLD; Элемент [xlinsidehorizontal]. Vbcomponents.item ('ThisWorkbook'). Codemodule; : = Cm.createeventproc ('beforeclose', 'Workbook'); '+sdate+' ''); Paperize: = XLPAPERA4; Topmargin: = 36; Ориентация: = 1; ; Наконец, форматы;