Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи КПЗ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.24 Mб
Скачать

Лабораторна робота № 12 Тема: «Робота з com сервером Microsoft Excel»

Ціль роботи: отримати практичні навички по створенню звітів у електронній таблиці Microsoft Excel

 

Хід роботи

 

1. У СУБД MySQL спроектуйте базу даних "personal", а в ній створіть таблицю "sotr" для зберігання даних про співробітників з наступною структурою:

 

Ім'я поля

Тип

Розмір

tab

integer

ціле, ключове

fam

varchar

20

imya

varchar

15

datar

date

 

foto

longtext

 

 

Вказівки: Запустіть утиліту "SQL Manager for MySQL". Для створення БД у правій частині вікна клацніть команду "Створити нову базу даних". У вікні, що з'явилося, уведіть ім'я бази даних (personal) і клацніть "Далі". У полі "Хост" укажіть "localhost", у полі "Користувач" уведіть "root", у полі "Пароль" уведіть "111", у списку "Кодування" оберіть рядок "utf8 (UTF8-Unicod)" і клацніть на кнопці "Далі", а потім на кнопці "Готово". З'явиться вікно, у якому клацніть на кнопці "ОК".

У лівій частині вікна з'явиться створена база даних. Подвійним клацанням відкрийте її.

У правій частині вікна виберіть команду "Створити нову таблицю". У вікні на закладці "Загальні" у полі "Ім'я таблиці" укажіть "sotr", у списку "Тип таблиці вкажіть тип "MyISAM"". На закладці "Поля" уведіть структуру таблиці (див. завдання). Після введення всіх полів і їх типів клацніть на команді "Компілювати".

 

2. У середовищі Delphi створіть програму для роботи з даними таблиці. При цьому форма повинна мати вигляд:

 

 

Усі поля повинні мати назву зрозумілою мовою і підходящу ширину стовпців. Поле "foto" у сітці не відображається.

 

Вказівки: Для форми задайте властивості: Caption="Робота  з COM сервером Microsoft Excel", Position="DesktopCenter", Borderstyle="bsSingle".

У вікні Delphi перейдіть на закладку Zeos Access, на форму додайте компонент ZConnection. Для настроювання параметрів з'єднання для компонента задайте властивості: HostName=localhost, LoginPrompt=true (відображати вікно реєстрації користувача) Properties=codepage=cp1251 (встановити кодування символів - кирилиця), Protocol=mysql5 (встановити тип СУБД), User=root, Password=111, Connected=true, Catalog=ім'я_БД, DatabaseName=ім'я_БД(введіть із клавіатури).

На форму нанесіть компонент ZTable (ZeosAccess). Для компонента задайте властивості: Connection=ZConnection1, TableName=sotr. Клацніть два рази на компоненті ZTable1, викличте у вікні, що з'явилося, контекстне меню й виконайте команду Add All Fields. Для кожного поля у властивості DisplayLabel уведіть російську назву для сітки, у властивості DisplayWidth введіть потрібну ширину поля в символах.

Для того, щоб програма коректно підключала таблицю в події OnCreate форми введіть код:

 

procedure tform1.formcreate(sender: tobject);

begin

    ztable1.active:=true;

end;  

 

Для того, щоб програма коректно відключала таблицю в події OnClose форми введіть код:

 

procedure tform1.formclose(sender: tobject);

begin

    ztable1.active:=false;

end;

 

Проектування сітки

 

Для таблиці нанесіть на форму компонент DataSource1 (Data Access). Установіть його властивість DataSet =ZTable1. Нанесіть на форму компонент DBGrid (Data Controls). У властивості DataSource укажіть ім'я компонента DataSource1.

Для створення панелі редагування сітки нанесіть на форму компонент DBNavigator (Data Controls) і задайте властивості: DataSource=DataSource1.

Заповніть таблицю 5-6 довільними записами.

 

3. Для роботи з полем "foto" праворуч від сітки розташуйте компонент DBImage і кнопки для додавання й видалення малюнка з поля

 

Вказівки: Поле "foto" містить зображення співробітника. Його заповнення будемо виконувати подвійним клацанням на компоненті DBImage і вибираючи зображення за допомогою діалогу OpenPictureDialog.

Нанесіть на форму компонент DBImage (Data Controls), укажіть для нього властивості: DataSource=DataSource1, DataField=foto, Stretch=true.

