Как в delphi установить формат ячейки excel

Для работы с 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;@’// формат время


I’m exporting data from a CxDBGrid to an Excel file.
I’m able to create the file and copy data in it, but I’m having real trouble with the column formatting. Since I’m pulling the data from a DB I’d like the spreadsheet to reflect the type: NUMBER, VARCHAR2,DATE and so on.
I visually created a macro, went to look for the VBA code, and replicated it in the Delphi project:

sheet.Columns[K+2].NumberFormat := '0,000'; //Number
sheet.Columns[K+2].NumberFormat := '@'; //Text
sheet.Columns[K+2].NumberFormat := 'm/d/yyyy'; //Date

Number formatting works ok most of the times, but the other two don’t.
When I open the generated file, the text columns show up as type «Custom» and every cell displays «-64». If I go to edit a cell, the correct value is actually there.
Date is another issue: the DB’s format is dd/mm/yyyy and if I feed it to Excel as-is, it gets all messed up. I tried setting the correct format, but then Excel doesn’t recognize it.

Any clues?

I’m also setting column width. That works flawlessly.

useruser

165 / 89 / 38

Регистрация: 29.06.2015

Сообщений: 1,089

1

06.03.2017, 14:32. Показов 6065. Ответов 18

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Delphi 7.
Есть документ Excel. Я читаю этот документ средствами Delphi и передаю все данные в массив.
Когда в ячейках Excel документа данные «отформатированы» как текст все читается и передается корректно.
Но вот когда как число, то в Excel (открыв Microsoft Excel) я вижу 6677160879000690, а в программе 6,67716087900069E+15.

Часть кода

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Ap:Variant; //Переменная excel файла
TABLE_list_1 : array of array [1..50] of string; //Текстовый массив
 
begin
Ap:=CreateOleObject('Excel.Application'); //Создаем объект
Ap.Workbooks.Open(input_file_path,0,True); //Открываем файл для чтения
Ap.DisplayAlerts:=False; //Отключаем любые сообщения excel
 
SetLength(TABLE_list_1, 1000000); //Указываем размер массива 
//Он не динамический т.к. в Delphi 7 есть ошибка при больших динамических массивах
 
//Передаем содержимое ячейки Excel в элемент массива
for i:=1 to 50 do
begin
for j:=1 to 50 do
begin
TABLE_list_1[TABLE_list_1_records_count,j]:=Ap.Cells[i,TABLE_list_1_column_number[j]];
end;
end;
Ap.Application.Quit; //Закрываем excel файл

Как изменить формат данных передаваемых из Excel?



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

06.03.2017, 21:43

2

useruser, у ячеек (вернее, у объекта Range) есть свойство NumberFormat, которое определяет, какого формата данные записаны в ячейку. Попробуйте поменять (временно, если не хотите изменять документ) формат нужной ячейки на текстовый и потом считывать.

Если не получится, то скидывайте или весь проект, или Ваш документ Excel (желательно оба).



0



useruser

165 / 89 / 38

Регистрация: 29.06.2015

Сообщений: 1,089

07.03.2017, 10:55

 [ТС]

3

Цитата
Сообщение от Joey
Посмотреть сообщение

useruser, у ячеек (вернее, у объекта Range) есть свойство NumberFormat, которое определяет, какого формата данные записаны в ячейку. Попробуйте поменять (временно, если не хотите изменять документ) формат нужной ячейки на текстовый и потом считывать.

C Delphi работаю давно. перегуглил всё. Не меняет формат.

Текстовый формат в столбце AV, начиная с ячейки AV8 и заканчивая AV20.

Delphi
1
2
3
//Ap.ActiveSheet.Range['AV8:AV20'].NumberFormat:='@';
//Ap.ActiveSheet.Range['AV8:AV20'].NumberFormat:='Текст';
//Ap.ActiveSheet.Range['AV8:AV20'].NumberFormat:='Основной';



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

07.03.2017, 11:38

4

Цитата
Сообщение от useruser
Посмотреть сообщение

Не меняет формат

Delphi
1
2
 Ap.ActiveSheet.Range['AV8:AV20'].Select; //нужно выделить диапазон
 Ap.Selection.NumberFormat  := '@';



0



165 / 89 / 38

Регистрация: 29.06.2015

Сообщений: 1,089

07.03.2017, 12:03

 [ТС]

5

