Delphi excel ячейку как текст

useruser

165 / 89 / 38

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

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

1

06.03.2017, 14:32. Показов 6021. Ответов 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



Модератор

8379 / 5580 / 2275

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

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

Записей в блоге: 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



Содержание

  1. How do I set Excel column types and formatting?
  2. 2 Answers 2
  3. Excel в Delphi. Работа с объектом Range (диапазон)
  4. 1. Что такое Range и как его получить?
  5. 2. Свойства объекта Excel Range.
  6. Formula
  7. Value
  8. Column
  9. Columns
  10. Comment
  11. Address
  12. 3. Методы объекта Excel Range.
  13. CheckSpelling
  14. PrintPreview
  15. AutoFill
  16. AutoFit
  17. Методы очистки данных диапазона Range
  18. Методы работы с буфером обмена Excel
  19. Merge

How do I set Excel column types and formatting?

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:

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.

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

2 Answers 2

The problem is that the assigned values are Unicode strings. Try this:

You haven’t said «how you are doing things manually» which means people have to completely guess what you’re doing. So here’s my wild guess:

If I assume you’re using the Express Spreadsheet component from Developer Express I have estensive experience with this component. It does not support arbitrary numeric formats. It supports a «money» format (0.00) with exactly two decimal places. It does not support three or one, or any other number of decimal places. If so, this is a known by-design issue in the Express spreadsheet.

If by manually you mean that «sheet» as you show above is an OLE object and you’re communicating via OLE Automation to Excel itself, then you should be formatting CELLS either individually or as a range, and not column objects. I am not sure how column object formats would ever override the cell values, if they do at all. The formatting of cells is generally a cell by cell matter, and must be dealt with as such.

If you really want this to work properly you won’t use Excel via OLE automation, you’ll get a proper Excel XLS format capable writing library. I was quite sure that you could get proper results directly from the CX (DevEx) db grid, but I would ask on their forums, not here. With a regular DB Grid, I’d just use TJvDBGridExcelExport which comes in the Jedi JVCL, and which works with the regular VCL DB Grid.

Источник

Excel в Delphi. Работа с объектом Range (диапазон)

Сегодняшняя статья блога будет целиком посвящена работе с Excel Range или, говоря другими словами — работе с диапазонами ячеек Excel.

Про работу с этими объектами я уже вкратце говорил, а сегодня хотел бы поделиться с вами более полной информацией. Итак, начнем с самого простого.

1. Что такое Range и как его получить?

Согласно официальному определению Microsoft, Range :

представляет собой ячейки, строки, столбцы, набор ячеек, содержащих один или более смежных блоков ячеек, или 3-D диапазон.

Однако это определение не исключает того, что объектом Range может выступать и одна ячейка (Cell) листа. Таким образом, чтобы получить в свое распоряжение объект Range, можно выполнить следующие операции c объектом Excel в Delphi:

Если Вам неудобно в какой-либо ситуации использовать буквенные обозначение ячеек или Вы привыкли до этого момента иметь дело только с отдельными ячейками (Cells), то объект Range можно получить например вот так:

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

2. Свойства объекта Excel Range.

Рассмотрим основные свойства объекта Range и их применение работе в Excel в Delphi.

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

Свойство Описание
Formula Возвращает или помещает в диапазон формулу
Value Возвращает или устанавливает значение для диапазона
Text возвращает текст из ячейки
Column Возвращает номер первого столбца в первой области, в указанном диапазоне
Columns возвращает объект Range, представляющий собой один столбец из всего диапазона
Comment Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.
Address Возвращает реальный адрес диапазона Range

Formula

Возвращает или помещает в диапазон формулу.

Value

Возвращает или устанавливает значение для диапазона.Свойство Value замечательно тем, что с помощью него можно записать в ячейки абсолютно любые данные, особо не задумываясь о формате данных. Например, запишем в ячейки диапазона строку, число типа integer и число типа single: чтобы каждый раз не повторяться в листингах и не писать одни и те же элементы по 100 раз, будем считать, что в переменной Sheet уже содержится ссылка на активный лист (ActiveWorkSheet) активной книги (ActiveWorkBook) Excel (MyExcel)

