Высота ячеек excel delphi

 
cad2206
 
(2004-09-08 15:44)
[0]

Подскажите, как?
Строка типа ExcelWorksheet.Rows.Height:=67 вызывает ошибку:
cannot assign to a resd-only property


 
Антоныч
 
(2004-09-08 15:56)
[1]

Высота и ширина ячейки

Чтобы формировать вид документа в процессе его создания, недостаточно только функций записи информации в ячейки, необходимо также изменять ее визуальные параметры. Самое простое, с чего можно начать, — изменение ширины столбцов и высоты строк. Доступ к ширине столбцов можно получить, используя коллекцию Columns. Используя номер колонки в буквенном или числовом формате и свойство коллекции ColumnWidth, можно изменить ширину столбца или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает ширину столбца.

Function SetColumnWidth (sheet:variant;
 column:variant;width:real):boolean;
begin
SetColumnWidth:=true;
try
 ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Columns
  [column].ColumnWidth:=width;
except
 SetColumnWidth:=false;
end;
End;
Для определения ширины столбца используйте следующий оператор: width:=ExcelApplication.ActiveWorkbook .Sheets.Item[sheet].Columns[column].ColumnWidth;

Доступ к высоте строк можно получить, используя коллекцию Rows. Назначая номер строки и свойство коллекции RowHeight, можно изменить высоту строки или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает высоту строки.

Function SetRowHeight (sheet:variant;row:variant;
 height:real):boolean;
begin
SetRowHeight:=true;
try
 ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight:=height;
except
 SetRowHeight:=false;
end;
End;
Для определения высоты строки используйте следующий оператор: height:=ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight;

Есть подробная документация по взаимодействию Delphi с Word и Excel. Могу выслать на мыло.


 
cad2206
 
(2004-09-08 16:34)
[2]

Антоныч, эта функция устанавливает размер для всех ячеек на странице, мне нужно отдельно для каждой ячейки…?


 
BillyJeans
 
(2004-09-08 17:34)
[3]

а может отдельно для каждой строки???


 
YurikGL ©
 
(2004-09-08 21:11)
[4]

http://www.delphimaster.ru/cgi-bin/anketa.pl?id=1084962208

интересное о себе…


 
DarkMan
 
(2004-09-09 09:53)
[5]

WorkSeet.Columns[«B:B»].RowHeight := xx;

либо
WS.Range[WS.Cells[xx,yy],ExcWS.Cells[xx,yy]].Select;
ExcApp.Selection.RowHeight = xx;


 
pavel_guzhanov
 
(2004-09-09 13:01)
[6]

var m_XLApp, Sheet, Colum, Row:Variant;
begin  
 m_XLApp:=CreateOleObject(«Excel.Application»); //Запуск Excel
 m_XLApp.Visible:=true;   //видимый
 m_XLApp.Workbooks.Add(-4167);  // добавили книгу
 m_XLApp.Workbooks[1].Worksheets[1].Name:=»Список сотрудников»;
 Sheet:=m_XLApp.Workbooks[1].Worksheets[«Список сотрудников»];
 Sheet.PageSetup.Orientation:=xlLandscape;
 Colum:=m_XLApp.Workbooks[1].Worksheets[«Список сотрудников»].Columns; //столбцы
 Row:=m_XLApp.Workbooks[1].Worksheets[«Список сотрудников»].Rows; //строки
 //ширина столбцов
 Colum.Columns[1].ColumnWidth:=5;
 Colum.Columns[2].ColumnWidth:=16;
 Colum.Columns[3].ColumnWidth:=16;
 Colum.Columns[4].ColumnWidth:=33;
 Colum.Columns[5].ColumnWidth:=23;
 Colum.Columns[6].ColumnWidth:=30;
end;


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

Продолжаем копаться в листах Excel и изучать особенности работы с ними. Сегодня мы рассмотри свойства объекта WorkSheet.

Основными свойствами, которые Вы с большой вероятностью будете использовать в своей работе с Excel в Delphi являются:

  1. Cells — ячейки
  2. Columns — столбцы
  3. Name — название листа
  4. Range — диапазон ячеек
  5. Rows — сроки
  6. StandartHeight — высота строк «по умолчанию»
  7. StandartWidth — ширина столбцов «по умолчанию»
  8. UsedRange — задействованный диапазон ячеек
  9. Comments — комментарии

Всего у листа рабочей книги Excel насчитывается 54 различных свойств, но, как показвает практика, для использования Excel в Dephi достаточно 9-15 различных свойств листа, чтобы получить необходимый результат, обеспечивающий удобство и наглядность представляемых данных.

Рассмотрим применение указанных выше свойств листа Worksheet при работе с Excel в Delphi.

1. Свойство Cells

Возвращает объект диапазона, который представляет собой все ячейки на листе (а не только клетки, которые используются в настоящее время)

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Cells

Однако использование свойства Cells возможно (и более практично) в другом виде. Вы можете указать сразу за словом Cells номера столбца и строки и, таким образом, получить доступ к конкретной ячейке листа. Например, забегая немного вперед, посмотрим, как можно удалить формулы из ячейки:

MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3].ClearContents

Выполнив такую операцию Вы удалите из ячейки С5 формулу (или любое другое содержимое). Как можно заметить, в отличие от работы с таблицами StringGrid Delphi, здесь вначале указывается номер строки, а затем номер столбца (у String Grid напротив — сначала указывается номер столбца, а затем номер строки).

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

MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3]:='Пример текста'

Ну, а чтобы показать использование этого свойства на примере, давайте напишем простенькую процедуру копирования таблицы StringGrid в любую область листа Worksheet Excel.

procedure WriteTable(FirstCol, FirstRow:integer; Grid: TStringGrid);
var col,row:integer;
begin
  try
    for col := 0 to Grid.ColCount - 1 do
      for row := 0 to Grid.RowCount - 1 do
        MyExcel.ActiveWorkBook.ActiveSheet.Cells[FirstRow+row+1, FirstCol+col+1]:=Grid.Cells[col, row];
  except
    raise Exception.Create('Запись таблицы завершилась ошибкой')
  end;
end;

Здесь в качестве параметров процедуры необходимо задать: номера первого столбца (FirstCol) и первой строки (FirstRow) на листе Excel, начиная с которых необходимо копировать данные из таблицы StringGrid (Grid). Заметьте, что вызов свойств Cells у StringGrid и WorkSheet происходит по-разному (см. индексы ячейки).

