Продолжаем копаться в листах Excel и изучать особенности работы с ними. Сегодня мы рассмотри свойства объекта WorkSheet.
Основными свойствами, которые Вы с большой вероятностью будете использовать в своей работе с Excel в Delphi являются:
- Cells — ячейки
- Columns — столбцы
- Name — название листа
- Range — диапазон ячеек
- Rows — сроки
- StandartHeight — высота строк «по умолчанию»
- StandartWidth — ширина столбцов «по умолчанию»
- UsedRange — задействованный диапазон ячеек
- 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 один-к-одному с сохранением всех цветов, границ ячеек и т.д., а также, попробуем строить диаграммы, которые опять же очень часто требуются при разработке бизнес-приложений.

Спасибо отличная статья оч помогла =)
Возник такой вопрос как excel обновляет свойство usedrange. У меня Excel 2003 и если я добавляю значение в ячейку за пределами usedrange(тупо открываю Excel и добавляю куда то подальше значение от основного диапазона), то usedrange не обновляется. Отпишите если есть какие нибудь идеи пожалуйста.
Первое, что сразу приходит на ум — это:
Worksheets(«Sheet1»).Activate
ActiveSheet.UsedRange.Select
т.е. повторно активировать лист. По логике вещей должно сработать событие и usedRange обновится. Либо сделать полное обновление Excel
Application.Update
Попробуйте оба варианта, если не поможет, то разберусь с этим вопросом и отпишу все по поводу usedrange Просто никогда такой вопрос не возникал)
пробую строчку ‘MyExcel.ActiveWorkBook.ActiveSheet.Columns[1].Font.Bold’ — не получается..
оказалось надо — MyExcel.ActiveWorkBook.ActiveSheet.Columns[1].Font.Bold := true;
Оченно все интересно. Но я не нашел решение еще одной проблемки:
Есть данные, 286102E150, и Excel их переделывает в 2,86102E+155.
Но это строка, и зачем ее преобразовывать в число?
Надо смотреть в справке для разработчика Excel, что есть на счёт формата ячеек. Уверен там есть, то, что вам нужно
Здравствуйте!
Мне надо знать цвет каждой ячейки, делаю так:
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«
Не поможете с такой проблемой? А как програмно сделать структуру в Excell, т.е. заголовок и группировку относящихся к нему статей (строк)? Спасибо!