Как видите, обращение к ячейкам было одно и то же и нигде я не приводил данный к какому-то типу — записал в ячейки всё как есть.

Если Вы хотите записать в весь диапазон Range одно и то же значение, то просто выполните:

и получите одну и ту же строку «Hello World!» в десяти ячейках Excel, но такие операции очень редко необходимы при работе с Excel в Delphi. Зато очень часто необходимо воспользоваться другой стороной свойства Value — прочитать большой объем данных из книги Excel за один прием и получить весь массив данных в Delphi. Операция чтения данных из Excel в Delphi более проста, чем Вам может показаться на первый взгляд. Проведем обратную операцию — прочитаем данные из Excel:

Как видите здесь мы за один прием прочитали данные сразу из трех ячеек Excel и отобразили их в сообщении. Этот прием чтения на порядок более скоростной, чем, например чтение содержимого каждой ячейки (Cells) в отдельности.

Ещё одно простенькое свойство объекта Range — возвращает текст из ячейки. Самое главное отличие от свойства Value Text возвращает string только для чтения и использовать это свойство для чтения большого объема данных, как в предыдущем примере — ни в коем случае нельзя, так как переменная Val вернет значение Null.

Column

Возвращает номер первого столбца в первой области, в указанном диапазоне. Свойство только для чтения.

Чтобы продемонстрировать свойство в действии, давайте создадим такие диапазоны как показано на рисунке:

То есть каждый из диапазонов Range будет содержать по две несвязанные друг с другом области (Area). Причем первая область диапазона Range будет начинаться в столбце А, а первая область второго диапазона (Range 2) — в столбце B.

После того, как диапазоны будут созданы — посмотрим, что вернет нам свойство Column для каждого из диапазонов.

Листинг процедуры создания двух несвязных диапазонов Range следующий:

Так, в случае с первым Range Column вернет нам значение 1, а для второго Range — значение 2.

Columns

В отличие от предыдущего свойства, Columns возвращает не простое число, а объект Range, представляющий собой один столбец из всего диапазона.

Посмотрим как, например, используя это свойство можно изменять столбцы во всем диапазоне Range.

Для демонстрации воспользуемся предыдущим примером, изменим только окончание:

В итоге в каждый из столбцов диапазона должна записаться строка с номером этого столбца, результат представлен на рисунке. Как видите, в цикле все столбцы обработались «насквозь», хотя Range не содержал в себе столбец D.

Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.

Для демонстрации свойства не будем заходить в Excel, поработаем с приложением прямо из Delphi. Для этого воспользуемся методом AddComment. То есть сначала запишем комментарий в ячейку, а потом прочитаем его используя свойство Comment:

Address

Возвращает реальный адрес диапазона Range. Например для диапазона ячеек, заданных вот таким образом:

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

Помимо перечисленных выше свойств к объекту Range применимы все свойства, описанный в статье об изменении внешнего вида ячеек Excel, т.е. borders, color и пр.

3. Методы объекта Excel Range.

Теперь рассмотрим несколько полезных методов, которые могут Вам пригодиться при работе с Excel в Delphi.

Метод Описание
CheckSpelling Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены
PrintPreview Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек
AutoFill Автозаполнение диапазона ячеек на основе данных из другого диапазона
AutoFit Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.
Clear Удаляет все данные из диапазона
ClearComments Удаляет все комментарии в диапазоне Range
ClearContents Удаляет все формулы из диапазона Range
ClearFormats Очищает форматы в диапазоне Range
ClearNotes Очищает все заметки в диапазоне Range
Copy Копирует содержимое диапазона Range в буфер обмена или в другой диапазон
PasteSpecial Специальная вставка диапазона
Cut Вырезает данные и при необходимости вставляет их в новый диапазон
Merge Объединение ячеек диапазона