Естественно, что представленная процедура может с легкостью применяться при копировании небольших таблиц. Однако при импорте больших объемов данных в Excel эта процедура будет очень сильно тормозить работы основной программы. Более скоростной способ импорта данных из Excel в Delphi и наоборот мы рассмотрим позже, при рассмотрении объекта Range.

2. Свойство Columns

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

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Columns

Это свойство удобно использовать при редактировании столбцов данных. Например вот так:

MyExcel.ActiveWorkBook.ActiveSheet.Columns[1].Font.Bold

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

3. Свойство Name

С этим свойством мы уже сталкивались. Свойство Name возвращает имя рабочего листа книги.

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Name:='Новое название листа'

Так мы изменили имя текущего активного листа Excel. Кроме этого, свойство Name удобо использовать при поиске необходимого листа.

4. Свойство Range

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

Пример вызова:

MyExcel.ActiveWorkBook.ActiveSheet.Range['A1']:='Hello World'

Так, мы получили доступ к ячейке А1 и записали в неё текст. А следующий фрагмент кода демонстрирует быстрый способ экспорта данных из листа Excel в Delphi:

var Numbers : Variant;
    data: string;
    i: integer;
begin
...
  Numbers:=MyExcel.ActiveSheet.Range[Num+IntToStr(FirstRows), Num+IntToStr(Rows)].Value;
  for i:=1 to MyExcel.ActiveSheet.UsedRange.Rows.Count do
    data:=Numbers[i,1]
...
end;

Так, мы за одно обращение к листу считали столбец данных и в дальнейшем, не используя напрямую объект WorkSheet, обработали все данные в вариантном массиве Numbers. Этот способ чтения данных с листа Excel является наиболее скоростным из всех известных мне в настоящее время. Если знаете способ более скоростной — буду очень рад, если поделитесь им.

5. Свойство Rows

Это свойство аналогично свойству Columns, но в отличие от него, возвращает объект, представляющий собой строку листа. С помощью этого свойства Вы также можете изменять внешний вид ячеек листа, изменять шрифт и т.д.

6. Свойства StandartHeight и StandartWidth

Эти свойства позволяют получить значения высоты и ширины ячеек листа «по умолчанию». Свойство доступно только для чтения, т.е. вызов:

MyExcel.ActiveWorkBook.ActiveSheet.StandartHeight:=14

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

7. Свойство UsedRange

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

Rows:=MyExcel.ActiveSheet.UsedRange.Rows.Count;

Columns:=MyExcel.ActiveSheet.UsedRange.Columns.Count;

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

Это свойство возвращает коллекцию комментариев на листе.

Например:

MyExcel.ActiveSheet.Comments[2].Delete

удалит второй комментарий из коллекции, а:

MyExcel.ActiveSheet.Range("e5").AddComment('Текст комментария')

добавит в ячейку е5 новый комментарий.

Итак, резюмируем. Сегодня мы узнали: как записать данные в ячейку листа Excel, как прочитать данные из диапазона ячеек, как скопировать таблицу из Delphi в Excel, как быстро экспортировать данные из Excel в Delphi.

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

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

0 / 0 / 0

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

Сообщений: 16

1

19.12.2011, 00:26. Показов 25550. Ответов 6

Метки autofit, excel, ms excel, vba, выравнивание по высоте, выравнивание по ширине, высота ячейки, объединённые ячейки, подбор высоты, подбор ширины, подгон высоты, подгон размера, подгон ширины, размер ячейки, ячейка, ячейки (Все метки)


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

В ячейку вставляется очень длинный текст, который при печати просто не виден. Нужно, чтобы продолжение текста переносилось в сторку ниже.
Пишу на Delphi.



0



Mawrat

13094 / 5875 / 1706

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

Сообщений: 8,808

19.12.2011, 04:05

2

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

Решение

Для такой ячейки надо выставить свойство WrapText := True.

Delphi
1
2
3
4
5
var
  exCell, ... : Variant;
begin
...
  exCell.WrapText := True; //Перенос текста по словам.

После того, как во всех ячейках нужного диапазона текст будет установлен, можно выполнить подбор высоты строк так, чтобы весь текст с учётом переносов оказался видимым:

Delphi
1
2
3
4
5
var
  exRange, ... : Variant;
begin
...
  exRange.Rows.AutoFit; //Подпор высоты строк по содержимому ячеек.

Также можно выполнять подгонку ширины столбцов:

Delphi
1
2
3
4
5
var
  exRange, ... : Variant;
begin
...
  exRange.Columns.AutoFit; //Подпор ширины столбцов по содержимому ячеек.



4



Fistashka

0 / 0 / 0

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

Сообщений: 16

19.12.2011, 13:11

 [ТС]

3

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

Для такой ячейки надо выставить свойство WrapText := True.

Delphi
1
2
3
4
5
var
  exCell, ... : Variant;
begin
...
  exCell.WrapText := True; //Перенос текста по словам.

После того, как во всех ячейках нужного диапазона текст будет установлен, можно выполнить подбор высоты строк так, чтобы весь текст с учётом переносов оказался видимым:

Delphi
1
2
3
4
5
var
  exRange, ... : Variant;
begin
...
  exRange.Rows.AutoFit; //Подпор высоты строк по содержимому ячеек.

Также можно выполнять подгонку ширины столбцов:

Delphi
1
2
3
4
5
var
  exRange, ... : Variant;
begin
...
  exRange.Columns.AutoFit; //Подпор ширины столбцов по содержимому ячеек.

Спасибо большое, буду пытаться )))

Добавлено через 1 час 11 минут

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

Для такой ячейки надо выставить свойство WrapText := True.

Delphi
1
2
3
4
5
var
  exCell, ... : Variant;
begin
...
  exCell.WrapText := True; //Перенос текста по словам.

После того, как во всех ячейках нужного диапазона текст будет установлен, можно выполнить подбор высоты строк так, чтобы весь текст с учётом переносов оказался видимым:

Delphi
1
2
3
4
5
var
  exRange, ... : Variant;
begin
...
  exRange.Rows.AutoFit; //Подпор высоты строк по содержимому ячеек.

Также можно выполнять подгонку ширины столбцов:

Delphi
1
2
3
4
5
var
  exRange, ... : Variant;
begin
...
  exRange.Columns.AutoFit; //Подпор ширины столбцов по содержимому ячеек.

Все хорошо, но возникает проблема: AutoFit не работает с объединенными ячейками, а у меня именно такие.



0



Mawrat

13094 / 5875 / 1706

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

Сообщений: 8,808

20.12.2011, 21:20

4

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

Все хорошо, но возникает проблема: AutoFit не работает с объединенными ячейками, а у меня именно такие.

