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

Продолжаем копаться в листах 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;

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

8. Свойство Comments

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

Например:

MyExcel.ActiveSheet.Comments[2].Delete

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

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

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

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

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

5 1 голос
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
11 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
brabusgv12
brabusgv12
17/09/2009 16:17

Спасибо отличная статья оч помогла =)

brabusgv12
brabusgv12
21/09/2009 18:07

Возник такой вопрос как excel обновляет свойство usedrange. У меня Excel 2003 и если я добавляю значение в ячейку за пределами usedrange(тупо открываю Excel и добавляю куда то подальше значение от основного диапазона), то usedrange не обновляется. Отпишите если есть какие нибудь идеи пожалуйста.

Валерий
Валерий
04/04/2011 16:53

пробую строчку ‘MyExcel.ActiveWorkBook.ActiveSheet.Columns[1].Font.Bold’ — не получается..
оказалось надо — MyExcel.ActiveWorkBook.ActiveSheet.Columns[1].Font.Bold := true;

Smit
Smit
05/04/2013 17:59

Оченно все интересно. Но я не нашел решение еще одной проблемки:
Есть данные, 286102E150, и Excel их переделывает в 2,86102E+155.
Но это строка, и зачем ее преобразовывать в число?

Александр Казанцев

Здравствуйте!
Мне надо знать цвет каждой ячейки, делаю так:
for I := 0 to Rows-1 do
for j := 0 to Cols-1 do
StrList.Add(WorkSheet.UsedRange.Cells[I+1,J+1].Interior.Color);
end;

Все хорошо, но очень долго идет процесс
Вот тут все мгновенно
FData:=WorkSheet.UsedRange.Value;
for I := 0 to Rows-1 do
for j := 0 to Cols-1 do
StrList2.Add(FData[I+1,J+1]);

Как можно сделать чтение параметра цвета быстрее?

Александр Казанцев

Очень плохо!
У меня прайс-лист из более 6000 наименований + 4 колонки! :(((
На неплохом Intel’ е процесс занимает около 2-х минут!

Александр Казанцев

А что еще можно выбрать в автомате, кроме Value???
У меня есть три вида заголовков!
Если переводить Excel в Веб-страничку там можно найти разницу, даже без заливки, вида «height=XX class=xlXX«

Игорь
Игорь
10/06/2014 15:38

Не поможете с такой проблемой? А как програмно сделать структуру в Excell, т.е. заголовок и группировку относящихся к нему статей (строк)? Спасибо!