Цитата
Сообщение от droider
Посмотреть сообщение

Ap.ActiveSheet.Range[‘AV8:AV20’].Select; //нужно выделить диапазон Ap.Selection.NumberFormat := ‘@’;

И так не работает (
Я пробовал уже многие варианты.

Вот документ если что



0



Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

07.03.2017, 14:08

6

Цитата
Сообщение от useruser
Посмотреть сообщение

так не работает

у меня работает



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

07.03.2017, 19:15

7

useruser, какой word версии? У нас работает, а у Вас одного — нет. Подозрительно



0



Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

08.03.2017, 16:14

8

Цитата
Сообщение от Joey
Посмотреть сообщение

какой word версии?

точнее Excel, но это непринципиально, если делать правильно.

useruser, мануальчик



1



useruser

165 / 89 / 38

Регистрация: 29.06.2015

Сообщений: 1,089

09.03.2017, 06:53

 [ТС]

9

Цитата
Сообщение от Joey
Посмотреть сообщение

useruser, какой word версии? У нас работает, а у Вас одного — нет. Подозрительно

Вот и я тоже так думаю. Excel 2007.

Код

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
44
45
46
47
48
49
50
51
52
53
54
55
56
//Сделать лист Excel активным
function Excel_SetListActive(Excel : variant; NumList : integer) :variant;
begin
Result:=UnAssigned;
if not VarIsEmpty(Excel) then begin
if NumList>0 then begin
if NumList<=Excel.WorkSheets.Count then begin
Result:=Excel.ActiveWorkBook.WorkSheets[NumList];
Result.Select;
end;
end;
end;
end;
 
...
 
var
Ap:Variant; //Переменная excel файла
ARRAY_TABLE_list_1 : array of array [1..120] of string; //Массив, содержащий информацию первого листа
....
 
 
//СОЗДАНИЕ МАССИВА ИЗ ДАННЫХ ЛИСТА 1
SetLength(ARRAY_TABLE_list_1,0); SetLength(ARRAY_TABLE_list_1,1000000); //Отчищаем и указываем размер массива
ARRAY_TABLE_list_1_records_count:=0; //Просто счетчик
 
//Открываем excel файл
Ap:=CreateOleObject('Excel.Application'); //Создаем объект
Ap.Workbooks.Open(ARRAY_input_file_path,0,True); //Открываем файл для чтения
Ap.DisplayAlerts:=False; //Отключаем любые сообщения excel
 
//Активируем лист 1 (в файле всего 2 листа)
Excel_SetListActive(Ap,1);
//Узнаем количество заполненных строк на этом листе
excel_rows:=Ap.ActiveSheet.UsedRange.Rows.Count;
 
 
Ap.ActiveSheet.Range['AV8:AV20'].Select; //Нужно выделить диапазон (по идее чесь столбец AV но пока хотя бы и так)
Ap.Selection.NumberFormat  := '@';
 
for i:=data_begin_row to excel_rows do
begin
//Заполняем массив значениями 
ARRAY_TABLE_list_1_records_count:=ARRAY_TABLE_list_1_records_count+1;
for j:=1 to 120 do
begin
//В каждую запись, состоящую из 120 элементов массива передаем значение ячейки Excel
//ARRAY_TABLE_list_1_column_number - массив содержащий номер столбца
//Все корректно работает, за исключением больших чисел которые передаются в виде 6,67716087900069E+15
ARRAY_TABLE_list_1[ARRAY_TABLE_list_1_records_count,j]:=Ap.Cells[i,ARRAY_TABLE_list_1_column_number[j]];
end;
end;
 
Ap.Application.Quit; //Закрываем excel файл
SetLength(ARRAY_TABLE_list_1,ARRAY_TABLE_list_1_records_count+1); //Указываем размер массива
//КОНЕЦ СОЗДАНИЯ МАССИВА ИЗ ДАННЫХ ЛИСТА 1



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

09.03.2017, 23:51

10

useruser, установлю ворд 2007 и отпишусь

Добавлено через 1 минуту
тьфу ты, excel…

Добавлено через 14 секунд
вернее, офис 2007

Добавлено через 18 секунд
Короче, I’ll be back

Добавлено через 2 часа 36 минут
useruser, разбираюсь с Вашим кодом, если надумаете выложить побольше кода, то смелее, никто его не украдет

Добавлено через 27 минут
useruser, короче, задолбался подставлять переменные, выкладывайте больше кода, хотя бы раздел var



0



Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

10.03.2017, 09:23

11

Цитата
Сообщение от Joey
Посмотреть сообщение

выкладывайте больше кода

там у него явно каша. Сам диапазон тоже странноват.



0



useruser

165 / 89 / 38

Регистрация: 29.06.2015

Сообщений: 1,089

10.03.2017, 12:23

 [ТС]

12

Цитата
Сообщение от Joey
Посмотреть сообщение

никто его не украдет

Да я не боюсь кражи. )) Никому это не надо и не будет надо.. Я не хочу вас грузить кодом.