Если ячейки объединены по нескольким строкам, то тогда неизвестно для каких из этих строк следует подгонять высоту. Ведь это можно сделать разными способами, изменяя высоту той или иной строки, в пределах объединения. Поэтому метод AutoFit не выполняет изменений для объединённых ячеек.
Такую задачу можно решать по-разному в зависимости от особенностей расположения данных на листе. Например, можно принять такое решение: в случае обнаружения объединения ячеек будем подгонять высоту только верхней строки, входящей в объединение. При этом, изменять высоту, если потребуется, будем только в сторону увеличения. Уменьшать высоту не будем, чтобы не нарушить соотношения по уже сделанным ранее объединениям.
По этому условию в VBA у меня получился такой код:

Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Option Explicit
 
'Эта процедура предназначена для подгона высоты строк по содержимому ячеек
'в пределах заданного диапазона aRng.
Sub RngAutoFit(ByRef aRng As Excel.Range)
  Dim Cell As Excel.Range 'Отдельная ячейка.
  Dim MRng As Excel.Range 'Диапазон объединения ячеек.
  Dim DispAl As Boolean
  Dim nRow As Long
  Dim nCol As Long
  Dim HRow1 As Long 'Высота верхней строки в диапазоне объединения.
  Dim H1 As Long 'Исходная высота по совокупности всех строк объединения.
  Dim H2 As Long 'Наименьшая необходимая высота для показа текста в объединённой ячейке.
  Dim WCol1 As Long 'Исходная ширина левого столбца в диапазоне объединения.
  Dim W1 As Long 'Исходная ширина по совокупности всех столбцов объединения.
  Dim i As Long
  
  If aRng Is Nothing Then Exit Sub
  
  'Подгоняем высоту строк для ячеек, которые не входят в диапазоны объединённых ячеек.
  aRng.Rows.AutoFit
  'Отключаем режим показа предупреждений. Это надо для того, чтобы в следующей части
  'программы не появлялось сообщение с предупреждением о последствиях объединения.
  DispAl = Application.DisplayAlerts
  Application.DisplayAlerts = False
  
  'Перебор всех ячеек диапазона.
  For nRow = 1 To aRng.Rows.Count
  For nCol = 1 To aRng.Columns.Count
    'Берём очередную ячейку.
    Set Cell = aRng.Cells(nRow, nCol)
    'Определяем диапазон объединения, в который входит ячейка Cell.
    Set MRng = Cell.MergeArea
    'Если в самом деле ячейка принадлежит диапазону объединённых ячеек и эта ячейка
    'является левой верхней ячейкой в этом диапазоне, тогда запускаем алгоритм подгона высоты.
    If Cell.MergeCells And (Cell = MRng.Cells(1, 1)) Then
      'Высота верхней строки в диапазоне объединения.
      HRow1 = MRng.Rows(1).RowHeight
      'Подсчитываем исходную высоту диапазона объединения по совокупности всех его строк.
      H1 = HRow1
      For i = 2 To MRng.Rows.Count
        H1 = H1 + MRng.Rows(i).RowHeight
      Next i
      'Ширина левого столбца в диапазоне объединения.
      WCol1 = MRng.Columns(1).ColumnWidth
      'Подсчитываем исходную ширину диапазона объединения по совокупности всех его столбцов.
      W1 = WCol1
      For i = 2 To MRng.Columns.Count
        W1 = W1 + MRng.Columns(i).ColumnWidth
      Next i
      'Теперь разъединяем ячейки.
      MRng.MergeCells = False
      'Ширину левого столбца делаем равным исходной ширине всего диапазона объединения.
      Cell.ColumnWidth = W1
      'Задаём режим переноса текста по словам.
      Cell.WrapText = True
      'Выполняем подгон высоты верхней строки.
      Cell.Rows.AutoFit
      'Выполняем замер получившейся высоты верхней строки.
      'Это наименьшая высота, пригодная для показа текста.
      H2 = Cell.Rows(1).RowHeight
      'Если исходная высота диапазона объединения оказалась меньше, чем наименьшая
      'пригодная высота, то увеличиваем высоту верхней строки на соответствующую величину.
      If H1 < H2 Then
        Cell.Rows(1).RowHeight = HRow1 + (H2 - H1)
      End If
      'Возвращаем левому столбцу диапазона его прежнюю ширину.
      Cell.ColumnWidth = WCol1
      'Объединяем все нужные ячейки.
      MRng.MergeCells = True
    End If
  Next nCol
  Next nRow
  
  'Восстанавливаем прежний режим показа предупреждений.
  Application.DisplayAlerts = DispAl
End Sub
 
'Проверка.
Sub Sub1()
  Dim Rng As Excel.Range
  Dim Sh As Excel.Worksheet
  
  Set Sh = Application.ActiveSheet
  Set Rng = Sh.Range("A1:J5")
  
  RngAutoFit Rng
End Sub

Осталось код процедуры RngAutoFit() перевести на Delphi.

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

Книга MS Excel с этим кодом приложена к сообщению.

Вложения

Тип файла: xls AutoFitForMergeredCells.xls (37.0 Кб, 196 просмотров)



1



Fistashka

0 / 0 / 0

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

Сообщений: 16

20.12.2011, 21:32

 [ТС]

5

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

Если ячейки объединены по нескольким строкам, то тогда неизвестно для каких из этих строк следует подгонять высоту. Ведь это можно сделать разными способами, изменяя высоту той или иной строки, в пределах объединения. Поэтому метод AutoFit не выполняет изменений для объединённых ячеек.
Такую задачу можно решать по-разному в зависимости от особенностей расположения данных на листе. Например, можно принять такое решение: в случае обнаружения объединения ячеек будем подгонять высоту только верхней строки, входящей в объединение. При этом, изменять высоту, если потребуется, будем только в сторону увеличения. Уменьшать высоту не будем, чтобы не нарушить соотношения по уже сделанным ранее объединениям.
По этому условию в VBA у меня получился такой код:

Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Option Explicit
 
