Как нарисовать таблицу excel delphi

Поскольку этот вопрос перекликается с предыдущим в плане навыков программной работы с приложениями 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:

  1. Как добраться до конкретной границы ячейки Excel в Delphi?
  2. Как изменить внешний вид границы ячейки или диапазона Excel в Delphi?
  3. Как сделать заливку цветом ячеек Excel в Delphi?
  4. Как изменить шрифт в ячейках 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.

купить книгу 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
1
2
Uses ComObj;
Var Ap : Variant;

Что бы начать работу с Экселем, нужно создать 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
1
2
3
4
5
6
7
8
Ap.Range['A2;B5;D1'] := 'Ляляля'; // записывает строку в 3 ячейки: A2, B5 и D1
Ap.Range['A2:D5'] := 'Ляляля'; // записывает строку во все ячейки диапазона A2:D5
Ap.Range[Ap.Cells[2,1],Ap.Cells[5,4]] := 'Ляляля'; // Тоже самое, что и предыдущая строка
Ap.Cells := 'Ляляля'; // Изметятся все ячейки
Ap.Rows['2'] := 'Ляляля'; // Изменятся все ячейки второй строки
Ap.Rows[2] := 'Ляляля';  // Тоже самое
Ap.Columns['B'] := 'aaa';  // Изменятся все ячейки в столбце B
Ap.Columns[2] := 'aaa';  // Тоже самое

Изменение свойств текста
Всё это можно применять как к отдельным ячейкам, так и к группам ячеек, строк, столбцов и т.п. Я буду показывать примеры на Ap.Cells… но Вам никто не мешает использовать Ap.Range[‘D5’], Ap.Range[‘A2:E8’], Ap.Columns[‘B:F’] и т.п.

Delphi
1
2
3
Ap.Cells.Font.Bold := True;  // Жирный шрифт
Ap.Cells.Font.Italic := True; // Курсив
Ap.Cells.Font.Underline := True; // Подчёркивание

Изменение цвета фона ячеек:

Delphi
1
2
Ap.Rows[1].Interior.Color := rgb(192, 255, 192); // Первую строку закрашиваем в зелёный цвет, используя RGB
Ap.Cells[2,1].Interior.Color := clRed; // Ячейку A2 закрашиваем в красный цвет, используя константу clRed

Наверное, вы обращали внимание, что в новом документе появляются 3 листа (их список отображается внизу программы Excel). По умолчанию, мы работаем с активным листом (сразу после создания это первый лист). Но при желании, мы можем использовать и другие листы. Доступ к ним осуществляется с помощью Worksheets[<номер листа>]. Обратите внимание, что нумеруются они начиная с 1 (а не с 0, как привыкли все программисты).

Delphi
1
2
Ap.Worksheets[1].Name := 'Первый лист'; // Изменить название первого листа
Ap.Worksheets[2].Name := 'Ещё один лист'; // Изменить название второго листа

Свойства страницы

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Колонтитулы:
Ap.Worksheets[1].PageSetup.LeftFooter := 'Левый нижний колонтитул';
Ap.Worksheets[1].PageSetup.LeftHeader := 'Левый верхний колонтитул';
Ap.Worksheets[1].PageSetup.CenterFooter := 'Центральный нижний колонтитул';
Ap.Worksheets[1].PageSetup.CenterHeader := 'Центральный верхний колонтитул';
Ap.Worksheets[1].PageSetup.RightFooter := 'Правый нижний колонтитул';
Ap.Worksheets[1].PageSetup.RightHeader := 'Правый верхний колонтитул';
 
Ap.Worksheets[1].PageSetup.Draft := True; // Для черновой печати
Ap.Worksheets[1].PageSetup.BlackAndWhite := True;  // Для чёрно-белой печати
Ap.Worksheets[1].PageSetup.PrintGridlines := True; // При печати будет видна сетка
Ap.Worksheets[1].PageSetup.PrintHeadings := True;  // При печати будут печататься названия столбцов и номера строк
Ap.Worksheets[1].PageSetup.FirstPageNumber := 5;   // Начать нумерацию страниц с пятой
Ap.Worksheets[1].PageSetup.Orientation := 1;  // Ориентация бумаги: 1=Книжная, 2=Альбомная
Ap.Worksheets[1].PageSetup.PaperSize := 9; // Указать размер бумаги. 8=А3, 9=А4, 11=А5