Написал отдельно тестовую программу. тот же результат.
В Excel я вижу 6677160879000690, а в программе 6,67716087900069E+15.
(Delphi 7. Excel 2007.)

Вот программа, исходники и excel файл. Убедитесь сами.
Тестовая программа.zip

Вот отдельно код, если лень качать.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils, ShellApi, ComObj, ActiveX;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function Excel_SetListActive(Excel : variant; NumList : integer) :variant;
begin
Result:=UnAssigned;
if not VarIsEmpty(Excel) then begin
if NumList>0 then begin
if NumList<=Excel.WorkSheets.Count then begin
Result:=Excel.ActiveWorkBook.WorkSheets[NumList];
Result.Select;
end;
end;
end;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k:integer;
Ap:Variant;
MyRange: OLEVariant;
current_string:string;
begin
Ap:=CreateOleObject('Excel.Application');
Ap.Workbooks.Open(ExtractFilePath(Application.ExeName)+'file.xls',0,True);
Ap.DisplayAlerts:=False;
 
Ap.ActiveSheet.Range['B8:B20'].Select; //нужно выделить диапазон
Ap.Selection.NumberFormat  := '@';
 
Excel_SetListActive(Ap,1);
current_string:=Ap.Cells[8,2]; //B8 
memo1.Lines.Add(current_string); //6,67716087900069E+15. ???
Ap.Application.Quit;
end;
 
end.



0



D1973

11.03.2017, 10:34

 Комментарий модератора 
useruser, Вы в момент регистрации принимали правила форума, так будьте любезны их исполнять… Все вложения выкладываются на форум, а не на какую-то там файлопомойку! Предупреждение!



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

11.03.2017, 10:50

14

useruser, проблема не в программе, а в документе Excel. Скопируйте содержимое проблемной ячейки в какую-нибудь свободную ячейку. Затем оттуда скопируйте обратно в исходную. Сохраните документ. Все работает прекрасно:

Как изменить формат данных передаваемых из Excel?

Почему Excel так делает — спросите в разделе Excel



0



1177 / 419 / 106

Регистрация: 31.03.2012

Сообщений: 1,138

11.03.2017, 13:12

15

попробуй это код (использовать formula, вместо values и т.д.)



0



165 / 89 / 38

Регистрация: 29.06.2015

Сообщений: 1,089

12.03.2017, 11:40

 [ТС]

16

Цитата
Сообщение от Joey
Посмотреть сообщение

useruser, проблема не в программе, а в документе Excel. Скопируйте содержимое проблемной ячейки в какую-нибудь свободную ячейку. Затем оттуда скопируйте обратно в исходную.

Сие есть извращение. )
Неужели никак нормально не достать это значение в числовом виде?

Цитата
Сообщение от Joeymax
Посмотреть сообщение

попробуй это код (использовать formula, вместо values и т.д.)

