Каждое слово или буква в ячейке MS Excel может иметь свой шрифт, стиль шрифта, цвет и размер. Это позволяет сделать таблицу более наглядной и удобочитаемой. Для подобного форматирования ячейки достаточно перевести ее в режим редактирования нажатием клавиши F2 или двойным кликом левой кнопки мыши, выделить нужный участок текста и поменять параметры его шрифта. Как это сделать программным способом?
Для начала посмотрим, как раскрасить ячейку в программе, которая работает с файлами MS Excel через его OLE-сервер. В этом нам поможет свойство ячейки Characters(start, length), которое позволяет манипулировать последовательностью символов в тексте ячейки (где start – номер начального символа, а length – количество символов для обработки).
Первый способ – использование метода SetCellFromHtml. Этот метод присваивает ячейке строку в формате HTML, при этом теги форматирования HTML превращаются в форматированный текст MS Excel.
Второй способ – использование типа TRichString record. TRichString представляет собой строковое значение ячейки MS Excel в формате RTF. Для управления форматом строки TRichString используется массив или список элементов типа TRTFRun record. TRTFRun представляет собой структуру из двух полей: Font – шрифт и FirstChar – символ, с которого применяется шрифт (отсчет ведется с 0).
Для начала посмотрим, как раскрасить ячейку в программе, которая работает с файлами MS Excel через его OLE-сервер. В этом нам поможет свойство ячейки Characters(start, length), которое позволяет манипулировать последовательностью символов в тексте ячейки (где start – номер начального символа, а length – количество символов для обработки).
uses
System.SysUtils, System.UITypes,
System.Variants, System.Win.ComObj, Winapi.Windows, Winapi.ActiveX;
procedure UseOLE;
var
ovEA : OleVariant;
ovCell: OleVariant;
ovFont: OleVariant;
begin
ovEA := CreateOleObject('Excel.Application');
try
ovEA.Workbooks.Add;
ovEA.Cells[1, 1] := 'OLE';
// присваиваем ячейке значение
ovCell := ovEA.Range['B1'];
ovCell.Value := 'The BlackCat';
// меняем шрифт 3 символов начиная с 1-го
ovFont := ovCell.Characters(1, 3).Font;
ovFont.Name := 'Arial Black';
ovFont.Color := TColorRec.Red;
// 5-й символ выделяем жирным
ovCell.Characters(5, 1).Font.Bold := True;
ovFont := ovCell.Characters(10, 3).Font;
ovFont.Name := 'Comic Sans MS';
ovFont.Color := RGB($4B, $00, $82); // Indigo
ovEA.ActiveWorkbook.SaveAs('test.xlsx');
ovEA.Quit;
finally
ovEA := Unassigned;
end;
end;
Теперь раскрасим ячейку в программе, которая работает с файлами MS Excel "напрямую" через библиотеку TMS FlexCel. Для этого у нее есть два способа.Первый способ – использование метода SetCellFromHtml. Этот метод присваивает ячейке строку в формате HTML, при этом теги форматирования HTML превращаются в форматированный текст MS Excel.
uses
System.SysUtils, System.UITypes,
VCL.FlexCel.Core, FlexCel.XlsAdapter;
procedure UseFlexCelHTML;
var
xls: TExcelFile;
begin
xls := TXlsFile.Create(True);
try
xls.Open('test.xlsx');
xls.SetCellValue(2, 1, 'FlexCel HTML');
xls.SetCellFromHtml(2, 2, 'The BlackCat');
xls.Save('test.xlsx');
finally
xls.Free;
end;
end;
Это способ прост в использовании, но имеет один существенный недостаток. Атрибут "size" тега "font" задает размер шрифта в условных единицах, что не позволяет корректно изменять размер шрифта в ячейке MS Excel.Второй способ – использование типа TRichString record. TRichString представляет собой строковое значение ячейки MS Excel в формате RTF. Для управления форматом строки TRichString используется массив или список элементов типа TRTFRun record. TRTFRun представляет собой структуру из двух полей: Font – шрифт и FirstChar – символ, с которого применяется шрифт (отсчет ведется с 0).
uses
System.SysUtils, System.UITypes,
VCL.FlexCel.Core, FlexCel.XlsAdapter;
procedure UseFlexCelRichString;
var
xls: TExcelFile;
xlsDefaultFont: TFlxFont;
RtfRun: TRTFRunArray;
begin
xls := TXlsFile.Create(True);
try
xls.Open('test.xlsx');
xlsDefaultFont := xls.GetDefaultFont;
xlsDefaultFont.Scheme := TFontScheme.None; // for TExcelFileFormat > v2003
SetLength(RtfRun, 5);
RtfRun[0].FirstChar := 0;
RtfRun[0].Font := xlsDefaultFont;
RtfRun[0].Font.Name := 'Arial Black';
RtfRun[0].Font.Color := Colors.Red;
RtfRun[1].FirstChar := 3;
RtfRun[1].Font := xlsDefaultFont;
RtfRun[2].FirstChar := 4;
RtfRun[2].Font := xlsDefaultFont;
RtfRun[2].Font.Style := [TFlxFontStyles.Bold];
RtfRun[2].Font.Color := Colors.Black;
RtfRun[3].FirstChar := 5;
RtfRun[3].Font := xlsDefaultFont;
RtfRun[3].Font.Color := Colors.Black;
RtfRun[4].FirstChar := 9;
RtfRun[4].Font := xlsDefaultFont;
RtfRun[4].Font.Name := 'Comic Sans MS';
RtfRun[4].Font.Color := TExcelColor.FromArgb($4B, $00, $82); // Indigo
xls.SetCellValue(3, 1, 'FlexCel RTF');
xls.SetCellValue(3, 2, TRichString.CreateWithoutCopy('The BlackCat', RtfRun));
// увеличим размер шрифта на 2.5
RtfRun[4].Font.Size20 := RtfRun[4].Font.Size20 + 50;
xls.SetCellValue(4, 1, 'FlexCel RTF Size+2.5');
xls.SetCellValue(4, 2, TRichString.CreateWithoutCopy('The BlackCat', RtfRun));
xls.Save('test.xlsx');
finally
xls.Free;
end;
end;
Этот способ требует написания большого количества команд, но он является более гибким и не требует составления строки в формате HTML. К тому же метод SetCellFromHtml сам использует TRichString:
procedure TXlsFile.SetCellFromHtml(const row: Int32; const col: Int32;
const htmlText: UTF16String; const XF: Int32);
var
fmt: TFlxFormat;
Rs: TRichString;
begin
...
Rs := TRichString.FromHtml(htmlText, fmt, Self);
SetCellValue(row, col, Rs, XF);
end;ть
В процедуре UseOLE я создал файл test.xlsx, а в процедурах UseFlexCelHTML и UseFlexCelRichString его открывал и дополнял. Поэтому, если процедуры вставить в программу и выполнить последовательно
program xlsCellText;
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.UITypes,
System.Variants, System.Win.ComObj, Winapi.Windows, Winapi.ActiveX,
VCL.FlexCel.Core, FlexCel.XlsAdapter;
procedure UseOLE;
begin
...
end;
procedure UseFlexCelHTML;
begin
...
end;
procedure UseFlexCelRichString;
begin
...
end;
begin
try
UseOLE;
UseFlexCelHTML;
UseFlexCelRichString;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
то получим такой результат:
Как вы видите, несмотря на использование различных методов, текст в ячейках B1-B3 отформатирован одинаково. Отличается только ячейка B4 – в ней для слова "Cat" размер шрифта увеличен с 11 до 13.5.
Комментариев нет:
Отправить комментарий