CheckSpelling

Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены. Замечательной особенностью этого метода является то, что окно замены появляется даже при скрытом окне Excel, то есть, когда свойство Visible у объекта Excel равно false.

Вызывается метод без каких-либо дополнительных параметров:

PrintPreview

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

не забывайте включить свойство Visible у Excel:

AutoFill

Автоматическое заполнение диапазона ячеек на основе данных из другого диапазона.

Параметр Тип Описание
Destination Variant представляет собой объект Range уже заполненных ячеек. Эти ячейки должны входить в автозаполняемый диапазон
Type Integer тип автозаполнения (возможные значения см. ниже)

Рассмотрим применение метода на примере.

В результате лист Excel примет следующий вид:

Как видите все столбцы второго диапазона Range заполнились значениями из диапазоны Source.

При использовании этого метода следует иметь в виду, что диапазон-источник (в нашем случае — это source) по одному из измерений должен совпадать с источником назначения. В приведенном примере совпадает размерность по строкам (в обоих диапазонах их шесть). Если размерности диапазонов не совпадают, то возникает исключительная ситуация.

При использовании метода мы использовали одну из констант в параметре TypexlFillDefault = 0. Используя её мы скопировали данные один-к-одному. Дополнительно Вы можете использовать следующие константы при автозаполнении:

Имя Значение Описание
xlFillDefault 0 скопировать данные один-к-одному
xlFillDays 5 копирование дней недели с расширением, т.е., если Вы запишете в ячейку слово «Понедельник» и попробуете провести автозаполнение ещё на 2 строки, то во второй и третьей строке появятся «Вторник» и «Среда»
xlFillCopy 1 копирует все данные и форматы, повторяя при необходимости
xlFillFormats 3 копирует только форматы источника
xlFillMonths 7 копирует названия месяцев. Работает аналогично xlFillDays
xlFillSeries 2 копирует данные с расширением, например 1,2,3 будут при копировании расширены до 4,5,6 и т.д. Также копирует форматы данных
xlFillValues 4 копирует только значения
xlFillWeekdays 6 копирует дни рабочей недели, работает аналогично xlFillDays, но только до пятницы
xlFillYears 8 копирует года. Работает аналогично xlFillDays
xlGrowthTrend 10 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее, но умноженное на некоторую величину. Например 1,2 раскопируются в 4, 8, 16 и т.д. Формат данных также копируется
xlLinearTrend 9 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее + некоторая величина. Например 1,2 раскопируются в 3, 4, 5 и т.д. Формат данных также копируется

AutoFit

Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.

Приведет и изменению ширины столбца А таким образом, чтобы число было полностью видно на листе.

Методы очистки данных диапазона Range

Есть несколько различных методов очистки содержимого диапазона Range при работе с Excel в Delphi.

1. Clear

Удаляет все данные из диапазона.

2. ClearComments

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

3. ClearContents

Удаляет все формулы из диапазона Range

4. ClearFormats

Очищает форматы в диапазоне Range

5. ClearNotes

Очищает все заметки в диапазоне Range

Методы работы с буфером обмена Excel

1. Copy

Копирует содержимое диапазона Range в буфер обмена или в другой диапазон.

Попробуем реализовать работу метода следующим образом: заполним столбец А некоторыми значениями, а затем скопируем его сначала в буфер, а потом в столбец Е:

А для того, чтобы вставить данные из буфера обмена существует ещё один метод

2. PasteSpecial

Параметр Тип Описание
Paste Integer определяет какая часть данных диапазона будет вставлена (возможные значения см. ниже)
Operation Integer операция, которая будет выполнена при вставке данных (возможные значения см. ниже)
SkipBlanks boolean True, для того чтобы пустые ячейки из буфера обмена не вставлялись в диапазон назначения. Значение по умолчанию False
Transpose boolean транспонирование столбцов и строк после вставки. По умолчанию устанавливается значение False