'Эта процедура предназначена для подгона высоты строк по содержимому ячеек
'в пределах заданного диапазона aRng.
Sub RngAutoFit(ByRef aRng As Excel.Range)
  Dim Cell As Excel.Range 'Отдельная ячейка.
  Dim MRng As Excel.Range 'Диапазон объединения ячеек.
  Dim DispAl As Boolean
  Dim nRow As Long
  Dim nCol As Long
  Dim HRow1 As Long 'Высота верхней строки в диапазоне объединения.
  Dim H1 As Long 'Исходная высота по совокупности всех строк объединения.
  Dim H2 As Long 'Наименьшая необходимая высота для показа текста в объединённой ячейке.
  Dim WCol1 As Long 'Исходная ширина левого столбца в диапазоне объединения.
  Dim W1 As Long 'Исходная ширина по совокупности всех столбцов объединения.
  Dim i As Long
  
  If aRng Is Nothing Then Exit Sub
  
  'Подгоняем высоту строк для ячеек, которые не входят в диапазоны объединённых ячеек.
  aRng.Rows.AutoFit
  'Отключаем режим показа предупреждений. Это надо для того, чтобы в следующей части
  'программы не появлялось сообщение с предупреждением о последствиях объединения.
  DispAl = Application.DisplayAlerts
  Application.DisplayAlerts = False
  
  'Перебор всех ячеек диапазона.
  For nRow = 1 To aRng.Rows.Count
  For nCol = 1 To aRng.Columns.Count
    'Берём очередную ячейку.
    Set Cell = aRng.Cells(nRow, nCol)
    'Определяем диапазон объединения, в который входит ячейка Cell.
    Set MRng = Cell.MergeArea
    'Если в самом деле ячейка принадлежит диапазону объединённых ячеек и эта ячейка
    'является левой верхней ячейкой в этом диапазоне, тогда запускаем алгоритм подгона высоты.
    If Cell.MergeCells And (Cell = MRng.Cells(1, 1)) Then
      'Высота верхней строки в диапазоне объединения.
      HRow1 = MRng.Rows(1).RowHeight
      'Подсчитываем исходную высоту диапазона объединения по совокупности всех его строк.
      H1 = HRow1
      For i = 2 To MRng.Rows.Count
        H1 = H1 + MRng.Rows(i).RowHeight
      Next i
      'Ширина левого столбца в диапазоне объединения.
      WCol1 = MRng.Columns(1).ColumnWidth
      'Подсчитываем исходную ширину диапазона объединения по совокупности всех его столбцов.
      W1 = WCol1
      For i = 2 To MRng.Columns.Count
        W1 = W1 + MRng.Columns(i).ColumnWidth
      Next i
      'Теперь разъединяем ячейки.
      MRng.MergeCells = False
      'Ширину левого столбца делаем равным исходной ширине всего диапазона объединения.
      Cell.ColumnWidth = W1
      'Задаём режим переноса текста по словам.
      Cell.WrapText = True
      'Выполняем подгон высоты верхней строки.
      Cell.Rows.AutoFit
      'Выполняем замер получившейся высоты верхней строки.
      'Это наименьшая высота, пригодная для показа текста.
      H2 = Cell.Rows(1).RowHeight
      'Если исходная высота диапазона объединения оказалась меньше, чем наименьшая
      'пригодная высота, то увеличиваем высоту верхней строки на соответствующую величину.
      If H1 < H2 Then
        Cell.Rows(1).RowHeight = HRow1 + (H2 - H1)
      End If
      'Возвращаем левому столбцу диапазона его прежнюю ширину.
      Cell.ColumnWidth = WCol1
      'Объединяем все нужные ячейки.
      MRng.MergeCells = True
    End If
  Next nCol
  Next nRow
  
  'Восстанавливаем прежний режим показа предупреждений.
  Application.DisplayAlerts = DispAl
End Sub
 
'Проверка.
Sub Sub1()
  Dim Rng As Excel.Range
  Dim Sh As Excel.Worksheet
  
  Set Sh = Application.ActiveSheet
  Set Rng = Sh.Range("A1:J5")
  
  RngAutoFit Rng
End Sub

Осталось код процедуры RngAutoFit() перевести на Delphi.

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

Книга MS Excel с этим кодом приложена к сообщению.

Благодарствую, буду думать ))



0



Mawrat

13094 / 5875 / 1706

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

Сообщений: 8,808

21.12.2011, 16:41

6

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

Решение

Сделал перевод для Delphi.
Там в коде ещё надо подправить одну строчку.
Заменить:

Visual Basic
1
    If Cell.MergeCells And (Cell = MRng.Cells(1, 1)) Then

на:

Visual Basic
1
    If Cell.MergeCells And (Cell.Address = MRng.Cells(1, 1).Address) Then

Потому что в коде

Visual Basic
1
  If ... (Cell = MRng.Cells(1, 1)) ... Then

на самом деле сравниваются не ссылки на указанные объекты, а сравниваются значения свойств по умолчанию для этих объектов. Так как Cell и MRng.Cells(1, 1) принадлежат типу Excel.Range, то для них свойством по умолчанию будет Value. Т. е. код:

Visual Basic
1
  If ... (Cell = MRng.Cells(1, 1)) ... Then

эквивалентен коду:

Visual Basic
1
  If ... (Cell.Value = MRng.Cells(1, 1).Value) ... Then

А это не то что нам нужно. Нам надо не значение ячеек сравнивать, а выяснить, ссылаются ли эти переменные на одну и ту же ячейку. Для этого было решено использовать свойство Address.

Окончательный код VBA:

Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Option Explicit
 
