На этом шаге мы приведем предварительные сведения о работе с отдельными ячейками рабочей книги.
Для доступа к ячейкам можно использовать два разных объекта - объект типа Range, который ассоциируется с областью ячеек, или непосредственно объект Cell (ячейка листа рабочей книги). Если первый объект удобен для работы с целыми областями ячеек, то второй больше подходит для работы с отдельно взятой ячейкой. Эти объекты принадлежат объекту "лист" и требуют задания координат ячейки или области ячеек при обращении к ним. Например, для задания объекта, ассоциированного с областью ячеек A1:D5, используем следующий оператор:
MyRange:=Sheet.Range[Al:D5];
где Sheet - ссылка на лист рабочей книги. После удачного выполнения данного оператора переменная MyRange: Variant содержит ссылку на объект, ассоциированный с выбранной областью ячеек. Другой вариант данного оператора:
MyRange:= Е.Sheets.Item(1).Range('Al:D5');
Здесь мы получаем ссылку на область ячеек первого листа рабочей книги. Обеспечить доступ к отдельной ячейке можно с помощью как объекта Range, так и объекта Cell. Использование последнего в операторе получения доступа к ячейке может выглядеть так:
MyCell:=Sheet.Cells[1,1];
При выполнении данного оператора переменная MyCell будет хранить ссылку на ячейку А1.
Итак, мы получили доступ к ячейкам. Попробуем записать в них информацию из приложения на Delphi.
procedure TForm1.Button19Click(Sender: TObject); //Запись информации в ячейки листа рабочей книги var i:Integer; begin randomize; for i:=1 to 100 do ST.Cells(i,1):=random(10000); end;
В данном примере переменная ST содержит ссылку на лист рабочей книги (эта переменная была инициализирована ранее). Результат выполнения процедуры представлен на рисунке 1.
Рис.1. Запись информации в ячейки и чтение из рабочей книги
Если для записи в ячейки мы присваивали объекту Cells(row, column) значение, то для чтения данных используем оператор, в котором строковой переменной присваивается значение объекта Cells(row, column). В качестве примера импортируем значения ячеек рабочей книги, запишем их значения в объект ListBox3 и отобразим в форме.
procedure TForm1.Button20Click(Sender: TObject); //Чтение информации листа рабочей книги Excel var S:string; i:integer; begin ListBox3.Items.Clear; for i:=1 to 100 do begin S:=ST.Cells [i,1]; ListBox3.Items.Add(S); end; end;
Результат чтения данных также можно увидеть на рисунке 1.
Приведем полный текст приложения.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj; type TForm1 = class(TForm) Button1: TButton; CheckBox1: TCheckBox; Button2: TButton; Button3: TButton; Button4: TButton; OpenDialog1: TOpenDialog; Button5: TButton; Button6: TButton; Button7: TButton; ListBox1: TListBox; Label1: TLabel; Button8: TButton; Button9: TButton; Button10: TButton; Button11: TButton; SaveDialog1: TSaveDialog; Button12: TButton; Label2: TLabel; ComboBox1: TComboBox; Button13: TButton; Button14: TButton; Label3: TLabel; ListBox2: TListBox; Button15: TButton; Button16: TButton; Button17: TButton; Button18: TButton; Button19: TButton; Button20: TButton; Label4: TLabel; ListBox3: TListBox; procedure Button1Click(Sender: TObject); procedure CheckBox1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button11Click(Sender: TObject); procedure Button12Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure Button13Click(Sender: TObject); procedure Button14Click(Sender: TObject); procedure ListBox2Click(Sender: TObject); procedure Button15Click(Sender: TObject); procedure Button16Click(Sender: TObject); procedure Button17Click(Sender: TObject); procedure Button18Click(Sender: TObject); procedure Button19Click(Sender: TObject); procedure Button20Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var E:variant; WBS:variant; WB:variant; ST:variant; Raspologenie: Integer; //Расположение окон procedure TForm1.Button1Click(Sender: TObject); //Создание объекта Excel.Application begin E:=CreateOleObject('Excel.Application'); end; procedure TForm1.CheckBox1Click(Sender: TObject); //Отображение окна приложения Excel begin E.Visible:=CheckBox1.Checked; end; procedure TForm1.Button2Click(Sender: TObject); //Создание рабочей книги по умолчанию begin E.WorkBooks.Add; end; procedure TForm1.Button3Click(Sender: TObject); //Создание рабочей книги на основе шаблона 1 const xlWBATChart=-4109; begin E.WorkBooks.add(xlWBATChart); end; procedure TForm1.Button4Click(Sender: TObject); //Создание рабочей книги на основе шаблона 2 begin if OpenDialog1.Execute then E.WorkBooks.add(OpenDialog1.FileName); end; procedure TForm1.Button5Click(Sender: TObject); //Открытие существующей рабочей книги begin if OpenDialog1.Execute then E.WorkBooks.Open(OpenDialog1.FileName); end; procedure TForm1.Button6Click(Sender: TObject); //Открытие существующей рабочей книги в режиме "только для чтения" begin if OpenDialog1.Execute then E.WorkBooks.Open(FileName:=OpenDialog1.FileName, ReadOnly:=True); end; procedure TForm1.Button7Click(Sender: TObject); //Получение списка рабочих книг var i:integer; begin WBS:=E.WorkBooks; for i:=1 to WBS.Count do ListBox1.Items.Add(WBS.Item[i].Name+ '; '+WBS.Item[i].FullName); end; procedure TForm1.ListBox1Click(Sender: TObject); //Получение ссылки на выбранную рабочую книгу begin WBS.Item[ListBox1.ItemIndex+1].Activate; WB:=WBS.Item[ListBox1.ItemIndex+1]; end; procedure TForm1.Button8Click(Sender: TObject); //Сохранение рабочей книги begin WB.Save; end; procedure TForm1.Button9Click(Sender: TObject); //Сохранение рабочей книги под новым именем begin if SaveDialog1.Execute then WB.SaveAs(SaveDialog1.FileName); end; procedure TForm1.Button10Click(Sender: TObject); //Проверка сохранения рабочей книги begin if WB.Saved then MessageBox(handle,'Документ сохранен!','Внимание!',0) else MessageBox(handle,'Документ не сохранен!','Внимание!',0); end; procedure TForm1.Button11Click(Sender: TObject); //Закрытие рабочей книги begin WB.Close; end; procedure TForm1.Button12Click(Sender: TObject); //Добавление нового окна для открытой рабочей книги begin WB.NewWindow; end; procedure TForm1.ComboBox1Change(Sender: TObject); //Выбор способа расположения окон begin Case ComboBox1.ItemIndex Of 0: Raspologenie:=7; 1: Raspologenie:=-4128; 2: Raspologenie:=1; 3: Raspologenie:=-4166; End; WB.Windows.Arrange(ArrangeStyle:= Raspologenie, ActiveWorkbook:=True,SyncHorizontal:=True, SyncVertical:=True); end; procedure TForm1.Button13Click(Sender: TObject); //Добавление нового листа перед указанным листом рабочей книги begin WB.Sheets.Add(Before:=ST); end; procedure TForm1.Button14Click(Sender: TObject); //Получение списка листов рабочей книги var i:integer; begin ListBox2.Items.Clear; for i:=1 to WB.Sheets.Count do ListBox2.Items.Add(WB.Sheets.Item[i].Name); end; procedure TForm1.ListBox2Click(Sender: TObject); //Получение ссылки на лист рабочей книги begin ST:=WB.Sheets.Item[ListBox2.ItemIndex+1]; end; procedure TForm1.Button15Click(Sender: TObject); //Переименование листа begin ST.Name:='Привет!!!'; end; procedure TForm1.Button16Click(Sender: TObject); //Копирование рабочего листа и вставка его до оригинала begin ST.Copy(before:=ST); end; procedure TForm1.Button17Click(Sender: TObject); //Копирование рабочего листа и вставка его после оригинала begin ST.Copy(after:=ST); end; procedure TForm1.Button18Click(Sender: TObject); //Удаление выбранного листа с подавлением предупреждающего сообщения begin E.DisplayAlerts:=False; ST.Delete; E.DisplayAlerts:=True; end; procedure TForm1.Button19Click(Sender: TObject); //Запись информации в ячейки листа рабочей книги var i:Integer; begin randomize; for i:=1 to 100 do ST.Cells(i,1):=random(10000); end; procedure TForm1.Button20Click(Sender: TObject); //Чтение информации листа рабочей книги Excel var S:string; i:integer; begin ListBox3.Items.Clear; for i:=1 to 100 do begin S:=ST.Cells [i,1]; ListBox3.Items.Add(S); end; end; end.
На следующем шаге мы закончим изучение этого вопроса.