Поскольку этот вопрос перекликается с предыдущим в плане навыков программной работы с приложениями MSOffice (да и вообще с COM-объектами), попробую объяснить порядок составления своего Delphi-кода на основе VBA. Напоследок отложим непосредственно ответ на сам вопрос.
Во-первых, нужно представлять себе иерархию объектов MS Office-приложения. В Excel она несколько проще, чем в Word.
Основное:
- Application - глобальный объект, из него можно "достучаться" до чего угодно
- Workbooks - коллекция книг,
(Workbook) - каждая из которых содержит
- Worksheets - коллекцию рабочих листов
(Worksheet) - на которых мы и размещаем информацию.
- Cells - ячейки листа. Именно с ними и производится бОльшая часть работы -
размещение данных, объединение/разделение, изменение шрифта и т.п.
Собственно, по большому счету все. Остальное запоминать не обязательно, потому что мощным помощником выступает сам Excel/Word, позволяя записывать все «ручные» действия пользователя в макросы.
Приступим. Первый этап — размещение данных на нужном листе. Здесь пользуемся приведенной ранее иерархией:
var
Excel, Book, Sheet:OleVariant;
i:Integer;
begin
Excel:=CreateOleObject('Excel.Application');
Excel.Visible:=True;
Book:=Excel.Workbooks.Add;
Sheet:=Book.Worksheets[1];
for i := 1 to 5 do
begin
Sheet.Cells[i, 1].Formula:=i;
Sheet.Cells[i, 2].Formula:=Sin(i);
end;
Замечательно то, что большинство свойств принимает тип Variant, то есть — практически любые значения: строки, integer, Double и т.п.
Есть несколько способов задать значение ячейке: Formula
, FormulaR1C1
, Value
, etc. Нужно понимать их различия и пользоваться необходимыми соответственно задаче. Чаще всего используются именно Formula
и FormulaR1C1
Так же полезно понимать, что каждая ячейка на самом деле это объект Range, то есть представляет собой любое, произвольное количество ячеек и работа с несколькими ячейками из состава Range
не отличается от работы с одной ячейкой, полученной через Cells
.
Далее необходимо на лист добавить график. Мы не знаем, как это сделать, да и из-за однократности задачи помнить, где этот график находится в иерархии объектов — расточительно.
Заходим в меню «Вид», нажимаем «Макросы — Запись макроса» и нажимаем «ОК». Переходим на вкладку «Вставка» и добавляем простую гистограмму. Далее выбираем дипазон данных (я взял B1-B5
), изменяем подписи (выбрал A1-A5
) подтверждаем изменения и останавливаем запись макроса («Вид» — «Макросы» — «Остановить запись»). Теперь осталось войти внутрь макроса («Вид» — «Макросы» — «Макросы»-«Изменить»). Должен получиться примерно такой код VBA:
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Range("B1:B5")
ActiveChart.SeriesCollection(1).XValues = "=Лист1!$A$1:$A$5"
И вот тут нам понадобится справка, потому что дальше не все так тривиально. Разберем по строчкам:
ActiveSheet.Shapes.AddChart.Select
— последний метод (Select
) нас не интересует, поскольку он просто выделяет добавленную фигуру на листе. Для программной работы выделение объекта излишне. А вот AddChart
добавляет объект Shape
, а нам нужен объект Chart. VBA дальше идет по пути наименьшего сопротивления — использует свойство Application.ActiveChart (ActiveChart.ChartType = xlColumnClustered
и т.п.). Но нам это не подходит, поскольку (повторюсь) при программной работе с Excel нежелательно использовать «активные элементы», нужно работать именно с тем, что мы добавили. Выясняем, что у объекта Shape есть свойство Chart, именно оно нам нужно. Соответственно, всю дальнейшую работу строим именно на этом, переводя код VBA в Delphi:
Shape:=Sheet.Shapes.AddChart; // повторюсь - Select нам не нужен.
// но при желании потом можно сделать Shape.Select
Shape.Chart.ChartType := xlColumnClustered; // вместо ActiveChart - наш Shape.Chart
Shape.Chart.SetSourceData(Source:=Sheet.Range['B1:B5']);
Shape.Chart.SeriesCollection(1).XValues := Format('=%s!$A$1:$A$5', [Sheet.Name]);
Здесь следует обратить внимание, что мы избегаем называть возможно локализованное имя листа (оно может зависеть от языка Office, пользователь может его переименовать и т.п.). Поэтому берем реальное наименование из свойства Sheet.Name.
Вот и все. Полный получившийся код:
procedure TForm8.btn2Click(Sender: TObject);
var
Excel, Book, Sheet, Shape:OleVariant;
i:Integer;
begin
Excel:=CreateOleObject('Excel.Application');
Excel.Visible:=True;
Book:=Excel.Workbooks.Add;
Sheet:=Book.Worksheets[1];
for i := 1 to 5 do
begin
Sheet.Cells[i, 1].FormulaR1C1:=i;
Sheet.Cells[i, 2].FormulaR1C1:=Sin(i);
end;
Shape:=Sheet.Shapes.AddChart;
Shape.Chart.ChartType := xlColumnClustered;
Shape.Chart.SetSourceData(Source:=Sheet.Range['B1:B5']);
Shape.Chart.SeriesCollection(1).XValues := Format('=%s!$A$1:$A$5', [Sheet.Name]);
end;
В заключение замечание по поводу используемых констант xlColumnClustered
и подобных: можно подключить в uses модуль Excel2010
, ExcelXP
или другой, имеющийся в вашей версии Delphi. Но можно и подставлять значения констант вручную, через поиск в Google (лучше брать ссылки на первоисточник — microsoft). Например, поиск по xlColumnClustered
первой же ссылкой дает перечень констант XlChartType Enumeration
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
На этой странице представлена подборка статей, посвященные работе с Excel в Delphi. Все статьи расположены по порядку изложения материала в блоге, то есть от самых основ работы с Excel в Delphi до выполнения сложных операций, вставки диаграмм в книгу и так далее.
Это вводная статья по работе с excel в delphi, которая поможет вам разобраться с основами по взаимодействия вашего приложения Delphi и Microsoft Excel. В статье рассмотрены следующие вопросы:
- Как в Delphi проверить установлен ли Excel на компьютере пользователя?
- Как определить в Delphi запущен ли Excel?
- Как запустить Excel в Delphi?
- Создаем пустую рабочую книгу Excel в Delphi
- Сохраняем рабочую книгу и закрываем Excel
Excel в Delphi. Методы объекта WorkSheet (лист)
В статье рассмотрены вопросы о том, как можно работать с листами рабочей книги, изменять внешний вид ячеек, копировать таблицу из своего приложения Delphi в открытую рабочую книгу:
- Объекты Microsoft Excel
- Как активировать лист рабочей книги Excel?
- Методы листа книги Excel
- Как рассчитать все открытые в данный момент книги Excel в Delphi?
- Как рассчитать отдельный лист книги Excel в Delphi?
- Как рассчитать диапазон ячеек листа Excel в Delphi?
- Как проверить грамматику на листе Excel в Delphi?
- Как сохранить активный лист рабочей книги Excel в Delphi?
- Как сохранить активный лист рабочей книги Excel в заданном формате?
- Как удалить рабочий лист книги Excel в Delphi?
- Как выделить листа рабочей книги Excel в Delphi?
- Как копировать лист Excel в Delphi?
- Как вставить содержимое буфера обмена на лист Excel в Delphi?
- Как получить диаграмму на листе Excel в Delphi?
- Как переместить рабочий лист книги Excel в Delphi?
Диаграммы Excel в Delphi. Общие сведения
В статье рассмотрен способ добавления диаграммы в лист Excel через объект ChartObjects. План статьи следующий:
- Как скопировать данные из TStringGrid в Excel в Delphi?
- Добавление Как добавлять и редактировать диаграммы Excel в Delphi?
Excel в Delphi. Работа с объектом Range (диапазон)
Статья дает более полное представление о том, как можно работать с данными листа Excel в Delphi, используя объект Range (диапазон). Рассмотрены свойства и методы объекта range. План статьи:
- Что такое Range и как его получить?
- Свойства объекта Excel Range
- Как получить или записать значение в диапазон ячеек Excel в Delphi?
- Как создать диапазон ячеек Excel в Delphi и получить номер первого столбца диапазона?
- Как добавить комментарий к диапазону ячеек Excel в Delphi?
- Как получить полный адрес диапазона ячеек Excel в Delphi?
- Методы объекта Excel Range
- Как проверить грамматику в диапазоне ячеек Excel в Delphi?
- Как вывести окно предварительного просмотра печати Excel в Delphi?
- Как использовать автоматическое заполнение ячеек диапазона Excel в Delphi?
- Как подобрать ширину ячеек Excel в Delphi?
- Как объединить ячейки диапазона Excel в Delphi?
Excel в Delphi. Как изменить внешний вид ячеек?
В статье рассматриваются вопросы оформления ячеек таблицы Excel в Delphi:
- Как добраться до конкретной границы ячейки Excel в Delphi?
- Как изменить внешний вид границы ячейки или диапазона Excel в Delphi?
- Как сделать заливку цветом ячеек Excel в Delphi?
- Как изменить шрифт в ячейках Excel в Delphi?
Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
В статье рассматривается достаточно нетривиальный вопрос: как добраться до диаграммы Excel, внедренной в документ Word и работать с ней в Delphi? Статья состоит из трех частей:
- Азы работы с MS Word в Delphi
- Как работать с объектом Excel, внедренном в документ Word
- Как работать с документом Word, внедренным в Excel
Быстрая обработка данных Excel в Delphi
Эта статья раскрывает вопросы, касающиеся быстрой обработки данных при работе с Excel в Delphi. Одной из проблем, с которой сталкиваются начинающие разработчики, является то, что рассмотренные в предыдущих статьях методы чтения/записи данных в Excel работают очень медленно при большом количестве данных. Статья позволяет понять то, как сократить время операций при работе с Excel в Delphi в несколько раз, используя вариантные массивы и библиотеку XLSReadWrite.
- Чтение данных из Excel в Delphi
- Запись данных в Excel в Delphi
- Пример с XLSReadWrite
Пост-ответ. Работа с примечаниями в Excel
В статье рассматривается то, как, используя Delphi вставлять и редактировать примечания в ячейках Excel. План статьи:
- Добавление/удаление примечаний
- Работа с объектом Comment. Украшаем примечания
Excel в Delphi. Работа со свойствами документа
Статья раскрывает вопросы изменения свойств документа Excel в Delphi и состоит из трех частей:
- Свойства рабочей книги (WorkBook)
- Пример чтения свойств документа
- Запись нового свойства книги Excel
Создаем свои контролы на ленте Microsoft Office
Небольшая заметка о том, как получить доступ у ленте Excel и добавить на неё свою кнопку.
Эти и другие статьи, посвященные работе с Excel в Delphi вы всегда сможете найти в блоге по тегу Excel в Delphi
Книжная полка
Название:Разработка приложений Microsoft Office 2007 в Delphi Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi. |
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Создание документа
Внимание!!! Всегда когда создаете объект интерфейса, заключайте процедуру создания в модуль обработки ошибок:
try
создаем интерфейс;
формируем отчет;
освобождаем интерфейс;
Except
обрабатываем ошибки;
освобождаем интерфейс;
end;
Далее идет краткий справочник по основным функциям работы с EXCEL
try
// создаем обьект EXCEL
excel := CreateOleObject(‘Excel.Application’);
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// создаем новый документ рабочую книгу
excel.WorkBooks.Add;
// или загружаем его из директории с программой
excel.WorkBooks.Open(GetCurrentDir() + ‘отчет.xls’);
{ GetCurrentDir()- возвращает путь к директории с программой}
// Делаем его видимым данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
excel.Visible := true;
//задаем тип формул в формате R1C1
excel.Application.ReferenceStyle := xlR1C1;
// задаем тип формул в формате A1
excel.Application.ReferenceStyle := xlA1;
// Задаем название первому и второму листу
excel.WorkBooks[1].WorkSheets[1].Name := ‘Отчет1’;
excel.WorkBooks[1].WorkSheets[2].Name := ‘Отчет2’;
//задаем формат числа для первой и четвертой колонки формат числа
excel.WorkBooks[1].WorkSheets[1].Columns[1].NumberFormat := ‘0,00’;
excel.WorkBooks[1].WorkSheets[1].Columns[4].NumberFormat := ‘0,0’;
// задаем ширину первой и второй колонки
excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 10;
excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 20;
// задаем начертание, цвет, размер и тип шрифта для первого ряда
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Bold := True; //жирный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Color := clRed; // цвет красный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Size := 12; //размер 12
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Name := ‘Times New Roman’; //шрифт
//присваиваем ячейке 1,4 и 2,4 значения (1 — ряд, 4 — колонка)
excel.WorkBooks[1].WorkSheets[1].Cells[1, 4] := ‘А так можно внести значение в ячейку’;
excel.WorkBooks[1].WorkSheets[1].Cells[2, 4] := ‘А так можно внести значение в ячейку’;
//ввод в ячейку ‘A12’ формулы ‘=b5+c4’
excel.WorkBooks[1].WorkSheets[1].Range[‘A12′].Formula:=’=b5+c4’;
// Выравнивам первый ряд по центру по вертикали
excel.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := xlCenter;
// Выравнивам первый ряд по центру по горизонтали
excel.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := xlCenter;
// Выравнивам в ячейке по левому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 2].HorizontalAlignment := xlLeft;
// Выравнивам в ячейке по правому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 4].HorizontalAlignment := xlRight;
// Обьединяем ячейки ‘A1:A8’
excel.WorkBooks[1].WorkSheets[1].Range[‘A1:A8’].Merge;
// Поворачиваем слова под углом 90 градусов для второго ряда
excel.WorkBooks[1].WorkSheets[1].Rows[2].Orientation := 90;
// Поворачиваем слова под углом 45 градусов для диапазона ячеек ‘B3:D3’
excel.WorkBooks[1].WorkSheets[1].Range[‘B3:D3’].Orientation := 45;
//рисуем границы выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlMedium;// толщина линии
//рисуем границы выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlMedium;
//рисуем границы выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;
//рисуем границы выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;
//рисуем границы выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;
//рисуем границы выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlMedium;
//автозаполнение выделенного диапазона
//для примера заполним область ячеек ‘A10:C10’ словом ‘привет’
//и размножим его вниз еще на пять ячеек ‘A10:C15’
excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10′].Value:=’привет’;
//выделяем диапазон ячеек ‘A10:C10’
excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10’].Select;
//автозаполняем (копируем) выделенным диапазоном область ячеек ‘A10:C15’
excel.selection.autofill(excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C15’],xlFillDefault);
//отключаем предупреждения, чтобы не задавал вопросов о сохранении и других
excel.DisplayAlerts := False;
//сохраняем документ в формате Excel 97-2003
excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xls’,xlExcel8);
//сохраняем документ в текущем формате Excel 2007
excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xlsx’);
//закроем все книги
excel.Workbooks.Close;
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
excel := Unassigned;
Except
//обрабатываем ошибки
showmessage(‘Внимание! Произошла ошибка при создании MS Excel приложения’);
//закроем все книги
excel.Workbooks.Close;
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
excel := Unassigned;
end;
end;
При работе с листом Excel мы можем использовать следующие варианты:
— работать с областью Range[‘B3:D3’];
— работать с ячейкой Cells[2, 4] где 2 — ряд, 4 — колонка;
— работать с рядами Rows[1] или с диапазоном рядов Rows[‘1:5’];
— работать с колонками Columns[1] или диапазоном колонок Columns[‘A:I’];
Range[‘A1’] и Cells[1, 1] обозначают одно и тоже.
После сформирования документа или возникновении ошибки вы должны правильно освободить интерфейсы.
Иначе при закрытии Excel он скрывается с экрана, но если открыть диспетчер задач он продолжает там висеть и если данный процесс не завершить , то при каждом новом запуске их будет накапливаться больше и больше, пока компьютер не начнет виснуть. Поэтому обязательно необходимо освобождать все интерфейсы с вязанные с Excel с его книгами и листами.
Например так:
//закроем все книги
excel.Workbooks.Close;
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
sheet:=Unassigned; //интерфейс листа если он был создан
WorkBook := Unassigned;//интерфейс рабочей книги если он был создан
excel := Unassigned;//интерфейс самого предложения если он был создан
end;
Ниже привожу пример вывода в Excel из Delphi таблицы умножения с подробными комментариями.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, comobj, StdCtrls, Excel_TLB;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
excel: variant; // Переменная в которой создаётся объект EXCEL
MyData: variant; // Переменная в которой формируется таблица умножения
i,j:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
try
// Обьект EXCEL
excel := CreateOleObject(‘Excel.Application’);
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// новый документ
excel.WorkBooks.Add;
//объявляем вариантный массив
MyData := VarArrayCreate([1,9,1,9],varVariant);
for I := 1 to 9 do
for J := 1 to 9 do
MyData[i,j]:=i*j;
// Обьединяем ячейки ‘A1:I1’
excel.WorkBooks[1].WorkSheets[1].Range[‘A1:I1’].Merge;
//Пишем заголовок
excel.WorkBooks[1].WorkSheets[1].Range[‘A1′].Value:=’Таблица умножения’;
// Выравнивам заголовок по центру
excel.WorkBooks[1].WorkSheets[1].Range[‘A1’].HorizontalAlignment := xlCenter;
// задаем ширину колонок с A по I
excel.WorkBooks[1].WorkSheets[1].Columns[‘A:I’].ColumnWidth := 3;
//выделяем область таблицы умножения [‘A2:I10’] и рисуем границы
excel.WorkBooks[1].WorkSheets[1].Range[‘A2:I10’].select;
//рисуем границы выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlThin;// толщина линии
//рисуем границы выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlThin;
//рисуем границы выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlThin;
//рисуем границы выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlThin;
//рисуем границы выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlThin;
//рисуем границы выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlThin;
//присваиваем диапазону [‘A2:I10’] значения вариантного массива MyData это значительно ускоряет работу, нежели вывод по //ячеечно
excel.WorkBooks[1].WorkSheets[1].Range[‘A2:I10’].Value:=MyData;
// Делаем его видимым
excel.Visible := true;
//освобождаем интерфейсы
MyData:= Unassigned;
excel := Unassigned;
Except
showmessage(‘Внимание! Произошла ошибка при создании MS Excel приложения’);
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
MyData:= Unassigned;
excel := Unassigned;
end;
end;
end.
При написании статьи использовался материал с сайта http://vlad2000.h1.ru/Frames/Statyi/page_14.html
Для того, чтобы получить отчет в формате Excel из Delphi
постройте сначала прототип таблицы в самом Excel. Полученную
таблицу можно в дальнейшем использовать, как шаблон. Например,
Вы будете уже знать ширину колонок, применяемые шрифты и то,
как она будет выглядеть при печати.
Допустим Вам необходимо построить отчет в формате Excel следующего
вида (пусть количество колонок и столбцов будет фиксированным):
Наименование продукта |
Приход |
Расход |
Дорожные велосипеды |
121 |
11 |
Спортивные велосипеды |
75 |
55 |
Всего: |
196 |
66 |
Обратите внимание, что все строчки в таблице центрированы,
а самая верхняя написана «жирным» шрифтом. В таблице
так же содержатся ячейки в которых подсчитываются суммы по
приходу и расходу. Ширина для колонок — 187, 94, 70 пиксель.
1. Установим ширину колонок:
//Выбираем каждую колонку целиком
Sheet.Columns['1:1'].ColumnWidth := 121;
Sheet.Columns['2:2'].ColumnWidth := 94;
Sheet.Columns['3:3'].ColumnWidth := 70;
2. Аналогичным образом можно было бы поступить для центрирования
текста. Но представте себе, что в дальнейшем к данной таблице
добавится что-то справа или снизу, а центрирование строк текста
нежелательно. Поступим иначе. В Excel запишем макрос (выделим
интересующие нас ячейки и зададим соответствующий стиль —
«центрирование»). В результате получим примерно
следующее:
Range("A1:C4").Select With Selection HorizontalAlignment = xlCenter VerticalAlignment = xlBottom WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With
В полученном макросе нас интересуют только первая и третья
строка. Вот так они будут выглядеть в Delphi:
//Выбираем диапазон ячеек "A1:C4" Sheet.Range['A1:C4'].Select; //Задаем центрирование текста для выбранных ячеек exl.Selection.HorizontalAlignment := xlCenter;
Обратите внимание на различие в синтаксисе. Во-первых,
двойные кавычки заменились одинарными, во-вторых, круглые
скобки — на квадратные, в-третьих знак «=» поменялся
на «:=». Т.е. получающийся код должен удовлетворять
требованиям синтаксиса того языка, на котором пишется программа.
3. Аналогичным способом для верхних трех ячеек можно задать
выделение жирным шрифтом. Добавим следующий код:
//Выбираем диапазон ячеек "A1:С1"
Sheet.Range['A1:C1'].Select;
exl.Selection.Font.Bold := True;
4. Подставляем значения:
Sheet.Cells(1,1) := 'Наименование продукта';
Sheet.Cells(1,2) := 'Приход';
Sheet.Cells(1,3) := 'Расход';
Sheet.Cells(2,1) := 'Дорожные велосипеды';
Sheet.Cells(2,2) := 121;
Sheet.Cells(2,3) := 11;
Sheet.Cells(3,1) := 'Спортивные велосипеды';
Sheet.Cells(2,2) := 75;
Sheet.Cells(2,3) := 55;
Sheet.Cells(3,1) := 'Итого:';
5. Для итоговых сумм опять воспользуемся макросом. Запишем
макрос для подсчета суммы по приходу товара (ячейка B4):
Range("B4").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"
Обратим внимание еще на одну особенность. В строке для редактирования
Excel формула выглядит иначе:
=СУММ(B2:B3) (для Русской версии
Excel).
Итак, следующие строки программы могут выглядеть так:
Sheet.Range['B4'].Select;
exl.ActiveCell.FormulaR1C1 := '=SUM(R[-2]C:R[-1]C)';
Sheet.Range['C4'].Select;
exl.ActiveCell.FormulaR1C1 := '=SUM(R[-2]C:R[-1]C)';
Существует еще несколько вариантов подстановки формулы в
ячейки. Например, скопировав формулу в одной ячейке, мы могли
бы ее вставить в другую(гие). Можно применить и следующий
код:
Sheet.Cells(3,2) := '=SUM(R[-2]C:R[-1]C)';
Sheet.Cells(3,3) := '=SUM(R[-2]C:R[-1]C)';
6. И в заключение обведем ячейки таблицы одной толстой рамкой.
Посмотрим как будет выглядеть макрос:
Range("A1:C4").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Выберем интересующие нас строки и добавим следующий программный
код:
Sheet.Range['A1:C4'].Select;
exl.Selection.Borders[хlEdgeLeft].LineStyle := xlContinuous;
exl.Selection.Borders[хlEdgeLeft].Weight := xlMedium;
exl.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
exl.Selection.Borders[xlEdgeTop].Weight := xlMedium;
exl.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
exl.Selection.Borders[xlEdgeBottom].Weight := xlMedium;
exl.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
exl.Selection.Borders[xlEdgeRight].Weight := xlMedium;
И опять обратим внимание, что синтаксис изменился.
А теперь попробуем объединить все программные строки в одной
процедуре по созданию Excel-таблицы, приведенной выше:
procedure OutSampleTable; const xlCenter = $FFFFFFF4; хlEdgeLeft = $00000007; xlEdgeTop = $00000008; xlEdgeBottom = $00000009; xlEdgeRight = $0000000A; xlMedium = $FFFFFFD6; xlContinuous = $00000001; var exl: OleVariant; WorkBook, Sheet: Variant; fileName: String; begin try fileName:= ExtractFilePath(Application.EXEName) +'SampleTable.xls'; exl := CreateOleObject('Excel.Application'); WorkBook := exl.Application.WorkBooks.Add; Sheet := WorkBook.WorkSheets[1]; //Устанавливаем ширину колонок Sheet.Columns['1:1'].ColumnWidth := 121; Sheet.Columns['2:2'].ColumnWidth := 94; Sheet.Columns['3:3'].ColumnWidth := 70; //Форматирование таблицы Sheet.Range['A1:C4'].Select; exl.Selection.HorizontalAlignment := xlCenter; Sheet.Range['A1:C1'].Select; exl.Selection.Font.Bold := True; //Подстановка значений Sheet.Cells(1,1) := 'Наименование продукта'; Sheet.Cells(1,2) := 'Приход'; Sheet.Cells(1,3) := 'Расход'; Sheet.Cells(2,1) := 'Дорожные велосипеды'; Sheet.Cells(2,2) := 121; Sheet.Cells(2,3) := 11; Sheet.Cells(3,1) := 'Спортивные велосипеды'; Sheet.Cells(2,2) := 75; Sheet.Cells(2,3) := 55; Sheet.Cells(3,1) := 'Итого:'; //Подстановка формул Sheet.Cells(3,2) := '=SUM(R[-2]C:R[-1]C)'; Sheet.Cells(3,3) := '=SUM(R[-2]C:R[-1]C)'; //Обводка рамкой Sheet.Range['A1:C4'].Select; exl.Selection.Borders[хlEdgeLeft].LineStyle := xlContinuous; exl.Selection.Borders[хlEdgeLeft].Weight := xlMedium; exl.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous; exl.Selection.Borders[xlEdgeTop].Weight := xlMedium; exl.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous; exl.Selection.Borders[xlEdgeBottom].Weight := xlMedium; exl.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous; exl.Selection.Borders[xlEdgeRight].Weight := xlMedium; exl.Application.ActiveWorkBook.Saveas(fileName); finally exl.Application.Quit; end; end;
И так мы построили Excel-таблицу. Конечно,
порядок формирования таблиц и, соответственно, программный
код реальной программы будет иной. Здесь же был приведен только
пример использования макросов Excel для облегчения написания
программы в Delphi.
Наверх
Тут иногда бывают вопросы о том, как можно из Delphi работать с документами Excel. Решил написать такую инструкцию, где рассказано об основных действиях.
Для работы с OLE нужно к строке Uses добавить модуль ComObj. Так же нужно объявить переменную типа Variant.
Delphi | ||
|
Что бы начать работу с Экселем, нужно создать OLE объект:
Ap := CreateOleObject(‘Excel.Application’);
После этого нужно либо создать новую книгу:
Ap.Workbooks.Add;
либо открыть файл:
Ap.Workbooks.Open(<имя файла>);
Что бы открыть файл только для чтения, нужно указать:
Ap.Workbooks.Open(<имя файла>,0,True);
где True и указывает, что файл открывается только для чтения.
По умолчанию окно Excel не будет отображаться… что бы оно появилось, нужно выполнить
Ap.Visible := True;
Но это желательно делать в последний момент, т.к. когда окно видимое, то все изменения в нём происходят медленнее. Поэтому, лучше оставить его невидимым, сделать там все необходимые изменения, и только после этого сделать его видимым или закрыть. Если вы его оставите невидимым, то процесс EXCEL.EXE останется висеть в памяти, даже когда будет закрыто ваше приложение.
Что бы закрыть Excel, выполните Ap.Quit или Ap.Application.Quit. Честно говоря, я не знаю, чем они отличаются.
Что бы при закрытии не выдавался запрос на сохранение файла, можно отключить сообщения:
Ap.DisplayAlerts := False;
Что бы записать или прочитать содержимое ячейки можно использовать Ap.Range[<имя ячейки>] или Ap.Cells[<позиция по Y>,<позиция по X>]
Ap.Range[‘D1’] := ‘Ляляля’;
Ap.Cells[1,4] := ‘Ляляля’;
Эти две строки выполняют одно и тоже действие: записывают строку «Ляляля» в ячейку D1
Читать значение из ячейки таким же образом:
S := Ap.Range[‘D1’];
или
S := Ap.Cells[1,4];
Так же можно записывать значение сразу в несколько ячеек… можно перечислить через точку с запятой или указать диапазон через двоеточие:
Delphi | ||
|
Изменение свойств текста
Всё это можно применять как к отдельным ячейкам, так и к группам ячеек, строк, столбцов и т.п. Я буду показывать примеры на Ap.Cells… но Вам никто не мешает использовать Ap.Range[‘D5’], Ap.Range[‘A2:E8’], Ap.Columns[‘B:F’] и т.п.
Delphi | ||
|
Изменение цвета фона ячеек:
Delphi | ||
|
Наверное, вы обращали внимание, что в новом документе появляются 3 листа (их список отображается внизу программы Excel). По умолчанию, мы работаем с активным листом (сразу после создания это первый лист). Но при желании, мы можем использовать и другие листы. Доступ к ним осуществляется с помощью Worksheets[<номер листа>]. Обратите внимание, что нумеруются они начиная с 1 (а не с 0, как привыкли все программисты).
Delphi | ||
|
Свойства страницы
Delphi | ||
|
Ниже приведён более полный список размеров бумаги из модуля ExcelXP:
Delphi | ||
|
Распечатать
Delphi | ||
|
Выделение
Excel.Range[Excel.Cells[1, 1], Excel.Cells[5, 3]].Select;
а также любые другие комбинации выбора ячейки с окончанием .select — выбор 1 или группы ячеек
С выбранными ячейками возможны следующие преобразования:
1) объединение ячеек
Excel.Selection.MergeCells:=True;
2) перенос по словам
Excel.Selection.WrapText:=True;
3) горизонтальное выравнивание
Excel.Selection.HorizontalAlignment:=3;
при присваивании значения 1 используется выравнивание по умолчанию, при 2 — выравнивание слева, 3 — по центру, 4 — справа.
4) вериткальное выравнивание
Excel.Selection.VerticalAlignment:=1;
присваиваемые значения аналогичны горизонтальному выравниванию.
5) граница для ячеек
Excel.Selection.Borders.LineStyle:=1;
При значении 1 границы ячеек рисуются тонкими сплошными линиями.
Кроме этого можно указать значения для свойства Borders, например, равное 3. Тогда установится только верхняя граница для блока выделения:
Excel.Selection.Borders[3].LineStyle:=1;
Значение свойства Borders задает различную комбинацию граней ячеек.
В обоих случаях можно использовать значения в диапазоне от 1 до 10. ]
//9 и 11 — лучшие
\\\\\\\\\\\\\\\\
Установка пароля для активной книги может быть произведена следующим образом:
Delphi | ||
|
где pass — устанавливаемый пароль на книгу.
Снятие пароля с книги аналогично, использовуем команду
Delphi | ||
|
где pass — пароль, установленный для защиты книги.
Установка и снятие пароля для активного листа книги Excel производится командами
Delphi | ||
|
где pass — пароль, установленный для защиты книги.
Вспомогательные операции в EXCEL
Удаление строк со сдвигом вверх:
Delphi | ||
|
при выполнении данных действий будут удалены строки с 5 по 15.
Установка закрепления области на активном листе Excel
Delphi | ||
|
Спасибо VampireKB за дополнения