'Эта процедура предназначена для подгона высоты строк по содержимому ячеек в пределах
'заданного диапазона aRng. Ячейки могут быть любыми, в том числе, объединёнными.
Sub RngAutoFit(ByRef aRng As Excel.Range)
  Dim Cell As Excel.Range 'Отдельная ячейка.
  Dim MRng As Excel.Range 'Диапазон объединения ячеек.
  Dim DispAl As Boolean
  Dim nRow As Long
  Dim nCol As Long
  Dim HRow1 As Long 'Высота верхней строки в диапазоне объединения.
  Dim H1 As Long 'Исходная высота по совокупности всех строк объединения.
  Dim H2 As Long 'Наименьшая необходимая высота для показа текста в объединённой ячейке.
  Dim WCol1 As Long 'Исходная ширина левого столбца в диапазоне объединения.
  Dim W1 As Long 'Исходная ширина по совокупности всех столбцов объединения.
  Dim i As Long
  
  If aRng Is Nothing Then Exit Sub
  
  'Подгоняем высоту строк для ячеек, которые не входят в диапазоны объединённых ячеек.
  aRng.Rows.AutoFit
  'Отключаем режим показа предупреждений. Это надо для того, чтобы в следующей части
  'программы не появлялось сообщение с предупреждением о последствиях объединения.
  DispAl = Application.DisplayAlerts
  Application.DisplayAlerts = False
  
  'Перебор всех ячеек диапазона.
  For nRow = 1 To aRng.Rows.Count
  For nCol = 1 To aRng.Columns.Count
    'Берём очередную ячейку.
    Set Cell = aRng.Cells(nRow, nCol)
    'Определяем диапазон объединения, в который входит ячейка Cell.
    Set MRng = Cell.MergeArea
    'Если в самом деле ячейка принадлежит диапазону объединённых ячеек и эта ячейка
    'является левой верхней ячейкой в этом диапазоне, тогда запускаем алгоритм подгона высоты.
    If Cell.MergeCells And (Cell.Address = MRng.Cells(1, 1).Address) Then
      'Высота верхней строки в диапазоне объединения.
      HRow1 = MRng.Rows(1).RowHeight
      'Подсчитываем исходную высоту диапазона объединения по совокупности всех его строк.
      H1 = HRow1
      For i = 2 To MRng.Rows.Count
        H1 = H1 + MRng.Rows(i).RowHeight
      Next i
      'Ширина левого столбца в диапазоне объединения.
      WCol1 = MRng.Columns(1).ColumnWidth
      'Подсчитываем исходную ширину диапазона объединения по совокупности всех его столбцов.
      W1 = WCol1
      For i = 2 To MRng.Columns.Count
        W1 = W1 + MRng.Columns(i).ColumnWidth
      Next i
      'Теперь разъединяем ячейки.
      MRng.MergeCells = False
      'Ширину левого столбца делаем равным исходной ширине всего диапазона объединения.
      Cell.ColumnWidth = W1
      'Задаём режим переноса текста по словам.
      Cell.WrapText = True
      'Выполняем подгон высоты верхней строки.
      Cell.Rows.AutoFit
      'Выполняем замер получившейся высоты верхней строки.
      'Это наименьшая высота, пригодная для показа текста.
      H2 = Cell.Rows(1).RowHeight
      'Если исходная высота диапазона объединения оказалась меньше, чем наименьшая
      'пригодная высота, то увеличиваем высоту верхней строки на соответствующую величину.
      If H1 < H2 Then
        Cell.Rows(1).RowHeight = HRow1 + (H2 - H1)
      End If
      'Возвращаем левому столбцу диапазона его прежнюю ширину.
      Cell.ColumnWidth = WCol1
      'Объединяем все нужные ячейки.
      MRng.MergeCells = True
    End If
  Next nCol
  Next nRow
  
  'Восстанавливаем прежний режим показа предупреждений.
  Application.DisplayAlerts = DispAl
End Sub
 
'Проверка.
Sub Sub1()
  Dim Rng As Excel.Range
  Dim Sh As Excel.Worksheet
  
  Set Sh = Application.ActiveSheet
  Set Rng = Sh.Range("A1:J5")
  
  RngAutoFit Rng
End Sub

Код Delphi:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
uses
  ComObj;
 
//Эта процедура предназначена для подгона высоты строк по содержимому ячеек в пределах
//заданного диапазона aRng. Ячейки могут быть любыми, в том числе, объединёнными.
procedure RngAutoFit(var aRng : Variant);
var
  //Cell - Отдельная ячейка, MRng - диапазон объединения ячеек.
  Cell, MRng : Variant;
  DispAl : Boolean;
  nRow, nCol,
  HRow1, //Высота верхней строки в диапазоне объединения.
  H1,    //Исходная высота по совокупности всех строк объединения.
  H2,    //Наименьшая необходимая высота для показа текста в объединённой ячейке.
  WCol1, //Исходная ширина левого столбца в диапазоне объединения.
  W1,    //Исходная ширина по совокупности всех столбцов объединения.
  i : Integer;
begin
  //В VBA это: if aRng is Nothing then Exit Sub
  if TVarData(aRng).VDispatch = nil then Exit;
 
  //Подгоняем высоту строк для ячеек, которые не входят в диапазоны объединённых ячеек.
  aRng.Rows.AutoFit;
  //Отключаем режим показа предупреждений. Это надо для того, чтобы в следующей части
  //программы не появлялось сообщение с предупреждением о последствиях объединения.
  DispAl := aRng.Application.DisplayAlerts;
  aRng.Application.DisplayAlerts := False;
 
  //Перебор всех ячеек диапазона.
  for nRow := 1 to aRng.Rows.Count do
  for nCol := 1 to aRng.Columns.Count do begin
    //Берём очередную ячейку.
    Cell := aRng.Cells[nRow, nCol];
    //Определяем диапазон объединения, в который входит ячейка Cell.
    MRng := Cell.MergeArea;
    //Если в самом деле ячейка принадлежит диапазону объединённых ячеек и эта ячейка
    //является левой верхней ячейкой в этом диапазоне, тогда запускаем алгоритм подгона высоты.
    //Иначе - пропускаем итерацию.
    if not ( Cell.MergeCells and (Cell.Address = MRng.Cells[1, 1].Address) ) then Continue;
 
    //Высота верхней строки в диапазоне объединения.
    HRow1 := MRng.Rows[1].RowHeight;
    //Подсчитываем исходную высоту диапазона объединения по совокупности всех его строк.
    H1 := HRow1;
    for i := 2 to MRng.Rows.Count do
      H1 := H1 + MRng.Rows[i].RowHeight
    ;
    //Ширина левого столбца в диапазоне объединения.
    WCol1 := MRng.Columns[1].ColumnWidth;
    //Подсчитываем исходную ширину диапазона объединения по совокупности всех его столбцов.
    W1 := WCol1;
    for i := 2 to MRng.Columns.Count do
      W1 := W1 + MRng.Columns[i].ColumnWidth
    ;
    //Теперь разъединяем ячейки.
    MRng.MergeCells := False;
    //Ширину левого столбца делаем равным исходной ширине всего диапазона объединения.
    Cell.ColumnWidth := W1;
    //Задаём режим переноса текста по словам.
    Cell.WrapText := True;
    //Выполняем подгон высоты верхней строки.
    Cell.Rows.AutoFit;
    //Выполняем замер получившейся высоты верхней строки.
    //Это наименьшая высота, пригодная для показа текста.
    H2 := Cell.Rows[1].RowHeight;
    //Если исходная высота диапазона объединения оказалась меньше, чем наименьшая
    //пригодная высота, то увеличиваем высоту верхней строки на соответствующую величину.
    if H1 < H2 then
      Cell.Rows[1].RowHeight := HRow1 + (H2 - H1)
    ;
    //Возвращаем левому столбцу диапазона его прежнюю ширину.
    Cell.ColumnWidth := WCol1;
    //Объединяем все нужные ячейки.
    MRng.MergeCells := True;
  end; //for nRow, nCol.
 
  //Восстанавливаем прежний режим показа предупреждений.
  aRng.Application.DisplayAlerts := DispAl;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  App, Book, Sh, Rng : Variant;
  Od : TOpenDialog;