Нанесіть на форму компонент OpenPictureDialog (Dialogs). У властивості Filter видаліть всі типи файлів крім *.bmp.

Під компонентом DBImage створіть дві кнопки Button (Standard).

Перша кнопка дозволяє ввести в поле "foto" указаний графічний файл. Для цього для кнопки напишемо код:

 

procedure tform1.button1click(sender: tobject);

begin

    //відкриваємо діалог вибору графічного файлу

    if openpicturedialog1.execute = true then

    begin

        //переводимо таблицю в стан редагування

        ztable1.edit;

        //завантажуємо в поле foto обраний файл

        tblobfield(ztable1.fieldbyname('foto')).loadfromfile(openpicturedialog1.filename);

    end;

end;

 

Друга кнопка очищає поле foto. Для кнопки напишемо код:

 

procedure tform1.button2click(sender: tobject);

begin

    //якщо поле foto не порожнє    

    if ztable1.fieldbyname('foto').asstring<>'' then        

        //видаємо запит на очищення поля

        if application.messagebox('Очистити поле з фото?','Підтвердьте операцію',mb_yesno+mb_iconquestion)=idyes then            

        //якщо користувач відповів ствердно

        begin                 

            //переводимо таблицю в режим редагування

            ztable1.edit;                

            //очищаємо поле foto

            tblobfield(ztable1.fieldbyname('foto')).clear;            

        end;

end;

 

Для кожного введеного запису в полі "foto" додайте зображення співробітника. 

 

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

 

Вказівки: У теці із програмою створіть теку shablon для зберігання шаблонів і теку output для зберігання отриманих документів. Запустіть Microsoft Excel, розробіть довільний шаблон з іменами #tab#, #fam#, #imya#, #datar#. Збережіть файл у теку shablon. При цьому в поле тип файлу вкажіть Шаблон, а ім'я файлу Anketa.

Для формування анкети нанесіть на форму кнопку Button (Standard). У властивості Caption укажіть Анкета.

Для роботи з COM сервером підключіть в коді модуля форми файл comobj. Угорі модуля опишіть глобальну змінну виду:

 

e:variant;

 

Для кнопки напишіть код виду:

 

//намагаємося підключитися до сервера Excel

try

    e:=getactiveoleobject('excel.application');

//якщо підключення не вдале, то запускаємо Excel

except

    e:=createoleobject('excel.application');

end;

 

//створюємо нову книгу на основі шаблону

e.workbooks.add(extractfilepath(application.Exename)+'shablon\anketa.xlt');

 

//привласнюємо імені аркуша прізвище обраного співробітника

 e.activeworkbook.sheets.item[1].name:=ztable1.Fieldbyname('fam').asstring;

 

//заміняємо ім'я #tab# на значення поля tab

e.activeworkbook.sheets.item[1].cells.replace(what:='#tab#', replacement:=ztable1.Fieldbyname('tab').asstring);

 

//заміняємо ім'я #fam# на значення поля fam

e.activeworkbook.sheets.item[1].cells.replace(what:='#fam#', replacement:=ztable1.Fieldbyname('fam').asstring);

 

//заміняємо ім'я #imya# на значення поля imya

e.activeworkbook.sheets.item[1].cells.replace(what:='#imya#', replacement:=ztable1.Fieldbyname('imya').asstring);

 

//заміняємо ім'я #datar# на значення поля datar

e.activeworkbook.sheets.item[1].cells.replace(what:='#datar#', replacement:=ztable1.Fieldbyname('datar').asstring);

 

//робимо видимим вікно Excel

e.visible:=true;

 

5. Кнопка Список викликає контекстне меню, яке містить дві команди. Перша команда формує в програмі Excel книгу зі списком усіх співробітників підприємства. Друга команда формує в програмі Excel книгу зі списком відібраних співробітників підприємства. При цьому умови відбору задаються в полях на панелі Параметри фільтрації.

Книга зі списком формується на основі розробленого раніше шаблону й збереженого у вкладеній теці.

У книзі зі списком у кінець таблиці додати рядок, в останній чарунці якого відобразити загальне число співробітників.

 