При определении параметра Paste следует использовать следующие константы:

Имя Значение Описание
xlPasteAll -4104 Вставка всех данных
xlPasteAllExceptBorders 7 Вставка всего содержимого за исключением вида границ диапазона
xlPasteAllUsingSourceTheme 13 Вставка всего содержимого, используя тему оформления источника
xlPasteColumnWidths 8 Копирует ширину столбцов
xlPasteComments -4144 Вставка комментариев
xlPasteFormats -4122 Вставка форматов данных
xlPasteFormulas -4123 Вставка формул
xlPasteFormulasAndNumberFormats 11 Вставка формул и чисел
xlPasteValidation 6 Вставка проверок
xlPasteValues -4163 Вставка значений
xlPasteValuesAndNumberFormats 12 Вставка значений и чисел

При использовании параметра Operation следует использовать следующие константы:

Имя Значение Описание
xlPasteSpecialOperationAdd 2 К скопированным данным будут добавлены значения из целевых ячеек
xlPasteSpecialOperationDivide 5 Скопированные данные будут разделены на значения в целевых ячейках
xlPasteSpecialOperationMultiply 4 Скопированные данные будут умножены на значения в целевых ячейках
xlPasteSpecialOperationNone -4142 При вставке значений никакие операции не будут применяться
xlPasteSpecialOperationSubtract 3 Из скопированных данных будут вычитаться значения целевых ячеек

Теперь рассмотрим применение метода на примере. В качестве исходных данных возьмем данные из предыдущего примера, но для вставки используем метод PasteSpecial:

После выполнения этой операции все данные вставятся в диапазон Range2, т.к. диапазон до вставки был пуст, то данные скопировались один-к-одному.

3. Cut

Вырезает данные и при необходимости вставляет их в новый диапазон. Метод работает аналогично методу Copy, но с последующим удалением данных из источника.

Merge

Объединение ячеек диапазона.

Для новичков, только начинающих постигать азы работы с excel в Delphi этот метод в какой-то момент становится камнем преткновения :). Дело в том, что очень часто возникает необходимость объединить часть ячеек листа для записи в объединенную область большого количества данных или длинной строки. В Excel есть такой метод Union, который и отвечает за объединение — им-то и пробуют пользоваться многие. А метод Union при вызове из Delphi применительно к диапазону Range вызывает исключительную ситуацию. Про Merge люди либо не знают, либо забывают. А использовать его достаточно просто:

Источник

Как програмно произвести форматирование ячеек в excel (например сделать ячейку в текстовом формате, изменить ширину столбца и т.д.)

Когда-то давно занималась этой проблемой, вот кусочек кода,

наверное можно делать и как-то по-другому, это просто как вариант

ответа на твой вопрос.

procedure TFMenu21.RadioButton5Click(Sender: TObject);

const

xlCenter=-4108;

XLWBatWorksheet=-4167;// для создания книги с одной страницей

Var

xl : OleVariant;

x,i,first : integer; // first для переименования страницы с именем «Лист1»

x1,y1 : integer; // для выделения диапазона в Excel

begin

try

// Excel уже запущен?

xl:=GetActiveOleObject(«Excel.Application»);

ShowMessage(«У Вас уже загружен Excel.Завершите его работу, а затем повторите вывод»);

xl.Application.WindowState:=-4137;

//xl.Visible:=True;

xl.Quit;

xl:=Unassigned;

Exit;

except

// Hет, еще нет…

xl:=CreateOleObject(«Excel.Application»);

end;

xl.Workbooks.Add[XLWBatWorksheet];

// xl.Visible:=True;

first:=1;

x1:=0;

Y1:=0;

For i:=3 downto 1 do begin

x:=2;

if first=0 then xl.Workbooks[1].Worksheets.Add else first:=0;

If i=1 then

begin

xl.Range[xl.Cells[x,2],xl.Cells[x+1,14]].MergeCells:=True; // объединение ячеек