begin
  Od := OpenDialog1;
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( ParamStr(0) )
  ;
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    MessageBox(
      0
      ,PChar('Файл с заданным именем не найден. Действие отменено.')
      ,PChar('Предупреждение.')
      ,MB_OK + MB_ICONWARNING + MB_APPLMODAL
    );
    Exit;
  end;
 
  App := CreateOleObject('Excel.Application');
  App.Visible := True;
  Book := App.Workbooks.Open(Od.FileName);
  //Первый лист в рабочей книге.
  Sh := Book.Worksheets[1];
  //Весь используемый диапазон ячеек на листе.
  Rng := Sh.UsedRange;
 
  //Если требуется повысить скорость работы, следует отключить
  //режим перерисовки экрана. Но после обработки надо не забыть
  //этот режим включить вновь - чтобы пользователь мог работать
  //с открытой книгой.
  //App.ScreenUpdating := False;
 
  //Подгон высоты строк по всем ячейкам, включая объединённые.
  RngAutoFit(Rng);
 
  //Включаем обновление экрана в Excel.
  //App.ScreenUpdating := True;
end;

В приложенном архиве проект Delphi и книга Excel с проектом VBA.

Вложения

Тип файла: rar AutoFitWithMergeredCells.rar (186.1 Кб, 252 просмотров)



3



0 / 0 / 0

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

Сообщений: 16

21.12.2011, 18:30

 [ТС]

7

Спасибо Вам огромное, сама бы я никогда до этого не додумалась )) Вы меня просто спасли ))



0



Falk0ner, вс, 06/07/2008 — 15:35.

  • Доступ к ячейкам Excel

Высота и ширина ячейки Excel
Высота и ширина ячейки
Чтобы формировать вид документа в процессе его создания, недостаточно только функций записи информации в ячейки, необходимо также изменять ее визуальные параметры. Самое простое, с чего можно начать, — изменение ширины столбцов и высоты строк. Доступ к ширине столбцов можно получить, используя коллекцию Columns. Используя номер колонки в буквенном или числовом формате и свойство коллекции ColumnWidth, можно изменить ширину столбца или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает ширину столбца.

Function SetColumnWidth (sheet:variant;
 column:variant;width:real):boolean;
begin
 SetColumnWidth:=true;
 try
 E.ActiveWorkbook.Sheets.Item[sheet].Columns
  [column].ColumnWidth:=width;
 except
 SetColumnWidth:=false;
 end;
End;

Для определения ширины столбца используйте следующий оператор: width:=E.ActiveWorkbook .Sheets.Item[sheet].Columns[column].ColumnWidth;
Доступ к высоте строк можно получить, используя коллекцию Rows. Назначая номер строки и свойство коллекции RowHeight, можно изменить высоту строки или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает высоту строки.

Function SetRowHeight (sheet:variant;row:variant;
 height:real):boolean;
begin
 SetRowHeight:=true;
 try
 E.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight:=height;
 except
 SetRowHeight:=false;
 end;
End;

Для определения высоты строки используйте следующий оператор: height:=E.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight;

Содержание

  1. Высота ячеек delphi excel
  2. Высота ячеек delphi excel
  3. Excel в Delphi. Свойства объекта WorkSheet.
  4. 1. Свойство Cells
  5. 2. Свойство Columns
  6. 3. Свойство Name
  7. 4. Свойство Range
  8. 5. Свойство Rows
  9. 6. Свойства StandartHeight и StandartWidth
  10. 7. Свойство UsedRange
  11. 8. Свойство Comments
  12. delphi excel высота строки
  13. 1. Свойство Cells
  14. 2. Свойство Columns
  15. 3. Свойство Name
  16. 4. Свойство Range
  17. 5. Свойство Rows
  18. 6. Свойства StandartHeight и StandartWidth
  19. 7. Свойство UsedRange
  20. 8. Свойство Comments

Высота ячеек delphi excel

Подскажите, как?
Строка типа ExcelWorksheet.Rows.Height:=67 вызывает ошибку:
cannot assign to a resd-only property


Антоныч ( 2004-09-08 15:56 ) [1]

Высота и ширина ячейки

Чтобы формировать вид документа в процессе его создания, недостаточно только функций записи информации в ячейки, необходимо также изменять ее визуальные параметры. Самое простое, с чего можно начать, — изменение ширины столбцов и высоты строк. Доступ к ширине столбцов можно получить, используя коллекцию Columns. Используя номер колонки в буквенном или числовом формате и свойство коллекции ColumnWidth, можно изменить ширину столбца или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает ширину столбца.

Function SetColumnWidth (sheet:variant;
column:variant;width:real):boolean;
begin
SetColumnWidth:=true;
try
ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Columns
[column].ColumnWidth:=width;
except
SetColumnWidth:=false;
end;
End;
Для определения ширины столбца используйте следующий оператор: width:=ExcelApplication.ActiveWorkbook .Sheets.Item[sheet].Columns[column].ColumnWidth;

Доступ к высоте строк можно получить, используя коллекцию Rows. Назначая номер строки и свойство коллекции RowHeight, можно изменить высоту строки или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает высоту строки.

Function SetRowHeight (sheet:variant;row:variant;
height:real):boolean;
begin
SetRowHeight:=true;
try
ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight:=height;
except
SetRowHeight:=false;
end;
End;
Для определения высоты строки используйте следующий оператор: height:=ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight;

Есть подробная документация по взаимодействию Delphi с Word и Excel. Могу выслать на мыло.


cad2206 ( 2004-09-08 16:34 ) [2]

Антоныч, эта функция устанавливает размер для всех ячеек на странице, мне нужно отдельно для каждой ячейки.


BillyJeans ( 2004-09-08 17:34 ) [3]

а может отдельно для каждой строки.


YurikGL © ( 2004-09-08 21:11 ) [4]

интересное о себе.


pavel_guzhanov ( 2004-09-09 13:01 ) [6]

Источник

Высота ячеек delphi excel

Подскажите, как?
Строка типа ExcelWorksheet.Rows.Height:=67 вызывает ошибку:
cannot assign to a resd-only property


Антоныч ( 2004-09-08 15:56 ) [1]

Высота и ширина ячейки

Чтобы формировать вид документа в процессе его создания, недостаточно только функций записи информации в ячейки, необходимо также изменять ее визуальные параметры. Самое простое, с чего можно начать, — изменение ширины столбцов и высоты строк. Доступ к ширине столбцов можно получить, используя коллекцию Columns. Используя номер колонки в буквенном или числовом формате и свойство коллекции ColumnWidth, можно изменить ширину столбца или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает ширину столбца.

