На этом шаге мы рассмотрим задание шрифта.
Важным свойством текста в Excel является шрифт отображаемых значений ячеек и текста других объектов. Для ячеек шрифт является одним из свойств объекта Range, при этом в одной ячейке не может быть, например, два фрагмента текста с разным шрифтом. Шрифт определяется свойством Font ячейки или области ячеек. Шрифт по существу тоже является объектом со своими свойствами, определяющими те или иные характеристики отображения текста. Свойства объекта Font и их характеристика представлены в таблице 1.
Свойство | Тип | Значение |
---|---|---|
Name | String | Имя |
Background | Integer | Стиль прорисовки фона (используется только для диаграмм) |
FontStyle | String | Строковое описание стиля |
Bold | Boolean | Полужирный |
Italic | Boolean | Курсив |
Size | Integer | Размер шрифта |
Strikethrough | Boolean | Зачеркнутый |
Superscript | Boolean | Верхний индекс |
Subscript | Boolean | Нижний индекс |
OutlineFont | Boolean | Не используется |
Shadow | Boolean | He используется |
Underline | Integer | Подчеркивание |
ColorIndex | Integer | Индекс цвета из палитры цветов |
Color | Integer | Цвет |
Программистов Delphi в первую очередь будет интересовать, каким образом шрифт стандартных объектов разрабатываемых приложений может соответствовать объекту Font, принадлежащему объекту Excel.Application и подчиненным объектам. Иными словами - как управлять шрифтом создаваемых документов в Excel из приложений. В Delphi свойства шрифта несколько отличаются от свойств шрифта в Excel, поэтому чтобы решить проблему согласования, достаточно написать небольшую процедуру, преобразующую свойства шрифта Delphi в свойства шрифта Excel. Вот пример такой процедуры.
function SetFontRange(R:variant; font:TFont):Boolean; //Выбор шрифта для текста ячейки const xlUnderlineStyleNone=-4142; xlUnderlineStyleSingle=2; begin SetFontRange:=True; try R.Font.Name:=font.Name; if fsBold in font.Style then R.Font.Bold:=True else R.Font.Bold:=False; if fsItalic in font.Style then R.Font.Italic:=True else R.Font.Italic:=False; R.Font.Size:=font.Size; if fsStrikeOut in font.Style then R.Font.Strikethrough:=True else R.Font.Strikethrough:=False; if fsUnderline in font.Style then R.Font.Underline:=xlUnderlineStyleSingle else R.Font.Underline:=xlUnderlineStyleNone; R.Font.Color:=font.Color; except SetFontRange:=false; end; end;
На рисунке 1 видно изменение шрифта ячейки, полученное с помощью представленного программного кода.
Рис.1. Настройка шрифта
Приведем полный текст приложения.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj, Spin; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; Edit1: TEdit; Label2: TLabel; ComboBox1: TComboBox; Label3: TLabel; ComboBox2: TComboBox; CheckBox1: TCheckBox; CheckBox2: TCheckBox; Label4: TLabel; SpinEdit1: TSpinEdit; Button3: TButton; CheckBox3: TCheckBox; Button4: TButton; FontDialog1: TFontDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Edit1Exit(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure ComboBox2Change(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure CheckBox2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure CheckBox3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation var E:variant; Range:variant; {$R *.dfm} function SetFontRange(R:variant; font:TFont):Boolean; //Выбор шрифта для текста ячейки const xlUnderlineStyleNone=-4142; xlUnderlineStyleSingle=2; begin SetFontRange:=True; try R.Font.Name:=font.Name; if fsBold in font.Style then R.Font.Bold:=True else R.Font.Bold:=False; if fsItalic in font.Style then R.Font.Italic:=True else R.Font.Italic:=False; R.Font.Size:=font.Size; if fsStrikeOut in font.Style then R.Font.Strikethrough:=True else R.Font.Strikethrough:=False; if fsUnderline in font.Style then R.Font.Underline:=xlUnderlineStyleSingle else R.Font.Underline:=xlUnderlineStyleNone; R.Font.Color:=font.Color; except SetFontRange:=false; end; end; procedure TForm1.Button1Click(Sender: TObject); //Создание объекта Excel и отображение окна begin E:=CreateOleObject('Excel.Application'); E.Visible:=True; end; procedure TForm1.Button2Click(Sender: TObject); //Создание рабочей книги begin E.WorkBooks.Add; end; procedure TForm1.Edit1Exit(Sender: TObject); //Определение области begin Range:=E.ActiveSheet.Range[Edit1.Text]; end; procedure TForm1.ComboBox1Change(Sender: TObject); //Задание горизонтального выравнивания begin case ComboBox1.ItemIndex of 0: Range.HorizontalAlignment:=-4108; //xlHAlignCenter 1: Range.HorizontalAlignment:=7; //xlHAlignCenterAcrossSelection 2: Range.HorizontalAlignment:=-4117; //xlHAlignDistributed 3: Range.HorizontalAlignment:=5; //xlHAlignFill 4: Range.HorizontalAlignment:=1; //xlHAlignGeneral 5: Range.HorizontalAlignment:=-4130; //xlHAlignJustify 6: Range.HorizontalAlignment:=-4131; //xlHAlignLeft 7: Range.HorizontalAlignment:=-4152; //xlHAlignRight end; end; procedure TForm1.ComboBox2Change(Sender: TObject); //Задание вертикального выравнивания begin case ComboBox2.ItemIndex of 0: Range.VerticalAlignment:=-4107; //xlHAlignRight 1: Range.VerticalAlignment:=-4108; //xlVAlignCenter 2: Range.VerticalAlignment:=-4117; //xlVAlignDistributed 3: Range.VerticalAlignment:=-4130; //xlVAlignJustify 4: Range.VerticalAlignment:=-4160; //xlVAlignTop end; end; procedure TForm1.CheckBox1Click(Sender: TObject); //Включение/отключение переноса по словам begin Range.WrapText:=CheckBox1.Checked; end; procedure TForm1.CheckBox2Click(Sender: TObject); //Включение/отключение автоподбора ширины begin Range.ShrinkToFit:=CheckBox2.Checked; end; procedure TForm1.Button3Click(Sender: TObject); //Задание поворота begin Range.Orientation:=SpinEdit1.Value; end; procedure TForm1.CheckBox3Click(Sender: TObject); //Объединение ячеек begin Range.MergeCells:=CheckBox3.Checked; end; procedure TForm1.Button4Click(Sender: TObject); //Выбор шрифта begin if FontDialog1.Execute then SetFontRange(Range,FontDialog1.Font); end; end.
На следующем шаге мы рассмотрим границы ячейки.