Архив битый (



0



Модератор

8382 / 5583 / 2275

Регистрация: 21.01.2014

Сообщений: 23,959

Записей в блоге: 3

12.03.2017, 11:45

17

Лучший ответ Сообщение было отмечено useruser как решение

Решение

Цитата
Сообщение от useruser
Посмотреть сообщение

Архив битый (

только что проверил — архив абсолютно нормальный.
вот то же самое, только другим архиватором перепаковал



1



Эксперт Pascal/Delphi

4884 / 2756 / 849

Регистрация: 04.10.2012

Сообщений: 10,054

12.03.2017, 11:52

18

Цитата
Сообщение от useruser
Посмотреть сообщение

Неужели никак нормально не достать это значение в числовом виде?

я Вам привел пример как, и Вы не поверите, но у меня есть проект, в котором подобное форматирование работает без проблем в любой версии ms офиса 2007-2016 (2003 давно в глаза не видел) и еще см.

Цитата
Сообщение от Joey
Посмотреть сообщение

проблема не в программе, а в документе Excel



1



165 / 89 / 38

Регистрация: 29.06.2015

Сообщений: 1,089

12.03.2017, 13:30

 [ТС]

19

Цитата
Сообщение от droider
Посмотреть сообщение

я Вам привел пример как, и Вы не поверите, но у меня есть проект, в котором подобное форматирование работает без проблем

И у меня тоже есть проекты, где это работает, а тут…не сработало. ( Вот я и написал.

Цитата
Сообщение от D1973
Посмотреть сообщение

только что проверил — архив абсолютно нормальный.

Спасибо, этот архив нормально распаковался.
Возможно это и будет решением — использовать formula. Ваш проект выводит числа, а это и надо.
Теперь осталось адаптировать этот код под основной проект, по типу если столбец 8 то формула иначе валюэс…



0



 
samalex2504
 
(2011-05-20 11:18)
[0]

В программе на D7 создаю и заполняю лист Excel 2007 данными разного типа.

 Excel := CreateOleObject("Excel.Application");
 Excel.Application.EnableEvents := false;
 WorkBook := Excel.Application.WorkBooks.Add;

 ...

 WorkBook.WorkSheets[1].Columns[j].WrapText := True;
 WorkBook.Worksheets[1].Columns[j].VerticalAlignment := 1;
 WorkBook.WorkSheets[1].Cells[1,j].Font.Name := ...;
 WorkBook.WorkSheets[1].Cells[1,j].Font.Size := ...;
 WorkBook.WorkSheets[1].Cells[1,j].Borders.LineStyle := 1;

 WorkBook.WorkSheets[1].Cells[i, j].Value:=...;

Все это работает.
Вопрос — Как программно задать формат ячейки? В частности, чтобы был числовой формат с заданным количеством десятичных знаков и разделением разрядов по тысячам.
Также сделать формат типа «дата» (dd.mm.yyyy).
Заранее благодарен!!!


 
sniknik ©
 
(2011-05-20 11:25)
[1]

научись делать/записывать макросы в самом экселе… кушу вопросом разом решишь. нужно, что записываешь то что делаешь «руками» и смотришь как это делает эксель.


 
samalex2504
 
(2011-05-20 11:35)
[2]


> sniknik ©   (20.05.11 11:25) [1]
>
> научись делать/записывать макросы в самом экселе… кушу
> вопросом разом решишь. нужно, что записываешь то что делаешь
> «руками» и смотришь как это делает эксель.

Я уже все сделал средствам Delphi, остался только формат ячейки.


 
sniknik ©
 
(2011-05-20 11:39)
[3]

а тебе и не предлагают перенести в «средства экселя», тебе предлагают освоить инструмент который отвечает на подобные (и много сложнее) вопросы.
т.е. ситуация типа «дать рыбу» vs «научить рыбачить»


 
Dennis I. Komarov ©
 
(2011-05-20 11:42)
[4]

while ProblemExist do
 Read([1]);


 
samalex2504
 
(2011-05-20 11:54)
[5]


> Dennis I. Komarov ©   (20.05.11 11:42) [4]
>
> while ProblemExist do
>  Read([1]);

????


 
Anatoly Podgoretsky ©
 
(2011-05-20 11:56)
[6]


> Я уже все сделал средствам Delphi, остался только формат
> ячейки.

Ошибаешься, Дельфи тут не причем, все сделал COM сервер.


 
samalex2504
 
(2011-05-20 12:01)
[7]

Софисты!!!
Один (Dennis I. Komarov ©) глумится.
Другой (Anatoly Podgoretsky ©) общие лекции читает.
Я быстрее сам найду.


 
sniknik ©
 
(2011-05-20 12:06)
[8]

на что только люди не идут… лишь бы не работать.
нет чтобы 3 кнопки нажать, за 5 мин научится, через 10 сделать, и в дальнейшем такими вопросами не задаваться, нет будет день «типа искать», и еще на будущее «отмазка» останется…


 
Dennis I. Komarov ©
 
(2011-05-20 12:13)
[9]


> samalex2504   (20.05.11 12:01) [7]

«… разруха не в клозетах, а в головах.» (С)


 
samalex2504
 
(2011-05-20 12:22)
[10]

Удалено модератором
Примечание: Моедратор сам разберется, без советов


 
Anatoly Podgoretsky ©
 
(2011-05-20 12:25)
[11]

> samalex2504  (20.05.2011 12:01:07)  [7]

Век ищи, все равно дураком останешься.
(с) Народная мудрость.


 
sniknik ©
 
(2011-05-20 12:27)
[12]

> А администратору просьба банить людей, пишущих не по делу …
ты путаешь форум программистов, где учат, с форумом поддержки типа «вопрос — ответ даже если он глупый» … тут если бы дали сразу прямой «справочный» ответ, именно это было бы «не по делу …»


 
samalex2504
 
(2011-05-20 13:04)
[13]

Между прочим, мне никто так и не ответил ….


 
sniknik ©
 
(2011-05-20 13:15)
[14]

а [1] это что?


 
Anatoly Podgoretsky ©
 
(2011-05-20 13:23)
[15]


> samalex2504   (20.05.11 13:04) [13]

Плохой танцор, хороший папа.


 
samalex2504
 
(2011-05-20 14:05)
[16]

Удалено модератором
Примечание: Обсуждение модерирования


 
Amoeba_
 
(2011-05-20 15:12)
[17]


> Как программно задать формат ячейки?

Читать здесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1274#09


 
Palladin ©
 
(2011-05-20 18:12)
[18]


> sniknik ©   (20.05.11 13:15) [14]

забей, пациент неадекватен


уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Итак, сегодня разберемся как сделать наш лист Excel более красивым, а именно разберемся со следующими вопросами:

    1. Как добраться до конкретной границы ячейки?
    2. Как изменить внешний вид границы?
    3. Как сделать заливку ячеек цветом?
    4. Как изменить шрифт в ячейках?

1. Как добраться до конкретной границы ячейки?

Excel_BordersПеред Вами окно изменения формата ячеек. Вкладка «Границы». Как видите Excel может отрисовывать следующие границы ячеек:

  • верхнюю
  • нижнюю
  • левую
  • правую
  • диагональную из верхнего левого угла в нижний правый
  • диагональную из верхнего правого угла в нижний левый

Если Вы выбираете диапазон ячеек, то дополнительно добавляются ещё два вида границ:

  • внутренние горизонтальные
  • внутренние вертикальные.

Кроме этого, Вы можете определить свой стиль линий для прорисовки и цвет линий. В самом Excel работа с форматом ячеек достаточно прозрачна и ясна. А вот при работе с Excel в Delphi все обстоит не так уж и радужно :)

Прежде чем браться за прорисовку границ, следует определиться — какой объект Вы будете для этого использовать. Вы можете прорисовать границу с помощью объектов:

  1. Cells — ячейка
  2. Range — диапазон ячеек
  3. UsedRage — диапазон занятых ячеек

Я обычно использую третий вариант (UsedRange), так как работаю с форматами ячеек после того как перешлю необходимые данные в Excel. Кроме того, если пересылается большая таблица с данными, то использовать Cells — значит очень сильно «подвесить» свое приложение, так как надо будет добраться до каждой ячейки и изменить её формат.

Итак, будем использовать UsedRange. Теперь разберемся как нам добраться до границ.

Для того, чтобы получить доступ к коллекции границ объекта достаточно воспользоваться объектом Borders. Так как нам необходим доступ не ко всем границам, а только к конкретной, то после Borders необходимо указывать индекс границы.  В Excel определены следующие константы:

xlDiagonalDown 5 Диагональная от верхнего левого угла в нижний правый каждой ячейки в диапазоне
xlDiagonalUp 6 Диагональная из нижнего левого угла в правый верхний каждой ячейки в диапазоне.
xlEdgeBottom 9 Нижняя для всего диапазона ячеек
xlEdgeLeft 7 Левая для всего диапазона ячеек.
xlEdgeRight 10 Правая для всего диапазона ячеек.
xlEdgeTop 8 Верхняя для всего диапазона ячеек.
xlInsideHorizontal 12 Горизонтальные границы всех внутренних ячеек диапазона
xlInsideVertical 11 Вертикальные границы всех внутренних ячеек диапазона

Теперь переносим эти константы в наш модуль работы с Excel:

uses ....
const
  xlDiagonalDown = 5;
  xlDiagonalUp = 6;
  xlEdgeBottom = 9;
  xlEdgeLeft = 7;
  xlEdgeRight = 10;
  xlEdgeTop = 8;
  xlInsideHorizontal = 12;
  xlInsideVertical = 11;
....

И для того, чтобы получить доступ, например к нижней границе диапазона ячеек, пишем следующий код:

MyExcel.ActiveWorkBook.ActiveSheet.UsedRange.Borders[xlEdgeBottom]

Аналогичным образом Вы можете получить доступ к любой из восьми границ.

2. Как изменить внешний вид границы?

Доступ к границе получен. Теперь можно приступать к изменению внешнего вида.

Объект Borders имеет следующие свойства:

  • LineStyle — стиль линии границы
  • ColorIndex — индекс цвета границы
  • Weight — толщина границы

Для каждого из этих свойств в Excel определены свои счётчики (Enumerators) или, говоря на языке Delphi — константы.

Стили линий (LineStyle) могут быть следующие:

xlContinuous 1 Непрерывная линия
xlDash -4115 Пунктирная линия
xlDashDot 4 Пунктир с точкой
xlDashDotDot 5 Пунктир с двумя идущими подряд точками
xlDot -4118 Линия из точек
xlDouble -4119 Двойная линия
xlLineStyleNone -4142 Без линий
xlSlantDashDot 13 Наклонная пунктирная

Стандартные индексы цветов, которые вы можете использовать при прорисовке границы представлены на рисунке:

Colors

Для толщины линии определены константы:

xlHairline 1 Самая тонкая граница
xlMedium -4138 Средняя толщина
xlThick 4 Толстая граница
xlThin 2 Тонкая граница

Определите эти константы в своем модуле Delphi и можете приступать к прорисовке границ. Например, нам необходимо прорисовать внешние границы таблицы двойной линией, а внутренние — тонкими сплошными. Цвета линий оставим по умолчанию — черными. Тогда код Delphi будет выглядеть следующим образом:

...
with MyExcel.ActiveWorkBook.ActiveSheet.UsedRange do
  begin
    Borders[xlEdgeBottom].LineStyle:=xlDouble;
    Borders[xlEdgeTop].LineStyle:=xlDouble;
    Borders[xlEdgeLeft].LineStyle:=xlDouble;
    Borders[xlEdgeRight].LineStyle:=xlDouble;
    Borders[xlInsideHorizontal].LineStyle:=xlSolid;
    Borders[xlInsideVertical].LineStyle:=xlSolid;
  end;
...

Аналогичным образом Вы можете изменять границы отдельных ячеек и диапазонов, например выделить шапку таблицы или сделать перечёркнутой верхнюю левую ячейку и т.д.

Переходим к следующему вопросу.

3. Как сделать заливку ячеек цветом?

Для заливки ячеек цветом можно использовать те же константы, что и при работе с ячейками. Однако ни объект Range ни Cells не имеют свойства ColorIndex. Чтобы получить доступ к заливке ячейки или диапазона необходимо воспользоваться свойством Interior, которое дает доступ к внутренней части объекта. Например, выполнив операцию:

MyExcel.ActiveWorkBook.ActiveSheet.UsedRange.Interior

вы получите доступ к внутренней части диапазона занятых ячеек, т.е. по сути, ко всей таблице. А получив такой доступ, Вы можете делать с объектом всё, что угодно. Например изменим цвет нашей таблицы на красный:

MyExcel.ActiveWorkBook.ActiveSheet.UsedRange.Interior.ColorIndex:=3;

4. Как изменить шрифт в ячейках?

Для того, чтобы получить доступ к шрифтам, необходимо добраться до одного из свойств UsedRange, а именно до свойства Font, которое и вернет нам объект, позволяющий изменять шрифт, цвет шрифта и прочие атрибуты . Например, изменим цвет шрифта в таблице на синий:

MyExcel.ActiveWorkBook.ActiveSheet.UsedRange.Font.ColorIndex:=5;

Аналогичным образом, через объект Font Вы можете также изменить:

  • Толщину шрифта
  • Наклон
  • Размер
  • Сделать текст подчёркнутым и т.д.

Для этого достаточно воспользоваться одним из свойств объекта Fonts.

5
2
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Понравилась статья? Поделить с друзьями:
  • Как в delphi открывать документы word
  • Как в delphi границы ячеек в excel
  • Как в dbeaver выгрузить данные в excel
  • Как в corel вставить word в
  • Как в colab импортировать файл excel