уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сегодняшняя статья блога будет целиком посвящена работе с Excel Range или, говоря другими словами — работе с диапазонами ячеек Excel.
Про работу с этими объектами я уже вкратце говорил, а сегодня хотел бы поделиться с вами более полной информацией. Итак, начнем с самого простого.
1. Что такое Range и как его получить?
Согласно официальному определению Microsoft, Range :
представляет собой ячейки, строки, столбцы, набор ячеек, содержащих один или более смежных блоков ячеек, или 3-D диапазон.
Однако это определение не исключает того, что объектом Range может выступать и одна ячейка (Cell) листа. Таким образом, чтобы получить в свое распоряжение объект Range, можно выполнить следующие операции c объектом Excel в Delphi:
var MyRange: OLEVariat; begin {объект Range, состоящий из одной ячейки} MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1']; {объект Range в виде строки из четырех ячеек} MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D1']; {объект Range в виде столбца из четырех ячеек} MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:A4']; {объект Range в виде таблицы 4х4 ячейки} MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D4']; end;
Если Вам неудобно в какой-либо ситуации использовать буквенные обозначение ячеек или Вы привыкли до этого момента иметь дело только с отдельными ячейками (Cells), то объект Range можно получить например вот так:
var MyRange: OLEVariat; Cell_1, Cell2: OLEVariant; begin {получаем ссылку на объект Cells, соответствующей ячейке A1} Cell_1:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[1,1]; {получаем ссылку на объект Cells, соответствующей ячейке C5} Cell_2:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3]; {получаем объект Range размером 3х5} MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range[Cell_1, Cell_2] end;
Какой из способов Вы будете использовать в 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)
var i:integer; s: single; str: string; Sheet: OLEVariant; begin i:=100; s:=2.12; str:='Hello World!'; Sheet.Range['A1'].Value:=i; Sheet.Range['A2'].Value:=s; Sheet.Range['A3'].Value:=str; end;
Как видите, обращение к ячейкам было одно и то же и нигде я не приводил данный к какому-то типу — записал в ячейки всё как есть.
Если Вы хотите записать в весь диапазон Range одно и то же значение, то просто выполните:
Sheet.Range['A1:A10'].Value:=str;
и получите одну и ту же строку «Hello World!» в десяти ячейках Excel, но такие операции очень редко необходимы при работе с Excel в Delphi. Зато очень часто необходимо воспользоваться другой стороной свойства Value — прочитать большой объем данных из книги Excel за один прием и получить весь массив данных в Delphi. Операция чтения данных из Excel в Delphi более проста, чем Вам может показаться на первый взгляд. Проведем обратную операцию — прочитаем данные из Excel:
var val: Variant; Sheet: OLEVariant; i:integer; begin Val:=Sheet.Range['A1:A3'].Value; for i:=1 to 3 do ShowMessage(val[i,1]); end;
Если Вам необходимо читать/писать большое количество данных, то наиболее быстрым способом работы с данными будет использование вариантных массивов. О том, как использовать вариантные массивы при работе с Excel в Delphi рассказывается в статье «Быстрая обработка данных Excel в Delphi.«
Как видите здесь мы за один прием прочитали данные сразу из трех ячеек Excel и отобразили их в сообщении. Этот прием чтения на порядок более скоростной, чем, например чтение содержимого каждой ячейки (Cells) в отдельности.
Text
Ещё одно простенькое свойство объекта Range — возвращает текст из ячейки. Самое главное отличие от свойства Value — Text возвращает string только для чтения и использовать это свойство для чтения большого объема данных, как в предыдущем примере — ни в коем случае нельзя, так как переменная Val вернет значение Null.
Column
Возвращает номер первого столбца в первой области, в указанном диапазоне. Свойство только для чтения.
Чтобы продемонстрировать свойство в действии, давайте создадим такие диапазоны как показано на рисунке:
То есть каждый из диапазонов Range будет содержать по две несвязанные друг с другом области (Area). Причем первая область диапазона Range будет начинаться в столбце А, а первая область второго диапазона (Range 2) — в столбце B.
После того, как диапазоны будут созданы — посмотрим, что вернет нам свойство Column для каждого из диапазонов.
Листинг процедуры создания двух несвязных диапазонов Range следующий:
var Range1,Range2,BigRange: OLEVariant; begin {создаем первый диапазон} Range1:=Sheet.Range['A1:C4']; Range2:=Sheet.Range['E6:H9']; BigRange:=Sheet.Range[Range1,Range2]; ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства {создаем второй диапазон} Range1:=Sheet.Range['B7:C13']; Range2:=Sheet.Range['E1:H3']; BigRange:=Sheet.Range[Range1,Range2]; ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства end;
Так, в случае с первым Range Column вернет нам значение 1, а для второго Range — значение 2.
Columns
В отличие от предыдущего свойства, Columns возвращает не простое число, а объект Range, представляющий собой один столбец из всего диапазона.
Посмотрим как, например, используя это свойство можно изменять столбцы во всем диапазоне Range.
Для демонстрации воспользуемся предыдущим примером, изменим только окончание:
... BigRange:=Sheet.Range[Range1,Range2]; for i:=1 to BigRange.Columns.Count do BigRange.Columns[i].Value:='Столбец №'+IntToStr(i);
В итоге в каждый из столбцов диапазона должна записаться строка с номером этого столбца, результат представлен на рисунке. Как видите, в цикле все столбцы обработались «насквозь», хотя Range не содержал в себе столбец D.
Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.
Для демонстрации свойства не будем заходить в Excel, поработаем с приложением прямо из Delphi. Для этого воспользуемся методом AddComment. То есть сначала запишем комментарий в ячейку, а потом прочитаем его используя свойство Comment:
Range2:=Sheet.Range['E6']; {записали комментарий} Range2.AddComment('Это комментарий ячейки области'); {прочитали} ShowMessage(Range2.Comment.Text);
Address
Возвращает реальный адрес диапазона Range. Например для диапазона ячеек, заданных вот таким образом:
Range2:=Sheet.Range['A1:E6']; Свойство Address будет содержать строку "$A$1:$E$6"
Это свойство удобно использовать, когда Вы оперируете в программе только числовыми значениями (номерами столбцов и строк) и появляется необходимость показать пользователю адреса ячеек из диапазона.
Помимо перечисленных выше свойств к объекту 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.
Вызывается метод без каких-либо дополнительных параметров:
Range['A1:H6'].CheckSpelling
PrintPreview
Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек. Также как и предыдущий метод PrintPreview не имеет дополнительных параметров. Однако при попытке вызвать метод при скрытом окне Excel в лучшем случае возникнет исключительная ситуация, в худшем — зависание Вашего приложения. Так что перед вызовом:
не забывайте включить свойство Visible у Excel:
AutoFill
Автоматическое заполнение диапазона ячеек на основе данных из другого диапазона.
Вызов метода:
Range.AutoFill(Destination, Type)
Параметр | Тип | Описание |
Destination | Variant | представляет собой объект Range уже заполненных ячеек. Эти ячейки должны входить в автозаполняемый диапазон |
Type | Integer | тип автозаполнения (возможные значения см. ниже) |
Рассмотрим применение метода на примере.
Sheet.Range['A1'].Value:=1; Sheet.Range['A2'].Value:=2; Source:=Sheet.Range['A1:A6']; Range2:=Sheet.Range['A1:E6']; Source.AutoFill(Range2, xlFillDefault)
В результате лист Excel примет следующий вид:
Как видите все столбцы второго диапазона Range заполнились значениями из диапазоны Source.
При использовании этого метода следует иметь в виду, что диапазон-источник (в нашем случае — это source) по одному из измерений должен совпадать с источником назначения. В приведенном примере совпадает размерность по строкам (в обоих диапазонах их шесть). Если размерности диапазонов не совпадают, то возникает исключительная ситуация.
При использовании метода мы использовали одну из констант в параметре Type — xlFillDefault = 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
Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.
Пример вызова:
Sheet.Range['A1'].Value:=1234567891012; Sheet.Range['A2'].Value:=23456789; Source:=Sheet.Range['A1:A2']; Source.Columns.AutoFit
Приведет и изменению ширины столбца А таким образом, чтобы число было полностью видно на листе.
Методы очистки данных диапазона Range
Есть несколько различных методов очистки содержимого диапазона Range при работе с Excel в Delphi.
1. Clear
Удаляет все данные из диапазона.
Пример вызова:
2. ClearComments
Удаляет все комментарии в диапазоне Range.
Пример вызова:
3. ClearContents
Удаляет все формулы из диапазона Range
Пример вызова:
4. ClearFormats
Очищает форматы в диапазоне Range
Пример вызова:
5. ClearNotes
Очищает все заметки в диапазоне Range
Пример вызова:
Методы работы с буфером обмена Excel
1. Copy
Копирует содержимое диапазона Range в буфер обмена или в другой диапазон.
Попробуем реализовать работу метода следующим образом: заполним столбец А некоторыми значениями, а затем скопируем его сначала в буфер, а потом в столбец Е:
Sheet.Range['A1'].Value:=1; Sheet.Range['A2'].Value:=2; Sheet.Range['A3'].Value:=3; Sheet.Range['A4'].Value:=4; Sheet.Range['A5'].Value:=5; Sheet.Range['A6'].Value:=6; Source:=Sheet.Range['A1:A6']; Source.Copy; //скопировали в буфер Range2:=Sheet.Range['E1:E6']; Source.Copy(Range2)//скопировали в новый диапазон
А для того, чтобы вставить данные из буфера обмена существует ещё один метод
2. PasteSpecial
Вызов метода:
MyRange.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
Параметр | Тип | Описание |
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.PasteSpecial(Operation:=xlPasteSpecialOperationAdd);
После выполнения этой операции все данные вставятся в диапазон Range2, т.к. диапазон до вставки был пуст, то данные скопировались один-к-одному.
3. Cut
Вырезает данные и при необходимости вставляет их в новый диапазон. Метод работает аналогично методу Copy, но с последующим удалением данных из источника.
Merge
Объединение ячеек диапазона.
Для новичков, только начинающих постигать азы работы с excel в Delphi этот метод в какой-то момент становится камнем преткновения :). Дело в том, что очень часто возникает необходимость объединить часть ячеек листа для записи в объединенную область большого количества данных или длинной строки. В Excel есть такой метод Union, который и отвечает за объединение — им-то и пробуют пользоваться многие. А метод Union при вызове из Delphi применительно к диапазону Range вызывает исключительную ситуацию. Про Merge люди либо не знают, либо забывают. А использовать его достаточно просто:
Параметр | Тип | Описание |
Across | boolean | True, чтобы объединить ячейки в каждой строке указанного диапазона как отдельные объекты. Значение по умолчанию False |
Например, объединим ячейки в диапазоне Range2 из предыдущего примера:
После выполнения этой операции в диапазоне останется только верхнее значение, т.е. 1.
Дополнительные методы автозаполнения ячеек диапазона Range
В отдельную группу методов можно выделить 4 метода автозаполнения ячеек диапазона:
- FillDown
- FillUp
- FillRight
- FillLeft
Принцип действия этих методов один и тот же за исключением направления автозаполнения.
Например, давайте запишем в ячейку A1 какое-нибудь значение и воспользуемся методами FillDown и FillRight:
Sheet.Range['A1'].Value:=1; Sheet.Range['A1:A6'].FillDown; Sheet.Range['A1:F1'].FillRight;
После этого в строк 1 и столбце A появятся числа 1. Аналогичным образом можно заполнять не только строки или столбцы, но и таблицы целиком — достаточно знать в какую сторону двигаться при автозаполнениии и применять соответствующие методы Excel для Range.
Вот в принципе краткий обзор возможностей работы с объектов Range в Excel. В целом можно отметить, что работа с этим объектом в Delphi один из самых эффективных способов организации пресылки/получения данных между Excel и Delphi, не считая работы через XML формат.
Книжная полка
Название:Разработка приложений Microsoft Office 2007 в Delphi Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi. |
0
0
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
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 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; StringGrid1: TStringGrid; StringGrid2: TStringGrid; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses ComObj; //Возвращает вариантный массив, содержащий данные таблицы на листе MS Excel. function ReadExTable(const aSh : Variant; const aRow, aCol : Integer) : Variant; var exRng, exCell : Variant; ROff, COff : Integer; begin Result := Unassigned; //Верхняя левая ячейка в таблице на листе MS Excel. exCell := aSh.Cells[aRow, aCol]; //Смещение до самой нижней задействованной строки на листе MS Excel. ROff := (aSh.UsedRange.Row + aSh.UsedRange.Rows.Count - 1) - exCell.Row; //Смещение до крайнего правого задействованного столбца на листе MS Excel. COff := (aSh.UsedRange.Column + aSh.UsedRange.Columns.Count - 1) - exCell.Column; //Проверка размера таблицы. if ROff < 0 then Exit; //Определение диапазона, который охватывает таблицу на листе MS Excel. exRng := aSh.Range[exCell, exCell.Offset[ROff, COff]]; //Получаем данные из таблицы Excel в виде вариантного массива. Result := exRng.Value; end; //Запись содержимого массива aVArr в таблицу. procedure WriteGrid(aSg : TStringGrid; const aVArr : Variant); var Row, Col : Integer; begin if TVarData(aVArr).VArray = nil then Exit; //Очистка таблицы. Для предусмотрения бага, связанного с классом TStringGrid. for Col := 0 to aSg.ColCount - 1 do aSg.Cols[Col].Clear; //Установка размеров таблицы. aSg.RowCount := VarArrayHighBound(aVArr, 1); aSg.ColCount := VarArrayHighBound(aVArr, 2); //Запись содержимого массива в таблицу. for Row := 1 to VarArrayHighBound(aVArr, 1) do for Col := 1 to VarArrayHighBound(aVArr, 2) do aSg.Cells[Col - 1, Row - 1] := aVArr[Row, Col]; end; procedure TForm1.Button1Click(Sender: TObject); const //Координаты верхней левой ячейки таблицы на листе MS Excel. cRow1 = 3; cCol1 = 2; var exApp, exBook, exSh : Variant; Od : TOpenDialog; begin //Ссылка на объект диалога. Od := OpenDialog1; if Od.InitialDir = '' then Od.InitialDir := ExtractFileName(ParamStr(0)); if not Od.Execute then Exit; if not FileExists(Od.FileName) then begin MessageBox(0, 'Заданный файл не найден. Действие отменено.', 'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL); Exit; end; try exApp := CreateOleObject('Excel.Application'); except MessageBox(0, 'Не удалось запустить MS Excel. Действие отменено.', 'Ошибка!', MB_OK + MB_ICONERROR + MB_APPLMODAL); Exit; end; //Делаем видимым окно MS Excel. exApp.Visible := True; //Открываем рабочую книгу. exBook := exApp.WorkBooks.Open(FileName:=Od.FileName); //Получаем ссылку на первый лист рабочей книги. exSh := exBook.Worksheets[1]; //Получаем содержимое первой Excel таблицы в виде вариантного массива. //И его данные записываем в таблицу StringGrid1. WriteGrid(StringGrid1, ReadExTable(exSh, cRow1, cCol1)); //Ссылка на второй лист рабочей книги. exSh := exBook.Worksheets[2]; //Содержимое второй Excel таблицы записываем в таблицу StringGrid2. WriteGrid(StringGrid2, ReadExTable(exSh, cRow1, cCol1)); end; end. |
В данном обзоре рассмотрены
основные конструкции,
позволяющие получить доступ к
книге Excel из DELPHI.
Организация доступа к книге
EXCEL
Для
взаимодействия с MS excel в
программе необходимо
использовать модуль ComObj
uses ComObj;
и объявить переменную для
доступа к MS excel следующего
типа:
var Excel:
Variant;
Инициализация
переменной Excel в простейшем
случае можно осуществить так:
Excel := CreateOleObject(‘Excel.Application’);
Создание
новой книги:
Excel.Workbooks.Add;
Открытие
существующей книги (где
path
— путь к фалу с расширением xls.):
Excel.Workbooks.Open[path];
Открытие
существующей книги только для
чтения:
Excel.Workbooks.Open[path, 0,
True];
Закрытие
Excel:
Excel.ActiveWorkbook.Close;
Excel.Application.Quit;
Блокировка
запросов (подтвеждений,
уведомлений) Excel, например,
запретить запрос на сохранение
файла:
Excel.DisplayAlerts:=False;
Отображаем
Excel на экране:
Excel.Visible := True;
или скрываем:
Excel.Visible := False;
Печать
содержимого активного листа
excel:
Excel.ActiveSheet.PrintOut;
Чтение/запись данных в EXCEL
Доступ к
ячейке в текущей книге Excel
можно осуществить следующим
образом:
Excel.Range[‘B2′]:=’Привет!’;-
для записи значения в ячейку или
s:=Excel.Range[‘B2’]; —
для чтения,
где B2
— адрес ячейки.
Или используя стиль ссылок R1C1:
Excel.Range[excel.Cells[2, 2]]:=’Привет!’;,
где [2, 2]
— координата ячейки.
Вообще, ячейке Excel можно
присваивать любое значение
(символьное, целое, дробное,
дата) при этом Excel установит
форматирование в ячейке
применяемое по умолчанию.
Формат ячеек в EXCEL
Выделить
(выбрать) группу ячеек для
последующей работы можно так:
Excel.Range[Excel.Cells[1, 1],
Excel.Cells[5, 3]].Select;
или
Excel.Range[‘A1:C5’].Select;
при этом будет выделена область
находящаяся между ячейкой A1 и
C5.
После
выполнения выделения можно
установить:
1) объединение ячеек
Excel.Selection.MergeCells:=True;
2) перенос по словам
Excel.Selection.WrapText:=True;
3) горизонтальное выравнивание
Excel.Selection.HorizontalAlignment:=3;
при присваивании значения 1
используется выравнивание по
умолчанию, при 2 — выравнивание
слева, 3 — по центру, 4 —
справа.
4) вериткальное выравнивание
Excel.Selection.VerticalAlignment:=1;
присваиваемые значения
аналогичны горизонтальному
выравниванию.
5) граница для ячеек
Excel.Selection.Borders.LineStyle:=1;
При значении 1 границы ячеек
рисуются тонкими сплошными
линиями.
Кроме этого можно указать
значения для свойства Borders,
например, равное 3. Тогда
установится только верхняя
граница для блока выделения:
Excel.Selection.Borders[3].LineStyle:=1;
Значение свойства Borders задает
различную комбинацию граней
ячеек.
В обоих случаях можно
использовать значения в
диапазоне от 1 до 10.
Использование паролей в
EXCEL
Установка
пароля для активной книги может
быть произведена следующим
образом:
try
// попытка установить пароль
Excel.ActiveWorkbook.protect(‘pass’);
except
// действия при неудачной попытке установить пароль
end;
где pass — устанавливаемый
пароль на книгу.
Снятие пароля
с книги аналогично, использовуем
команду
Excel.ActiveWorkbook.Unprotect(‘pass’);
где pass — пароль, установленный
для защиты книги.
Установка и
снятие пароля для активного
листа книги Excel производится
командами
Excel.ActiveSheet.protect(‘pass’);
// установка пароля
Excel.ActiveSheet.Unprotect(‘pass’);
// снятие пароля
где pass — пароль, установленный
для защиты книги.
Вспомогательные операции в
EXCEL
Удаление
строк со сдвигом вверх:
Excel.Rows[‘5:15’].Select;
Excel.Selection.Delete;
при выполнении данных действий
будут удалены строки с 5 по 15.
Установка
закрепления области на активном
листе Excel
// снимаем закрепление области,
если оно было задано
Excel.ActiveWindow.FreezePanes:=False;
// выделяем нужную ячейку, в данном случае D3
Excel.Range[‘D3’].Select;
// устанавливаем закрепление области
Excel.ActiveWindow.FreezePanes:=True;
Удачной работы!
Источник:
В данном обзоре рассмотрены
основные конструкции,
позволяющие получить доступ к
книге Excel из DELPHI.
Организация доступа к книге
EXCEL
Для
взаимодействия с MS excel в
программе необходимо
использовать модуль ComObj
uses ComObj;
и объявить переменную для
доступа к MS excel следующего
типа:
var Excel:
Variant;
Инициализация
переменной Excel в простейшем
случае можно осуществить так:
Excel := CreateOleObject(‘Excel.Application’);
Создание
новой книги:
Excel.Workbooks.Add;
Открытие
существующей книги (где
path
— путь к фалу с расширением xls.):
Excel.Workbooks.Open[path];
Открытие
существующей книги только для
чтения:
Excel.Workbooks.Open[path, 0,
True];
Закрытие
Excel:
Excel.ActiveWorkbook.Close;
Excel.Application.Quit;
Блокировка
запросов (подтвеждений,
уведомлений) Excel, например,
запретить запрос на сохранение
файла:
Excel.DisplayAlerts:=False;
Отображаем
Excel на экране:
Excel.Visible := True;
или скрываем:
Excel.Visible := False;
Печать
содержимого активного листа
excel:
Excel.ActiveSheet.PrintOut;
Чтение/запись данных в EXCEL
Доступ к
ячейке в текущей книге Excel
можно осуществить следующим
образом:
Excel.Range[‘B2′]:=’Привет!’;-
для записи значения в ячейку или
s:=Excel.Range[‘B2’]; —
для чтения,
где B2
— адрес ячейки.
Или используя стиль ссылок R1C1:
Excel.Range[excel.Cells[2, 2]]:=’Привет!’;,
где [2, 2]
— координата ячейки.
Вообще, ячейке Excel можно
присваивать любое значение
(символьное, целое, дробное,
дата) при этом Excel установит
форматирование в ячейке
применяемое по умолчанию.
Формат ячеек в EXCEL
Выделить
(выбрать) группу ячеек для
последующей работы можно так:
Excel.Range[Excel.Cells[1, 1],
Excel.Cells[5, 3]].Select;
или
Excel.Range[‘A1:C5’].Select;
при этом будет выделена область
находящаяся между ячейкой A1 и
C5.
После
выполнения выделения можно
установить:
1) объединение ячеек
Excel.Selection.MergeCells:=True;
2) перенос по словам
Excel.Selection.WrapText:=True;
3) горизонтальное выравнивание
Excel.Selection.HorizontalAlignment:=3;
при присваивании значения 1
используется выравнивание по
умолчанию, при 2 — выравнивание
слева, 3 — по центру, 4 —
справа.
4) вериткальное выравнивание
Excel.Selection.VerticalAlignment:=1;
присваиваемые значения
аналогичны горизонтальному
выравниванию.
5) граница для ячеек
Excel.Selection.Borders.LineStyle:=1;
При значении 1 границы ячеек
рисуются тонкими сплошными
линиями.
Кроме этого можно указать
значения для свойства Borders,
например, равное 3. Тогда
установится только верхняя
граница для блока выделения:
Excel.Selection.Borders[3].LineStyle:=1;
Значение свойства Borders задает
различную комбинацию граней
ячеек.
В обоих случаях можно
использовать значения в
диапазоне от 1 до 10.
Использование паролей в
EXCEL
Установка
пароля для активной книги может
быть произведена следующим
образом:
try
// попытка установить пароль
Excel.ActiveWorkbook.protect(‘pass’);
except
// действия при неудачной попытке установить пароль
end;
где pass — устанавливаемый
пароль на книгу.
Снятие пароля
с книги аналогично, использовуем
команду
Excel.ActiveWorkbook.Unprotect(‘pass’);
где pass — пароль, установленный
для защиты книги.
Установка и
снятие пароля для активного
листа книги Excel производится
командами
Excel.ActiveSheet.protect(‘pass’);
// установка пароля
Excel.ActiveSheet.Unprotect(‘pass’);
// снятие пароля
где pass — пароль, установленный
для защиты книги.
Вспомогательные операции в
EXCEL
Удаление
строк со сдвигом вверх:
Excel.Rows[‘5:15’].Select;
Excel.Selection.Delete;
при выполнении данных действий
будут удалены строки с 5 по 15.
Установка
закрепления области на активном
листе Excel
// снимаем закрепление области,
если оно было задано
Excel.ActiveWindow.FreezePanes:=False;
// выделяем нужную ячейку, в данном случае D3
Excel.Range[‘D3’].Select;
// устанавливаем закрепление области
Excel.ActiveWindow.FreezePanes:=True;
Удачной работы!
I am developing an application that need to generate excel sheets. How do we append rows
to an existing excel sheet? I am using Delphi 2007.(and I am using SM Software TXLS… components…but I am ok with answers in native delphi excel components).
Thanking you all,
Pradeep
CloudyMarble
36.7k70 gold badges96 silver badges130 bronze badges
asked Feb 25, 2011 at 6:55
Over the years, I’ve found Deborah Pate’s site has helped me by providing useful code samples: http://www.djpate.freeserve.co.uk/AutoExcl.htm. We use the CreateOleObject approach.
answered Feb 25, 2011 at 13:09
RobertFrankRobertFrank
7,32211 gold badges53 silver badges98 bronze badges
1
Normally you won’t need to append rows, because you can just reference any cell to write in it. You may need to insert rows in the middle of your sheet like this:
ExcelApplication.ActiveSheet.Rows[10].Insert;
or
ExcelApplication.ActiveSheet.ActiveCell.EntireRow.Insert;
If you develop for Excel, I think it is more convenient to use TExcelApplication because it is just a wrapper around the type library. You can use the source code of the imported type library as a reference. Another helpful tool is the macro recording in Excel itself. The VBA code created by recording a macro can easily be translated into Delphi code. Sometimes you need to do little changes or improvements, but it is still a lot of help when you are stuck.
answered Feb 25, 2011 at 7:08
GolezTrolGolezTrol
114k17 gold badges184 silver badges209 bronze badges
2
Hier some untested sample code you can use to insert data to Excel:
var
Cols: integer;
Rows: integer;
Excel, XLSheet: Variant;
failure: Integer;
begin
failure:=0;
try
Excel:=CreateOleObject('Excel.Application');
except
failure:=1;
end;
if failure = 0 then
begin
Excel.Visible:=False;
Excel.WorkBooks.Open(<Excell_Filename>);
XLSheet := Excel.Worksheets[1];
Cols := XLSheet.UsedRange.Columns.Count;
Rows := XLSheet.UsedRange.Rows.Count;
//Insert Data
Excel.Cells[1, 1].Value := 'SwissDelphiCenter.ch';
Excel.Cells[2, 1].Value := 'http://www.swissdelphicenter.ch';
Excel.Cells[3, 1].Value := FormatDateTime('dd-mmm-yyyy', Now);
Excel.Range['A2', 'D2'].Value := VarArrayOf([1, 10, 100, 1000]);
// Save the Workbook
Excel.SaveAs(Excell_Filename);
Excel.Workbooks.Close;
Excel.Quit;
Excel:=Unassigned;
end;
end;
answered Feb 25, 2011 at 9:28
CloudyMarbleCloudyMarble
36.7k70 gold badges96 silver badges130 bronze badges
Вначале рассмотрим вариант чтения данных использованием которого грешат те, кто только начинает свое знакомство с Excel в Delphi — чтение данных из каждой ячейки по отдельности. Тестовая процедура с таким вариантом чтения может выглядеть следующим образом:
procedure TForm16.SlowVariant; var Rows, Cols, i,j: integer; WorkSheet: OLEVariant; d: TDateTime; begin //открываем книгу ExcelApp.Workbooks.Open(edFile.Text); //получаем активный лист WorkSheet:=ExcelApp.ActiveWorkbook.ActiveSheet; //определяем количество строк и столбцов таблицы Rows:=WorkSheet.UsedRange.Rows.Count; Cols:=WorkSheet.UsedRange.Columns.Count; StringGrid1.RowCount:=Rows; StringGrid1.ColCount:=Cols; //засекаем время начала чтения d:=Now; //выводим данные в таблицу for I := 0 to Rows-1 do for j := 0 to Cols-1 do StringGrid1.Cells[J,I]:=WorkSheet.UsedRange.Cells[I+1,J+1].Value; Label2.Caption:='Время чтения всего листа: '+FormatDateTime('hh:mm:ss:zzz', Now()-d); end;
Счётчик будет в итоге содержать время чтения и вывода в StringGrid данных.
Для теста этого варианта был создан лист Excel, содержащий 143 строки и 142 столбца с данными, т.е. 20306 ячеек с данными.
На время чтения ушло 12 секунд.
12 секунд на чтение…а если будет 1000 строк и 1000 столбцов? Так можно и не дождаться окончания операции.
Если внимательно посмотреть на процедуру, представленную выше, то можно видеть, что в цикле мы каждый раз при каждой итерации вначале получаем диапазон, занятый данными, затем в этом диапазоне получаем определенную ячейку и только потом считываем значение в ячейке. На самом деле столько лишних операций для чтения данных с листа не требуется. Тем более, когда данные располагаются непрерывным массивом. Более выгодным в этом случае вариантом чтения будет чтение данных сразу из всего диапазона в массив.
На деле реализация этого варианты работы окажется даже проще, чем представленного выше. Смотрите сами. Вот вариант чтения данных целым диапазоном:
procedure TForm16.RangeRead; var Rows, Cols, i,j: integer; WorkSheet: OLEVariant; FData: OLEVariant; d: TDateTime; begin //открываем книгу ExcelApp.Workbooks.Open(edFile.Text); //получаем активный лист WorkSheet:=ExcelApp.ActiveWorkbook.ActiveSheet; //определяем количество строк и столбцов таблицы Rows:=WorkSheet.UsedRange.Rows.Count; Cols:=WorkSheet.UsedRange.Columns.Count; //считываем данные всего диапазона FData:=WorkSheet.UsedRange.Value; StringGrid1.RowCount:=Rows; StringGrid1.ColCount:=Cols; //засекаем время начала чтения d:=Now; //выводим данные в таблицу for I := 0 to Rows-1 do for j := 0 to Cols-1 do StringGrid1.Cells[J,I]:=FData[I+1,J+1]; Label2.Caption:='Время чтения всего листа: '+FormatDateTime('hh:mm:ss:zzz', Now()-d); end;
Здесь мы ввели всего одну переменную FData типа Variant. В эту переменную мы прочитали за 1 операцию весь диапазон, занятый данными. После того как диапазон прочитан FData будет содержать матрицу, каждый элемент которой будет типом данных, определенным в Excel.
Время выполнения операции 0.022 секунды!
Как видите, прирост скорости оказался колоссальным, учитывая даже то, что в счётчик попало время обновления StringGrid’а.
Вот и всё, Удачи!