Function SetColumnWidth (sheet:variant;
column:variant;width:real):boolean;
begin
SetColumnWidth:=true;
try
ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Columns
[column].ColumnWidth:=width;
except
SetColumnWidth:=false;
end;
End;
Для определения ширины столбца используйте следующий оператор: width:=ExcelApplication.ActiveWorkbook .Sheets.Item[sheet].Columns[column].ColumnWidth;

Доступ к высоте строк можно получить, используя коллекцию Rows. Назначая номер строки и свойство коллекции RowHeight, можно изменить высоту строки или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает высоту строки.

Function SetRowHeight (sheet:variant;row:variant;
height:real):boolean;
begin
SetRowHeight:=true;
try
ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight:=height;
except
SetRowHeight:=false;
end;
End;
Для определения высоты строки используйте следующий оператор: height:=ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight;

Есть подробная документация по взаимодействию Delphi с Word и Excel. Могу выслать на мыло.


cad2206 ( 2004-09-08 16:34 ) [2]

Антоныч, эта функция устанавливает размер для всех ячеек на странице, мне нужно отдельно для каждой ячейки.


BillyJeans ( 2004-09-08 17:34 ) [3]

а может отдельно для каждой строки.


YurikGL © ( 2004-09-08 21:11 ) [4]

интересное о себе.


pavel_guzhanov ( 2004-09-09 13:01 ) [6]

Источник

Excel в Delphi. Свойства объекта WorkSheet.

Продолжаем копаться в листах Excel и изучать особенности работы с ними. Сегодня мы рассмотри свойства объекта WorkSheet.

Основными свойствами, которые Вы с большой вероятностью будете использовать в своей работе с Excel в Delphi являются:

  1. Cells — ячейки
  2. Columns — столбцы
  3. Name — название листа
  4. Range — диапазон ячеек
  5. Rows — сроки
  6. StandartHeight — высота строк «по умолчанию»
  7. StandartWidth — ширина столбцов «по умолчанию»
  8. UsedRange — задействованный диапазон ячеек
  9. Comments — комментарии

Всего у листа рабочей книги Excel насчитывается 54 различных свойств, но, как показвает практика, для использования Excel в Dephi достаточно 9-15 различных свойств листа, чтобы получить необходимый результат, обеспечивающий удобство и наглядность представляемых данных.

Рассмотрим применение указанных выше свойств листа Worksheet при работе с Excel в Delphi.

1. Свойство Cells

Возвращает объект диапазона, который представляет собой все ячейки на листе (а не только клетки, которые используются в настоящее время)

Однако использование свойства Cells возможно (и более практично) в другом виде. Вы можете указать сразу за словом Cells номера столбца и строки и, таким образом, получить доступ к конкретной ячейке листа. Например, забегая немного вперед, посмотрим, как можно удалить формулы из ячейки:

Выполнив такую операцию Вы удалите из ячейки С5 формулу (или любое другое содержимое). Как можно заметить, в отличие от работы с таблицами StringGrid Delphi, здесь вначале указывается номер строки, а затем номер столбца (у String Grid напротив — сначала указывается номер столбца, а затем номер строки).

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

Ну, а чтобы показать использование этого свойства на примере, давайте напишем простенькую процедуру копирования таблицы StringGrid в любую область листа Worksheet Excel.

Здесь в качестве параметров процедуры необходимо задать: номера первого столбца (FirstCol) и первой строки (FirstRow) на листе Excel, начиная с которых необходимо копировать данные из таблицы StringGrid (Grid). Заметьте, что вызов свойств Cells у StringGrid и WorkSheet происходит по-разному (см. индексы ячейки).

Естественно, что представленная процедура может с легкостью применяться при копировании небольших таблиц. Однако при импорте больших объемов данных в Excel эта процедура будет очень сильно тормозить работы основной программы. Более скоростной способ импорта данных из Excel в Delphi и наоборот мы рассмотрим позже, при рассмотрении объекта Range.

2. Свойство Columns

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

Это свойство удобно использовать при редактировании столбцов данных. Например вот так:

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

3. Свойство Name

С этим свойством мы уже сталкивались. Свойство Name возвращает имя рабочего листа книги.

Так мы изменили имя текущего активного листа Excel. Кроме этого, свойство Name удобо использовать при поиске необходимого листа.

4. Свойство Range

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

Так, мы получили доступ к ячейке А1 и записали в неё текст. А следующий фрагмент кода демонстрирует быстрый способ экспорта данных из листа Excel в Delphi:

Так, мы за одно обращение к листу считали столбец данных и в дальнейшем, не используя напрямую объект WorkSheet, обработали все данные в вариантном массиве Numbers. Этот способ чтения данных с листа Excel является наиболее скоростным из всех известных мне в настоящее время. Если знаете способ более скоростной — буду очень рад, если поделитесь им.

5. Свойство Rows

Это свойство аналогично свойству Columns, но в отличие от него, возвращает объект, представляющий собой строку листа. С помощью этого свойства Вы также можете изменять внешний вид ячеек листа, изменять шрифт и т.д.

6. Свойства StandartHeight и StandartWidth

Эти свойства позволяют получить значения высоты и ширины ячеек листа «по умолчанию». Свойство доступно только для чтения, т.е. вызов:

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

7. Свойство UsedRange

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

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

Это свойство возвращает коллекцию комментариев на листе.

удалит второй комментарий из коллекции, а:

добавит в ячейку е5 новый комментарий.

Итак, резюмируем. Сегодня мы узнали: как записать данные в ячейку листа Excel, как прочитать данные из диапазона ячеек, как скопировать таблицу из Delphi в Excel, как быстро экспортировать данные из Excel в Delphi.

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

Источник

delphi excel высота строки

Подскажите, как?
Строка типа ExcelWorksheet.Rows.Height:=67 вызывает ошибку:
cannot assign to a resd-only property


Антоныч ( 2004-09-08 15:56 ) [1]

Высота и ширина ячейки

Чтобы формировать вид документа в процессе его создания, недостаточно только функций записи информации в ячейки, необходимо также изменять ее визуальные параметры. Самое простое, с чего можно начать, — изменение ширины столбцов и высоты строк. Доступ к ширине столбцов можно получить, используя коллекцию Columns. Используя номер колонки в буквенном или числовом формате и свойство коллекции ColumnWidth, можно изменить ширину столбца или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает ширину столбца.