Ниже приведён более полный список размеров бумаги из модуля ExcelXP:

Delphi
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
const
  xlPaper10x14 = $00000010;
  xlPaper11x17 = $00000011;
  xlPaperA3 = $00000008;
  xlPaperA4 = $00000009;
  xlPaperA4Small = $0000000A;
  xlPaperA5 = $0000000B;
  xlPaperB4 = $0000000C;
  xlPaperB5 = $0000000D;
  xlPaperCsheet = $00000018;
  xlPaperDsheet = $00000019;
  xlPaperEnvelope10 = $00000014;
  xlPaperEnvelope11 = $00000015;
  xlPaperEnvelope12 = $00000016;
  xlPaperEnvelope14 = $00000017;
  xlPaperEnvelope9 = $00000013;
  xlPaperEnvelopeB4 = $00000021;
  xlPaperEnvelopeB5 = $00000022;
  xlPaperEnvelopeB6 = $00000023;
  xlPaperEnvelopeC3 = $0000001D;
  xlPaperEnvelopeC4 = $0000001E;
  xlPaperEnvelopeC5 = $0000001C;
  xlPaperEnvelopeC6 = $0000001F;
  xlPaperEnvelopeC65 = $00000020;
  xlPaperEnvelopeDL = $0000001B;
  xlPaperEnvelopeItaly = $00000024;
  xlPaperEnvelopeMonarch = $00000025;
  xlPaperEnvelopePersonal = $00000026;
  xlPaperEsheet = $0000001A;
  xlPaperExecutive = $00000007;
  xlPaperFanfoldLegalGerman = $00000029;
  xlPaperFanfoldStdGerman = $00000028;
  xlPaperFanfoldUS = $00000027;
  xlPaperFolio = $0000000E;
  xlPaperLedger = $00000004;
  xlPaperLegal = $00000005;
  xlPaperLetter = $00000001;
  xlPaperLetterSmall = $00000002;
  xlPaperNote = $00000012;
  xlPaperQuarto = $0000000F;
  xlPaperStatement = $00000006;
  xlPaperTabloid = $00000003;
  xlPaperUser = $00000100;

Распечатать

Delphi
1
Ap.Worksheets[1].PrintOut;

Выделение
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
1
2
3
4
5
6
try
// попытка установить пароль
Excel.ActiveWorkbook.protect('pass');
except
// действия при неудачной попытке установить пароль
end;

где pass — устанавливаемый пароль на книгу.

Снятие пароля с книги аналогично, использовуем команду

Delphi
1
Excel.ActiveWorkbook.Unprotect('pass');

где pass — пароль, установленный для защиты книги.

Установка и снятие пароля для активного листа книги Excel производится командами

Delphi
1
2
Excel.ActiveSheet.protect('pass'); // установка пароля
Excel.ActiveSheet.Unprotect('pass'); // снятие пароля

где pass — пароль, установленный для защиты книги.
Вспомогательные операции в EXCEL

Удаление строк со сдвигом вверх:

Delphi
1
2
Excel.Rows['5:15'].Select;
Excel.Selection.Delete;

при выполнении данных действий будут удалены строки с 5 по 15.

Установка закрепления области на активном листе Excel

Delphi
1
2
3
4
5
6
// снимаем закрепление области, если оно было задано
Excel.ActiveWindow.FreezePanes:=False;
// выделяем нужную ячейку, в данном случае D3
Excel.Range['D3'].Select;
// устанавливаем закрепление области
Excel.ActiveWindow.FreezePanes:=True;

Спасибо VampireKB за дополнения

Like this post? Please share to your friends:
  • Как нарисовать таблице excel строку
  • Как нарисовать стрелочку в excel
  • Как нарисовать схему в excel со стрелками
  • Как нарисовать стрелочки в word
  • Как нарисовать структуру организации в excel