Для работы с Excel в Delphi, первым делом нужно в Uses указать модуль ComObj.
procedure TForm1.Button1Click(Sender: TObject); var XL: Variant; begin XL := CreateOLEObject(‘Excel.Application’); // Создание OLE объекта XL.WorkBooks.add; // Создание новой рабочей книги XL.visible := true; end; |
Как обратиться к отдельным ячейкам листа Excel в Delphi
XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Value:=’30’; //Результатом является присвоение ячейке [1,1] первого листа значения 30. Также к ячейке //текущего листа можно обратиться следующим образом: XL.Cells[1, 1]:=’30’; |
Как добавить формулу в ячейку листа Excel в Delphi
XL.WorkBooks[1].WorkSheets[1].Cells[3,3].Value := ‘=SUM(B1:B2)’; |
Форматирование текста в ячейках Excel, производится с помощью свойств Font и Interior объекта Cell:
// Цвет заливки XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Interior.Color := clYellow; // Цвет шрифта XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Color := clRed; XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Name := ‘Courier’; XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Size := 16; XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Bold := True; |
Работа с прямоугольными областями ячеек, с помощью объекта Range:
XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Value := ‘Blue text’; XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Font.Color := clBlue; //В результате в области A1:C5 все ячейки заполняются текстом ‘Blue text’. |
Как выделить группу (область) ячеек Excel в Delphi
XL.Range[‘A1:C10’].Select; |
Как установить объединение ячеек, перенос по словам, и горизонтальное или вертикальное выравнивание Excel в Delphi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Выделяем группу (область) ячеек XL.Range[‘A1:C10’].Select; // объединение ячеек XL.Selection.MergeCells:=True; // перенос по словам XL.Selection.WrapText:=True; // горизонтальное выравнивание XL.Selection.HorizontalAlignment:=3; //вериткальное выравнивание XL.Selection.VerticalAlignment:=1; //Возможны следующие значения: //1 — выравнивание по умолчанию, //2 — выравнивание слева, //3 — выравнивание по центру, //4 — выравнивание справа. |
Как задать границы ячеек Excel в Delphi
XL.Selection.Borders.LineStyle:=1; // значение может быть установлено от 1 до 10 |
Как выровнять столбцы Excel по ширине, в зависимости от содержания
XL.selection.Columns.AutoFit; |
Как удалить столбец Excel в Delphi
Как задать формат ячеек Excel в Delphi
XL.columns[1].NumberFormat := ‘@’; // текстовый формат XL.columns[1].NumberFormat := ‘m/d/yyyy’; // формат дата XL.columns[1].NumberFormat = ‘0.00%’ // формат процентный XL.columns[1].NumberFormat = ‘h:mm;@’// формат время |
Falk0ner, вс, 06/07/2008 — 15:35.
- Доступ к ячейкам Excel
Выравнивание текста в ячейке Excel
Выравнивание текста в ячейке
Следующим шагом изменения режима отображения данных в ячейках книги Excel рассмотрим выравнивание текста по горизонтали и вертикали. Для выравнивания по горизонтали используется свойство HorizontalAlignment объекта Range, которое применяем в функции SetHorizontalAlignment. Если записывать в аргумент alignment:integer этой функции определенные числовые константы, то получим различные варианты выравнивания текста по горизонтали. Смотрите список констант и функцию, реализующую выравнивание текста по горизонтали.
const
xlHAlignCenter=-4108;
xlHAlignDistributed=-4117;
xlHAlignJustify=-4130;
xlHAlignLeft=-4131;
xlHAlignRight=-4152;
xlHAlignCenterAcrossSelection=7;
xlHAlignFill=5;
xlHAlignGeneral=1;
Function SetHorizontalAlignment (sheet:variant;range:string;
alignment:integer):boolean;
begin
SetHorizontalAlignment:=true;
try
E.ActiveWorkbook.Sheets.Item[sheet].Range
[range].HorizontalAlignment:=alignment;
except
SetHorizontalAlignment:=false;
end;
End;
Для выравнивания по вертикали используем свойство VerticalAlignment объекта Range. Смотрите набор констант и функцию SetVerticalAlignment.
const
xlVAlignBottom=-4107;
xlVAlignCenter=-4108;
xlVAlignDistributed=-4117;
xlVAlignJustify=-4130;
xlVAlign=-4160;
Function SetVerticalAlignment (sheet:variant;range:string;
alignment:integer):boolean;
begin
SetVerticalAlignment:=true;
try
E.ActiveWorkbook.Sheets.Item[sheet].Range
[range].VerticalAlignment:=alignment;
except
SetVerticalAlignment:=false;
end;
End;
Тут иногда бывают вопросы о том, как можно из 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 за дополнения
Эта статья первая из цикла статей посвященных экспорту документов в MS Excel. В ней мы рассмотрим подключение к Excel, заполнению ячеек и простейшее оформление документа.
Я не буду углубляться в теорию, рассказывать о том как работает OLE механизм, начнем с самого главного.
Подключение.
Для подключения к Excel и работы с ним нам понадобится переменная типа Variant:
Excel:Variant;
Далее создаем OLE объект:
Excel:=CreateOleObject('Excel.Application');
Добавляем новую книгу:
Excel.Workbooks.Add;
Показываем Excel:
Excel.Visible:=true;
Так же нам понадобятся константы:
const xlContinuous=1; xlThin=2; xlTop = -4160; xlCenter = -4108;
Текст ячеек.
Теперь до любой ячейки мы можем добраться следующим образом:
Excel.ActiveWorkBook.WorkSheets[1].Cells[1, 2]:='Текст ячейки (1,2)';
Объект Range, выделение диапазона, объединение ячеек, выравнивание.
Представьте такую ситуацию: необходимо объединить несколько ячеек и выровнять текст в них по центру.
Выделяем:
Excel.ActiveWorkBook.WorkSheets[1].Range['A1:G1'].Select;
Объединяем:
Excel.ActiveWorkBook.WorkSheets[1].Range['A1:G1'].Merge;
И выравниваем:
Excel.Selection.HorizontalAlignment:=xlCenter;
Границы и перенос по словам.
Для начала выделяем нужный диапазон а затем…
Показываем границы:
Excel.Selection.Borders.LineStyle:=xlContinuous; Excel.Selection.Borders.Weight:=xlThin;
И включаем перенос по словам:
Excel.Selection.WrapText:=true;
Пример.
Пример можно скачать здесь
Параметры страницы.
Начнем с полей страницы. Во первых для того чтобы добраться до параметров страницы у листа Excel имеется свойство объект PageSetup его мы и будем использовать. Для установки размеров полей необходимо изменить соответствующие свойства PageSetup, вот эти свойства:
- LeftMargin — Левое поле
- RightMargin — Правое поле
- TopMargin — Верхнее поле
- BottomMargin — Нижнее поле
Значение размеров полей необходимо указывать в пикселях, к чему мы не очень привыкли, поэтому воспользуемся функцией InchesToPoints объекта Application, которая переводит значение в дюймах в значение в пикселях. Теперь напишем процедуру которая подключит Excel и установит поля равные 0.44 дюйма (приблизительно 1 см):
procedure Connect; var Excel:Variant; begin Excel:=CreateOleObject('Excel.Application'); Excel.Workbooks.Add; Excel.ActiveSheet.PageSetup.LeftMargin:= Excel.Application.InchesToPoints(0.44); Excel.ActiveSheet.PageSetup.RightMargin:= Excel.Application.InchesToPoints(0.44); Excel.ActiveSheet.PageSetup.TopMargin:= Excel.Application.InchesToPoints(0.44); Excel.ActiveSheet.PageSetup.BottomMargin:= Excel.Application.InchesToPoints(0.44); end;
Иногда полезно уметь установить и ориентацию страницы:
Excel.ActiveSheet.PageSetup.Orientation:= 2;
Здесь значение ориентации = 2, означает альбомную, при книжной ориентации присвойте Orientation значение 1.
Вы наверное не раз встречали такой отчет в котором таблица с большим количеством строк размещается на нескольких страницах в таких случаях очень удобны сквозные строки, они печатаются на каждой странице отчета:
Excel.ActiveSheet.PageSetup.PrintTitleRows:='$2:$3';
Здесь мы указываем вторую и третью строки для печати на каждой странице.
Шрифты и цвета.
Для установки шрифта и размера текста выделите нужный диапазон и установите свойство Name объекта-свойства Font объекта Selection или свойство Size для изменения размера:
Excel.ActiveWorkBook.WorkSheets[1].Range['F1'].Select; Excel.Selection.Font.Name:='Courier New'; Excel.Selection.Font.Size:=18;
Если Вы хотите установить жирный или, например, наклонный стиль написания текста установите соответствующие свойства:
Excel.ActiveWorkBook.WorkSheets[1].Range['G1'].Select; Excel.Selection.Font.Bold:=true; // Для жирного текста Excel.Selection.Font.Italic:=true; // Для наклонного текста
Для указания цвета текста измените свойство ColorIndex все того же объекта Font:
Excel.ActiveWorkBook.WorkSheets[1].Range['A1'].Select; Excel.Selection.Font.ColorIndex:=3;
Вот несколько индексов цветов:
- Индекс — Цвет
- 0 — Авто
- 2 — Белый
- 3 — Красный
- 5 — Синий
- 6 — Желтый
- 10 — Зеленый
Для изменения цвета фона ячейки используйте объект Interior свойства Selection:
Excel.ActiveWorkBook.WorkSheets[1].Range['H1'].Select; Excel.Selection.Interior.ColorIndex:=3; // Цвет
Колонтитулы.
Для добавления колонтитула к документу достаточно указать его содержание:
Excel.ActiveSheet.PageSetup.LeftFooter:='Левый нижний колонтитул'; Excel.ActiveSheet.PageSetup.CenterFooter:='Центральный нижний колонтитул'; Excel.ActiveSheet.PageSetup.RightFooter:='Правый нижний колонтитул'; Excel.ActiveSheet.PageSetup.LeftHeader:='Левый верхний колонтитул'; Excel.ActiveSheet.PageSetup.CenterHeader:='Центральный верхний колонтитул'; Excel.ActiveSheet.PageSetup.RightHeader:='Правый верхний колонтитул';
Для изменения размера шрифта добавьте к колонтитулу управляющий символ «&» и размер шрифта:
Excel.ActiveSheet.PageSetup.LeftFooter:='&7Левый нижний колонтитул';
На этом пока все. Пример к статье здесь
procedure ExportToExcel(var ASheetRef: Variant);
function GetCol(Col: integer): String;
begin
if Col<27 then
Result := Chr(Col+64)
else
Result := Chr((Col div 26)+64)+ Chr((Col mod 26)+64)
end;
//function CellsToRange(Row1, Col1: Integer): String; overload;
//var
// S : String;
//begin
// S := GetCol(Col1)+IntToStr(Row1);
// Result := S;
//end;
function CellsToRange(Row1, Col1, Row2, Col2: Integer): String; overload;
var
S : String;
begin
S := GetCol(Col1)+IntToStr(Row1)+’:’+ GetCol(Col2)+ IntToStr(Row2);
Result := S;
end;
procedure ExportTextView(var ASheetRef: Variant);
const
EXCEL_COL_ITEMS_WIDTH = 40; //width of first column (with items)
EXCEL_COL_CODE_WIDTH = 5; //width of second column (with codes of items)
EXCEL_COL_DATA_WIDTH = 11; //width of columns with data
EXCEL_ROW_HEADLINES_HEIGHT = 40; //height of columns with headlines
EXCEL_ROW_TWO_LINES_HEIGHT = 26; //height of cells with two lines of text
EXCEL_DEFAULT_ROW_HEIGHT = 13;
VERTICAL_TOP_ALIGNMENT = 1;
HORIZONTAL_CENTER_ALIGNMENT = 3;
HORIZONTAL_LEFT_ALIGNMENT = 2;
EXCEL_FONT_NAME = ‘Arial’;
EXCEL_FONT_SIZE = 10;
DATA_FORMAT = ‘# ###,0;(# ###,0);0,0’;
var
RowRef,
ColRef: Variant;
begin
//set number format
ASheetRef.Range[CellsToRange(5,3,45,PeriodCount + 2)].NumberFormat:=DATA_FORMAT;
ASheetRef.Range[CellsToRange(50,3,86,PeriodCount + 2)].NumberFormat:=DATA_FORMAT;
//set columns widths, firstly for all columns in the range
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].ColumnWidth:=EXCEL_COL_DATA_WIDTH;
//then for some
ColRef:=ASheetRef.Columns;
ColRef.Columns[1].ColumnWidth:=EXCEL_COL_ITEMS_WIDTH;
ColRef.Columns[2].ColumnWidth:=EXCEL_COL_CODE_WIDTH;
//set rows height, firstly for all rows
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].RowHeight:=EXCEL_DEFAULT_ROW_HEIGHT;
//then for some
RowRef:=ASheetRef.Rows;
RowRef.Rows[1].RowHeight:=EXCEL_ROW_HEADLINES_HEIGHT;
RowRef.Rows[47].RowHeight:=EXCEL_ROW_HEADLINES_HEIGHT;
RowRef.Rows[14].RowHeight:=EXCEL_ROW_TWO_LINES_HEIGHT;
RowRef.Rows[28].RowHeight:=EXCEL_ROW_TWO_LINES_HEIGHT;
RowRef.Rows[59].RowHeight:=EXCEL_ROW_TWO_LINES_HEIGHT;
RowRef.Rows[72].RowHeight:=EXCEL_ROW_TWO_LINES_HEIGHT;
RowRef.Rows[74].RowHeight:=EXCEL_ROW_TWO_LINES_HEIGHT;
//set font
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Font.Name:=EXCEL_FONT_NAME;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Font.Size:=EXCEL_FONT_SIZE;
RowRef.Rows[1].Font.Bold:= True;
RowRef.Rows[3].Font.Bold:= True;
RowRef.Rows[19].Font.Bold:= True;
RowRef.Rows[20].Font.Bold:= True;
RowRef.Rows[43].Font.Bold:= True;
RowRef.Rows[44].Font.Bold:= True;
RowRef.Rows[45].Font.Bold:= True;
RowRef.Rows[47].Font.Bold:= True;
RowRef.Rows[49].Font.Bold:= True;
RowRef.Rows[58].Font.Bold:= True;
RowRef.Rows[59].Font.Bold:= True;
RowRef.Rows[63].Font.Bold:= True;
RowRef.Rows[64].Font.Bold:= True;
RowRef.Rows[69].Font.Bold:= True;
RowRef.Rows[70].Font.Bold:= True;
RowRef.Rows[84].Font.Bold:= True;
RowRef.Rows[85].Font.Bold:= True;
RowRef.Rows[86].Font.Bold:= True;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].WrapText:=true;
//set alignments
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].VerticalAlignment:=VERTICAL_TOP_ALIGNMENT;
ASheetRef.Range[‘A1:A86’].HorizontalAlignment:=HORIZONTAL_LEFT_ALIGNMENT;
ASheetRef.Range[‘A1:A3’].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[20,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[44,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[47,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[48,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[49,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[59,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[64,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[70,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
ASheetRef.Cells[85,1].HorizontalAlignment:=HORIZONTAL_CENTER_ALIGNMENT;
end;//ExportBalView
//draws borders of cells;
procedure DrawCellBorders(var ASheetRef: Variant);
const
EDGE_LEFT = 7;
EDGE_TOP = 8;
EDGE_BOTTOM = 9;
EDGE_RIGHT = 10;
INNER_VERTICAL = 11;
INNER_HOR = 12;
LINE_STYLE = 1;
LINE_WIDTH = 2;
begin
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_VERTICAL].Weight:=LINE_WIDTH;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_VERTICAL].LineStyle:=LINE_STYLE;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_HOR].Weight:=LINE_WIDTH;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_HOR].LineStyle:=LINE_STYLE;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_TOP].Weight:=LINE_WIDTH;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_LEFT].Weight:=LINE_WIDTH;
ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE;
end;//DrawCellBorders
begin
try
ASheetRef.Name:=’Name’;
ExportTextView(ASheetRef);
DrawCellBorders(ASheetRef);
except
ShowMessage(‘Error’);
end;
end;