Function SetColumnWidth (sheet:variant;
column:variant;width:real):boolean;
begin
SetColumnW > try
ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Columns
[column].ColumnW > except
SetColumnW > end;
End;
Для определения ширины столбца используйте следующий оператор: w >
Доступ к высоте строк можно получить, используя коллекцию Rows. Назначая номер строки и свойство коллекции RowHeight, можно изменить высоту строки или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает высоту строки.

Function SetRowHeight (sheet:variant;row:variant;
height:real):boolean;
begin
SetRowHeight:=true;
try
ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight:=height;
except
SetRowHeight:=false;
end;
End;
Для определения высоты строки используйте следующий оператор: height:=ExcelApplication.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight;

Есть подробная документация по взаимодействию Delphi с Word и Excel. Могу выслать на мыло.


cad2206 ( 2004-09-08 16:34 ) [2]

Антоныч, эта функция устанавливает размер для всех ячеек на странице, мне нужно отдельно для каждой ячейки.


BillyJeans ( 2004-09-08 17:34 ) [3]

а может отдельно для каждой строки.


YurikGL © ( 2004-09-08 21:11 ) [4]

http://www.delphimaster.ru/cgi-bin/anketa.pl? >
интересное о себе.


DarkMan ( 2004-09-09 09:53 ) [5]


pavel_guzhanov ( 2004-09-09 13:01 ) [6]

Продолжаем копаться в листах Excel и изучать особенности работы с ними. Сегодня мы рассмотри свойства объекта WorkSheet.

Основными свойствами, которые Вы с большой вероятностью будете использовать в своей работе с Excel в Delphi являются:

  1. Cells — ячейки
  2. Columns — столбцы
  3. Name — название листа
  4. Range — диапазон ячеек
  5. Rows — сроки
  6. StandartHeight — высота строк «по умолчанию»
  7. StandartWidth — ширина столбцов «по умолчанию»
  8. UsedRange — задействованный диапазон ячеек
  9. Comments — комментарии

Всего у листа рабочей книги Excel насчитывается 54 различных свойств, но, как показвает практика, для использования Excel в Dephi достаточно 9-15 различных свойств листа, чтобы получить необходимый результат, обеспечивающий удобство и наглядность представляемых данных.

Рассмотрим применение указанных выше свойств листа Worksheet при работе с Excel в Delphi.

1. Свойство Cells

Возвращает объект диапазона, который представляет собой все ячейки на листе (а не только клетки, которые используются в настоящее время)

Однако использование свойства Cells возможно (и более практично) в другом виде. Вы можете указать сразу за словом Cells номера столбца и строки и, таким образом, получить доступ к конкретной ячейке листа. Например, забегая немного вперед, посмотрим, как можно удалить формулы из ячейки:

Выполнив такую операцию Вы удалите из ячейки С5 формулу (или любое другое содержимое). Как можно заметить, в отличие от работы с таблицами StringGrid Delphi, здесь вначале указывается номер строки, а затем номер столбца (у String Grid напротив — сначала указывается номер столбца, а затем номер строки).

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

Ну, а чтобы показать использование этого свойства на примере, давайте напишем простенькую процедуру копирования таблицы StringGrid в любую область листа Worksheet Excel.

Здесь в качестве параметров процедуры необходимо задать: номера первого столбца (FirstCol) и первой строки (FirstRow) на листе Excel, начиная с которых необходимо копировать данные из таблицы StringGrid (Grid). Заметьте, что вызов свойств Cells у StringGrid и WorkSheet происходит по-разному (см. индексы ячейки).

Естественно, что представленная процедура может с легкостью применяться при копировании небольших таблиц. Однако при импорте больших объемов данных в Excel эта процедура будет очень сильно тормозить работы основной программы. Более скоростной способ импорта данных из Excel в Delphi и наоборот мы рассмотрим позже, при рассмотрении объекта Range.

2. Свойство Columns

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

Это свойство удобно использовать при редактировании столбцов данных. Например вот так:

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

3. Свойство Name

С этим свойством мы уже сталкивались. Свойство Name возвращает имя рабочего листа книги.

Так мы изменили имя текущего активного листа Excel. Кроме этого, свойство Name удобо использовать при поиске необходимого листа.

4. Свойство Range

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

Так, мы получили доступ к ячейке А1 и записали в неё текст. А следующий фрагмент кода демонстрирует быстрый способ экспорта данных из листа Excel в Delphi:

Так, мы за одно обращение к листу считали столбец данных и в дальнейшем, не используя напрямую объект WorkSheet, обработали все данные в вариантном массиве Numbers. Этот способ чтения данных с листа Excel является наиболее скоростным из всех известных мне в настоящее время. Если знаете способ более скоростной — буду очень рад, если поделитесь им.

5. Свойство Rows

Это свойство аналогично свойству Columns, но в отличие от него, возвращает объект, представляющий собой строку листа. С помощью этого свойства Вы также можете изменять внешний вид ячеек листа, изменять шрифт и т.д.

6. Свойства StandartHeight и StandartWidth

Эти свойства позволяют получить значения высоты и ширины ячеек листа «по умолчанию». Свойство доступно только для чтения, т.е. вызов:

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

7. Свойство UsedRange

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

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

Это свойство возвращает коллекцию комментариев на листе.

удалит второй комментарий из коллекции, а:

добавит в ячейку е5 новый комментарий.

Итак, резюмируем. Сегодня мы узнали: как записать данные в ячейку листа Excel, как прочитать данные из диапазона ячеек, как скопировать таблицу из Delphi в Excel, как быстро экспортировать данные из Excel в Delphi.

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

Чтобы формировать вид документа в процессе его создания, недостаточно только функций записи информации в ячейки, необходимо также изменять ее визуальные параметры. Самое простое, с чего можно начать, — изменение ширины столбцов и высоты строк. Доступ к ширине столбцов можно получить, используя коллекцию Columns. Используя номер колонки в буквенном или числовом формате и свойство коллекции ColumnWidth, можно изменить ширину столбца или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает ширину столбца.

Function SetColumnWidth (sheet:variant;

Для определения ширины столбца используйте следующий оператор: w >

Доступ к высоте строк можно получить, используя коллекцию Rows. Назначая номер строки и свойство коллекции RowHeight, можно изменить высоту строки или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает высоту строки.

Function SetRowHeight (sheet:variant;row:variant;

Источник

Понравилась статья? Поделить с друзьями:
  • Высота шрифта в word это
  • Высота шрифта в word в мм таблица
  • Высота столбцов таблицы word
  • Высота столбца в excel автоматически
  • Высота объединенных ячеек в excel по содержимому