Вказівки: За допомогою кнопки «Список» розкривається контекстне меню з командами «Всі дані» й «Тільки відібрані дані». Перша команда виводить список усіх співробітників, а друга команда виводить список тільки відібраних співробітників. Список відображається у вигляді таблиці. Під усіма рядками списку вставляється ще один рядок, в останньому стовпчику якої відображається загальне число співробітників, а сам рядок заливається сірим кольором.

 

Створення контекстного меню

 

Нанесіть на форму компонент PopupMenu (Standard). Подвійним клацанням на компоненті розкрийте редактор команд меню й уведіть дві команди: Усі дані, Тільки відібрані дані.

Формувати список співробітників будемо на підставі запиту. Нанесіть на форму компонент ZQuery1 (ZeosAccess). Для компонента вкажіть властивість Connection=ZConnection1.

Для введення команд для пунктів контекстного меню два рази клацніть на компоненті PopupMenu, а потім подвійним клацанням на потрібному пункті меню відкрийте вікно для введення потрібного коду.

Для першого пункту меню введіть код:

 

//формуємо запит на відбір усіх даних таблиці

zquery1.Active:=false;

zquery1.SQL.clear;

zquery1.sql.add('select * from sotr');

zquery1.Active:=true;

 

Для другого пункту меню спочатку потрібно створити панель уведення умов відбору данных. Нанесіть на форму компонент Groupbox (Standard) і вкажіть властивість Caption=Параметри фільтрації. На компоненті розмістіть написи й текстові поля як показано на малюнку (див. завдання).

Угорі коду модуля опишіть глобальну змінну для зберігання умови пошуку у вигляді:

 

//змінна для формування умови відбору

s:string;

 

Після створення панелі пошуку для другого пункту контекстного меню введіть код:

 

    //спочатку умова порожня   

    s:='';

 

    //якщо перше поле заповнене

    if edit1.text<>'' then

        //додаємо умову пошуку по полю tab

        s:='tab='+edit1.Text;

 

    //якщо друге поле заповнене

    if edit2.text<>'' then

        //додаємо умову пошуку по полю fam

        if s<>'' then

            s:=s+' and fam like '''+edit2.Text+'%'''

        else

            s:=s+'fam like '''+edit2.Text+'%''';

 

    //якщо третє поле заповнене

    if edit3.text<>'' then

        //додаємо умову пошуку по полю imya

        if s<>'' then

            s:=s+' and imya like '''+edit3.Text+'%'''

        else

            s:=s+'imya like '''+edit3.Text+'%''';

 

    //перевіряємо чи задана умова пошуку

    //якщо умова задана

    if s<>'' then

    //формуємо запит на відбір потрібних даних

    begin

        zquery1.Active:=false;

        zquery1.SQL.clear;

        zquery1.sql.add('select * from sotr where '+s);

        zquery1.Active:=true;

    end

    //якщо умова не задана

    else

        //видаємо повідомлення про помилкову операцію

        application.Messagebox('Умова пошуку не задана','Помилкова дія',mb_ok+mb_iconstop);

 

 Після створення меню його потрібно викликати по клацанню на кнопці Список. Для цього додайте на форму кнопку Button (Standard). Для кнопки вкажіть властивість Caption=Список. Для кнопки введіть код:

 

//викликаємо контекстне меню з розміщенням під кнопкою

popupmenu1.Popup(form1.Left+button4.left,form1.Top+button4.top+button4.height);

 

Створення процедури для формування списку співробітників

 

Спочатку потрібно підготувати файл шаблону. Для цього запустіть Microsoft Excel, у текст книги введіть довільний заголовок списку, а нижче на третьому рядку створіть таблицю, що складається з 1 рядка і 5 стовпчиків. Даний рядок буде відігравати роль шапки таблиці. У чарунках шапки введіть текст: № з/п, Таб.номер, Прізвище, Ім'я, Дата народ. Укажіть потрібну ширину стовпців, границі, задайте розмір шрифту, вирівнювання й інші параметри форматування на ваш розсуд. Збережіть файл у теку shablon. При цьому в полі тип файлу вкажіть Шаблон, а ім'я файлу Spisok.

Список буде формуватися на підставі даних, відібраних у компоненті ZQuery1. Цей компонент буде містити або всі записи таблиці, або відібрані записи (залежно від обраної команди з контекстного меню).

Сам код формування списку буде однаковим для обох пунктів меню. Тому ми його оформимо у вигляді окремої процедуру, а потім викличемо її для кожного пункту меню.