xl.Range[xl.Cells[x,2],xl.Cells[x+1,14]].WrapText:=True; // перенос текста

xl.Workbooks[1].Worksheets[1].Name:=»имя страницы»;

// Вывожу какую-то шапку таблицы

x:=x+1;

xl.Range[xl.Cells[x,2],xl.Cells[x+2,2]].MergeCells:=True; // объединение ячеек

xl.Cells[x,2]:=»столбик 1″;

xl.Range[xl.Cells[x,3],xl.Cells[x+1,4]].MergeCells:=True; // объединение ячеек

xl.Cells[x,3]:=»столбик 2″;

// Вывожу данные из Ttable (DM.TsvodD1) в Excel

DM.TSvodD1.Open;

DM.TSvodD1.First;

x1:=x; // запоминаю начальную строку

While not DM.TSvodD1.Eof do

begin

xl.Workbooks[1].WorkSheets[1].Activate;

xl.ActiveWindow.DisplayZeros:=False; // не показывать нули

xl.ActiveWindow.DisplayGridlines:=False; // не показывать сетку

// жирный шрифт xl.Range[xl.Cells[x,2],xl.Cells[x,2]].Font.Bold:=True;

xl.Cells[x,2]:=DM.TSvodD1F.Value;

if DM.TSvodD1T.Value=1 then xl.Cells[x,3]:=»< 0.2″;

if DM.TSvodD1T.Value=2 then xl.Cells[x,3]:=»0.2-0.3″;

// if DM.TSvodD1T.Value=3 then xl.Cells[x,3]:=»> 0.3″;

if DM.TSvodD1T.Value=3 then xl.Cells[x,3]:=» 0.5 «;

xl.Cells[x,4]:=DM.TSvodD1M.Value;

xl.Range[xl.Cells[x,7],xl.Cells[x,7]].NumberFormat:=»@»; // установка текстового формата для ячейки

xl.Cells[x,14]:=DM.TSvodD1Proc.Value;

x:=x+1;

DM.TSvodD1.Next;

end; // while not TSvodD1.Eof

y1:=x-1; // запоминаю конечную строку

// вывожу итоги

xl.Workbooks[1].WorkSheets[1].Rows.Rows[x].RowHeight:=44.25; // высота строки

xl.Range[xl.Cells[x,2],xl.Cells[x,14]].WrapText:=True;

// Форматирую

xl.Workbooks[1].worksheets[1].Range[xl.Cells[1,2],xl.Cells[x,14]].VerticalAlignment:=2;

xl.Workbooks[1].worksheets[1].Range[xl.Cells[x-3,2],xl.Cells[x,14]].HorizontalAlignment:=xlCenter; // выводить в центре ячейки

xl.Workbooks[1].worksheets[1].Range[xl.Cells[x-3,2],xl.Cells[x,14]].Font.Bold:=True;

xl.Workbooks[1].worksheets[1].Range[xl.Cells[x-3,3],xl.Cells[x-3,14]].Borders.Weight := 2;

// устанавливаю ширину колонок

xl.Workbooks[1].worksheets[1].Columns.Columns[1].ColumnWidth:=2.43;

// границы ячейки

xl.Workbooks[1].worksheets[1].Range[xl.Cells[x1,2],xl.Cells[y1,2]].NumberFormat:=»0,0″;

xl.Range[xl.Cells[x1,4],xl.Cells[y1,4]].NumberFormat:=»0,0″;

xl.Visible:=True;

Можно сделать проще, запусти Excel, запусти запись макроса и делай что тебе нужно, то как ворматирование текста, установка ширины ячейки, да всё что угодно, а потом смотри что он там на генерировал в Visual Basice …..

Спасибо Татьяна, попробую.

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.

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


Понравилась статья? Поделить с друзьями:
  • Delphi excel шрифт ячейки
  • Delphi excel шрифт жирный
  • Delphi excel шрифт в ячейке
  • Delphi excel ширина строки
  • Delphi excel ширина колонки