Пятница, 19.04.2024, 07:19
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

Меню сайта
Категории раздела
Delphi [12]
Материалы, связанные с программирование на Delphi
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


















Тиц
Главная » 2011 » Сентябрь » 30 » Работа с EXCEL из Delphi
22:25
Работа с EXCEL из Delphi
Работа с EXCEL из Delphi


Работа с EXCEL из Delphi.       В этой статье я познакомлю вас как работать с MS Excel из Delphi. Данная статья может быть полезна людям, которые хотят научиться создавать различные отчеты  в Excel из программ написанных на Delphi. Статья содержит справочные данные необходимые для работы с MS Excel. Здесь вы найдете информацию о том как:

- Подключить и правильно отключить интерфейс Excel;
- Как изменить размер, цвет и тип шрифта;
- Как выделить, объединить, заполнить и размножить  диапазон ячеек;
- Как повернуть и отцентрировать текст;
- Как нарисовать границы ячеек;
- Как ввести формулу в ячейку и многое другое...

И так, начнем...
 

 

 

Работать будем через модуль ComObj, для этого в uses необходимо добавить модуль  ComObj и  модуль Excel_TLB (для MS Excel 2007).

Uses ……, ComObj,  Excel_TLB;

Модуль Excel_TLB содержит необходимые константы  для работы с Excel, его можно не подключать, но тогда придется в ручную прописывать значения всех используемых констант из этого модуля. Значения констант можно найти внутри модуля или в интернете, но для разных версий MS Excel они разные.
Внимание!!!  Модуль Excel_TLB в других версиях MS Excel может называться по другому. Перед подключением модуля Excel_TLB, необходимо импортировать библиотеку Excel. Для этого выберите Component->Import Component->Import a Type Library-> находим MS Excel и следуем инструкциям.


В разделе описания переменных мы должны описать переменную типа Variant или OleVariant для подключения интерфейса Excel. Я описал переменную excel.

var

Form1: TForm1;
excel: variant; // Переменная в которой создаётся объект EXCEL
 

 

 

Создание документа

Внимание!!! Всегда когда создаете объект интерфейса, заключайте  процедуру создания в модуль обработки ошибок:
try
создаем интерфейс;
формируем отчет;
освобождаем интерфейс;
Except
обрабатываем ошибки;
освобождаем интерфейс;
end;

Далее идет краткий справочник по основным функциям работы с EXCEL

try
// создаем обьект EXCEL
excel := CreateOleObject('Excel.Application');

// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;

// создаем новый документ рабочую книгу
excel.WorkBooks.Add;

// или загружаем его из директории с программой
excel.WorkBooks.Open(GetCurrentDir() + '\отчет.xls');

{ GetCurrentDir()- возвращает путь к директории с программой}

// Делаем его видимым данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
excel.Visible := true;

//задаем тип формул в формате R1C1
excel.Application.ReferenceStyle := xlR1C1;

// задаем тип формул в формате A1
excel.Application.ReferenceStyle := xlA1;

// Задаем название первому и второму листу
excel.WorkBooks[1].WorkSheets[1].Name := 'Отчет1';
excel.WorkBooks[1].WorkSheets[2].Name := 'Отчет2';

//задаем формат числа для первой и четвертой колонки формат числа
excel.WorkBooks[1].WorkSheets[1].Columns[1].NumberFormat := '0,00';
excel.WorkBooks[1].WorkSheets[1].Columns[4].NumberFormat := '0,0';

// задаем ширину первой и второй колонки
excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 10;
excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 20;

// задаем начертание, цвет, размер и тип шрифта для первого ряда
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Bold := True; //жирный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Color := clRed;  // цвет красный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Size := 12;  //размер 12
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Name := 'Times New Roman';  //шрифт

//присваиваем ячейке 1,4 и 2,4 значения (1 - ряд, 4 - колонка)
excel.WorkBooks[1].WorkSheets[1].Cells[1, 4] := 'А так можно внести значение в ячейку';
excel.WorkBooks[1].WorkSheets[1].Cells[2, 4] := 'А так можно внести значение в ячейку';

//ввод в ячейку 'A12' формулы '=b5+c4'
excel.WorkBooks[1].WorkSheets[1].Range['A12'].Formula:='=b5+c4';

// Выравнивам первый ряд по центру по вертикали
excel.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := xlCenter;

// Выравнивам первый ряд по центру по горизонтали
excel.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := xlCenter;

// Выравнивам в ячейке по левому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 2].HorizontalAlignment := xlLeft;

// Выравнивам в ячейке по правому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 4].HorizontalAlignment := xlRight;

// Обьединяем ячейки 'A1:A8'
excel.WorkBooks[1].WorkSheets[1].Range['A1:A8'].Merge;

// Поворачиваем слова под углом 90 градусов для второго ряда
excel.WorkBooks[1].WorkSheets[1].Rows[2].Orientation := 90;

// Поворачиваем слова под углом 45 градусов для диапазона ячеек 'B3:D3'
excel.WorkBooks[1].WorkSheets[1].Range['B3:D3'].Orientation := 45;

//рисуем границы  выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlMedium;// толщина линии

//рисуем границы  выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlMedium;

//рисуем границы  выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;