Угорі коду модуля в розділі опису процедур додайте опис своєї процедури у вигляді:

 

procedure spisok;

 

Унизу в розділі реалізації процедур модуля ведіть повний текст процедури у вигляді:

 

procedure Tform1.Spisok;

var i,n:integer;

begin

    //намагаємося підключитися до запущеної програми excel  

    try

        e:=getactiveoleobject('excel.application');

    //якщо підключення не вдале, запускаємо excel   

    except

        e:=createoleobject('excel.application');

    end;

 

    //створюємо нову книгу на основі шаблону

    e.workbooks.add(extractfilepath(application.Exename)+'shablon\spisok.xlt');

    //стаємо на перший запис у списку   

    zquery1.First;

    //лічильнику рядків привласнюємо 3, тому що в перший рядок таблиці (шапка) 

    //знаходиться у третьому рядку аркуша книги

    i:=3;

    //n - лічильник записів для стовпчика № п/п 

    n:=0;  

    //виділяємо шапку таблиці (за умови, що вона знаходиться на 3 рядку)

    e.activeworkbook.sheets.item[1].range['a3:e3'].select;    

    //копіюємо виділену шапку в буфер обміну   

    e.activeworkbook.sheets.item[1].range['a3:e3'].copy;

   

    //у циклі проходимо по всіх записах

    while not zquery1.Eof do

    begin

        //збільшуємо кількість рядків на 1

        i:=i+1;

        //збільшуємо лічильник записів на 1

        n:=n+1;        

        //стаємо в першу чарунку наступного рядка (ai)

        e.activeworkbook.sheets.item[1].range['a'+inttostr(i)].select;

        //вставляємо в наступний рядок скопійовану шапку        

        e.activeworkbook.sheets.item[1].paste;

        //заповнюємо стовпчик № п/п у новому рядку

        e.activeworkbook.sheets.item[1].cells[i,1].value:=n;

        //заповнюємо стовпчик Таб.номер у новому рядку

        e.activeworkbook.sheets.item[1].cells[i,2].value:=zquery1.Fieldbyname('tab').asstring;

        //заповнюємо стовпчик Прізвище в новому рядку

        e.activeworkbook.sheets.item[1].cells[i,3].value:=zquery1.Fieldbyname('fam').asstring;

        //заповнюємо стовпчик Ім'я в новому рядку

        e.activeworkbook.sheets.item[1].cells[i,4].value:=zquery1.Fieldbyname('imya').asstring;

        //заповнюємо стовпчик Дата народження в новому рядку 

        e.activeworkbook.sheets.item[1].cells[i,5].value:=zquery1.Fieldbyname('datar').asstring;

        //переходимо на наступний запис        

        zquery1.Next; 

    end;  

 

    // в окремому рядку розраховуємо кількість співробітників у списку

    //збільшуємо число рядків на 1

    i:=i+1;

    //стаємо в першу чарунку нового рядка

    e.activeworkbook.sheets.item[1].range['a'+inttostr(i)].select;

    //у таблиці в новий рядок  вставляємо скопійовану шапку

    e.activeworkbook.sheets.item[1].paste;

    //очищаємо скопійовану шапку від даних

     e.activeworkbook.sheets.item[1].range['a'+inttostr(i)+':e'+inttostr(i)].clearcontents;

    // у передостанній чарунці доданого рядка відобразимо текст

    e.activeworkbook.sheets.item[1].cells[i,4].value:='Кількість';

    // в останній чарунці доданого рядка відобразимо кількість співробітників

    //для цього використаємо функцію підрахунку кількості значень в діапазоні (counta)

    e.activeworkbook.sheets.item[1].cells[i,5].formula:='=counta(r4c1:r'+inttostr(i-1)+'c1)';

   

    //зафарбовуємо останній рядок сірим кольором

    e.activeworkbook.sheets.item[1].range['a'+inttostr(i)+':e'+inttostr(i)].interior.colorindex:=16;

    //після формування списку робимо вікно excel видимим

    e.visible:=true;

end;

   

Дану процедуру потрібно викликати в оброблювачах обох команд контекстного меню. Для цього наприкінці оброблювача першої команди і наприкінці гілки then останнього оператора if  оброблювача другої команди меню додайте команду виду:

 

spisok;