Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6_Excel+Delphi.doc
Скачиваний:
0
Добавлен:
06.09.2019
Размер:
94.72 Кб
Скачать

Inc(index);

DataModule1.BookTable.Next;

end;

Перший рядок створює об'єкт Excel (XLApp:= CreateOleObject('Excel.Application')), і записує його в змінну XLApp. Ця змінна типу Variant. Variant - це тип, який може набувати будь-яких значень: рядки, числа, покажчики і ін.

Функція CreateOleObject дозволяє налагодити зв'язок з іншим додатком за технологією COM. Через цей зв'язок можна передавати дані в чужі додатки. Для цього програма, до якої відбувається приєднання, повинна мати відповідні можливості для здобуття даних із зовні (як, наприклад, Excel).

Другий рядок (XLApp.Visible:=true) заставляє запустити сам Excel. Потім додається нова робоча книга (XLApp.Workbooks.Add(-4167)). Число в дужках – це константа, яка означає створення книги і її змінювати не можна.

Далі задається назва книги, яка створюється.

XLApp.Workbooks[1].WorkSheets[1].Name:='Отчёт'.

Тепер Excel запущений і створена нова книга. Можна переходити до вдруковування даних. Але перш ніж це зробити треба відформатувати колонки і рядки. Для цього треба отримати покажчик на колонки робочої книги (Colum:= XLApp. Workbooks[1].WorkSheets['Отчёт'].Columns), та записати результат в змінну Colum типу Variant. Зараз послідовно змінити ширину колонок (Colum. Columns[1].ColumnWidth :=20).

Після цього в ту ж змінну треба записати покажчик на рядки робочої книги

(Colum := XLApp. Workbooks[1]. WorkSheets['Отчёт']. Rows). Для прикраси рядків звіту, можна встановити в перших двох рядків жирний шрифт (Colum. Rows[1]. Font.Bold := true). В квадратних дужках зараз порядковий номер рядка. Далі йдуть два рядки, в яких встановлюється колір першого рядка в синій та розмір шрифта 14.

Форматування закінчене, можна виводити дані. Для цього треба отримати покажчик на аркуш (Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт']). Для того, щоб вивести дані, потрібно просто привласнити значення в Sheet.Cells[строка, колонки].

Перегляньте код виведення даних таблиці:

index:=3;

DataModule1.BookTable.First;

for i:=0 to DataModule1.BookTable.RecordCount-1 do

begin

Sheet.Cells[index,1]:=DataModule1.BookTable.Fields.Fields[1].AsString;

Sheet.Cells[index,2]:=DataModule1.BookTable.Fields.Fields[2].AsString;

Sheet.Cells[index,3]:=DataModule1.BookTable.Fields.Fields[3].AsString;

Sheet.Cells[index,4]:=DataModule1.BookTable.Fields.Fields[6].AsString;

Sheet.Cells[index,5]:=FormatDateTime('dddddd',

DataModule1.BookTable.Fields.Fields[7].AsDateTime);

Inc(index);

DataModule1.BookTable.Next;

end;

Спочатку треба задати змінній index значення 3. Ця змінна буде відображати, в який рядок таблиці Excel треба виводити дані. Перші два рядки вже зайняті заголовками для звіту, тому дані потрібно починати виводити з третього рядка.

Треба звернути увагу, що рядки і таблиці в Excel нумеруються починаючи з одиниці, а не з нуля, як в інших таблицях і масивах.

Після цього треба перейти на перший рядок таблиці за допомогою методу First компонента AdoTable. Це необхідно, тому що користувач може перед натисненням кнопки звіту виділити будь-який рядок в середині таблиці і в цьому випадку звіт піде від цього виділеного рядка.

Зараз все готове для запуску циклу, в якому перебиратимуться всі рядки і інформація з них потраплятиме в Excel. Цикл запускається починаючи з 0 і до кількості рядків в таблиці. Таким чином перебераються всі записи.

Чому в якості циклу використовується саме конструкція for..to..do? Просто інколи зручніше так, а інколи й використовується цикл while. З циклом while цей код вигладив би так:

while DataModule1.BookTable.Eof<>true do

begin

//Вывод данных в Excel

Увеличение переменной index;

Переход на следующею строку;

end;

В принципі, все те ж саме, лише використовується цикл while. Цей цикл зручніше використовувати, коли потрібно вивести не всю таблицю, а, наприклад, лише починаючи з поточної позиції. В цьому випадку не треба буде перед циклом переходити на перший рядок, а досить лише запустити цей цикл, який виконуватиметься, поки DataModule1.BookTable.Eof не стане дорівнювати true, тобто не буде досягнутий кінець таблиці.

Не можна забувати усередині циклу переходити на наступний рядок. Якщо ж хтось забуде це зробити з циклом for, то в Excel попаде стільки ж рядків, скільки і в таблиці, але всі вони будуть однаковими (дорівнюють першому рядку таблиці). При циклі while програма може зависнути, тому що цикл буде безкінцевим, адже кінець таблиці ніколи не буде досягнутий, якщо не переходити на наступні рядки.

Тепер треба поговорити про виведення даних. Для цього треба послідовно заповнити колонки даними з таблиці, привласнюючи в Sheet.Cells[index, номер колонки], відповідні дані. Дані з бази даних беруться за індексом. Для цього використовується наступна конструкція:

DataModule1.BookTable.Fields.Fields[Номер поля].AsString

Після виведення даних треба збільшити змінну Index, щоб на наступному етапі виводити дані в наступний рядок і здійснити перехід на новий рядок. В принципі, це і все. Однак можна навести декілька зауважень й показати універсальний спосіб виведення даних з сітки:

for i:=1 to Table.RecordCount do

begin

for j:=1 to DBGrid.Columns.Count do

Sheet.Cells[Index, j]:=DBGrid.Fields[j-1].AsString;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]