//рисуем границы  выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;

//рисуем границы  выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;

//рисуем границы  выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlMedium;

//автозаполнение выделенного диапазона
//для примера заполним область ячеек 'A10:C10' словом 'привет'
//и размножим его вниз еще на пять ячеек 'A10:C15'

excel.WorkBooks[1].WorkSheets[1].Range['A10:C10'].Value:='привет';

//выделяем диапазон ячеек 'A10:C10'
excel.WorkBooks[1].WorkSheets[1].Range['A10:C10'].Select;

//автозаполняем (копируем) выделенным диапазоном область ячеек 'A10:C15'
excel.selection.autofill(excel.WorkBooks[1].WorkSheets[1].Range['A10:C15'],xlFillDefault);

//отключаем предупреждения, чтобы не задавал вопросов о сохранении и других
excel.DisplayAlerts := False;

 //сохраняем документ в формате Excel 97-2003
 excel.ActiveWorkBook.Saveas(GetCurrentDir() + '\отчет.xls',xlExcel8);

 //сохраняем документ в текущем формате Excel 2007
 excel.ActiveWorkBook.Saveas(GetCurrentDir() + '\отчет.xlsx');

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;

Except

//обрабатываем ошибки
showmessage('Внимание! Произошла ошибка при создании MS Excel приложения');

//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
excel := Unassigned;
end;
end;


При работе с листом Excel мы можем использовать следующие варианты:
- работать с областью Range['B3:D3'];
- работать с ячейкой Cells[2, 4] где 2 - ряд, 4 - колонка;
- работать с рядами Rows[1] или с диапазоном рядов Rows['1:5'];
- работать с колонками Columns[1] или диапазоном колонок Columns['A:I'];

Range['A1'] и Cells[1, 1] обозначают одно и тоже.

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

Например так:
//закроем все книги
excel.Workbooks.Close;

//закрываем Excel
excel.Application.quit;

//освобождаем интерфейсы
sheet:=Unassigned; //интерфейс листа если он был создан
WorkBook := Unassigned;//интерфейс рабочей книги если он был создан
excel := Unassigned;//интерфейс самого предложения если он был создан

end;


Ниже привожу пример вывода в Excel из Delphi таблицы умножения с подробными комментариями.

 

 

 

Работа с EXCEL из Delphi.

 

 

 

 

Работа с EXCEL из Delphi.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, comobj, StdCtrls, Excel_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  excel: variant; // Переменная в которой создаётся объект EXCEL
  MyData: variant; // Переменная в которой формируется таблица умножения
  i,j:integer;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
try
// Обьект EXCEL
excel := CreateOleObject('Excel.Application');
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// новый документ
excel.WorkBooks.Add;

//объявляем вариантный массив
MyData := VarArrayCreate([1,9,1,9],varVariant);
for I := 1 to 9 do
for J := 1 to 9 do
  MyData[i,j]:=i*j;

// Обьединяем ячейки 'A1:I1'
excel.WorkBooks[1].WorkSheets[1].Range['A1:I1'].Merge;
//Пишем заголовок
excel.WorkBooks[1].WorkSheets[1].Range['A1'].Value:='Таблица умножения';
// Выравнивам заголовок по центру
excel.WorkBooks[1].WorkSheets[1].Range['A1'].HorizontalAlignment := xlCenter;
// задаем ширину  колонок с A по I
excel.WorkBooks[1].WorkSheets[1].Columns['A:I'].ColumnWidth := 3;

//выделяем область таблицы умножения ['A2:I10'] и рисуем границы
excel.WorkBooks[1].WorkSheets[1].Range['A2:I10'].select;
//рисуем границы  выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlThin;// толщина линии
//рисуем границы  выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlThin;
//рисуем границы  выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlThin;
//рисуем границы  выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlThin;
//рисуем границы  выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlThin;
//рисуем границы  выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlThin;


//присваиваем диапазону ['A2:I10'] значения вариантного массива  MyData это значительно ускоряет работу, нежели вывод по //ячеечно

excel.WorkBooks[1].WorkSheets[1].Range['A2:I10'].Value:=MyData;

// Делаем его видимым
excel.Visible := true;
//освобождаем интерфейсы
MyData:= Unassigned;
excel := Unassigned;
Except
showmessage('Внимание! Произошла ошибка при создании MS Excel приложения');
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
MyData:= Unassigned;
excel := Unassigned;
end;
end;

end.

При написании статьи использовался материал с сайта http://vlad2000.h1.ru/Frames/Statyi/page_14.html

 

 

Категория: Delphi | Просмотров: 72937 | Добавил: xaramamburu | Рейтинг: 3.8/4
Всего комментариев: 2
2 pattonmike  
0
Очень интересная статья про файлы xls: http://seucomp.ru/xls_chem_otkryt.php непременно ознакомьтесь

1 Студенто  
0
Замечательная статья (особенно радует обилие комментариев). Очень помогла при написании курсовика. Спасибо автору:)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Календарь
«  Сентябрь 2011  »
ПнВтСрЧтПтСбВс
   1234
567891011
12131415161718
19202122232425
2627282930
Архив записей
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 585
Уголок общения



Copyright MyCorp © 2024Конструктор сайтов - uCoz