Робота з MS WORD з DELPHI 5/6/7. Нестандартні звіти, Різне, Програмування, статті

Автор: © Шлеенкін Олександр






Введення 


Дана стаття написана на базі реальної програми “Автоматизація виробництва” – автоматичної генерації супровідної документації при розробці друкованих плат на програмних продуктах “P-CAD 2000/2001”.


На кожному підприємстві, будь то малий бізнес і величезний завод, чималу роль відіграє складання документації та звітів. Майже завжди цим займається спеціально виділений чоловік. Так заведено вже давно, але тепер все частіше з’являються ініціативні керівники, які прагнуть звести ці гори однотипної рутинної роботи з особи на машину. Для цього і використовують програми автоматизації виробництва. Ці програми автоматично генерують необхідну документацію. Найчастіше це зводиться до роботи з базами даних і бібліотеками. Є багато програм роблять це. Але типів такої документації настільки багато, що сучасні програмні монстри, такі як користувацька програма (MS ACCESS) або програмований монстр (ORACLE) не в змозі забезпечити навіть половини потреб. Адже у кожного підприємства своя з роками склалася традиція заповнення документації або свій “Норма контроль” із заданими обов’язковими параметрами. Універсальної програми такого сорту немає і бути не може. Оскільки специфіка роботи підприємства може бути як гнучкою в області документації (комерційний ларьок), так і строго встановленої на світовому рівні (банк або виробнича сфера). Для вирішення цих проблем використовують нестандартні звіти. Звіти зроблені спеціально під вимоги, накладені на їх оформлення. Ви тільки уявіть, ту роботу, яку співробітник виконував кілька місяців, програма зробить за пару хвилин! І це цілком реально. Дана стаття являє собою набір рад і прикладів, які допоможуть розробнику розібратися в настільки залишеної без уваги темі, як автоматизація виробництва. Оскільки документації по цій темі практично немає, то ця стаття допоможе різко зменшити час розробки таких програм з місяців до тижнів. Але хоча за пропонованою інформації вже були створені описані вище програми, цієї інформації може все одно виявитися недостатньо. В кінці статті ви знайдете координати зв’язку для поповнення змістовної частини статті та питань. Ілюструють приклади ми наводимо мовою Delphi 32 (версії 5 і вище). Вибір був зупинений на Делфі на увазі її простоти і наочності, але всі ідеї і реалізації, викладені у статті, легко переносяться на будь-який інший об’єктно орієнтована мова програмування високого рівня.







Нестандартні звіти – хто і навіщо цим займається  

На питання “навіщо” ми, думаю, дали вже достатньо аргументації. Але все-таки це не все, зупинимося на ще неописаних проблемах.

Перше питання, яке нам зазвичай задають – це де я зможу це використовувати окрім як на підприємстві, сфера застосування даної тематики досить широка, розглянемо деякі питання та варіанти їх вирішення за коштами роботи з Ворд і створенням звітів:



  1. Зручність інтерфейсу. Ви можете надавати користувачеві інформацію прямо через WORD, де він зможе або роздрукувати її, або внести необхідні коректування або зберегти собі копію. Погодьтеся, щоб реалізувати це як-небудь інакше піде дуже багато часу, а інтерфейс WORD інтуїтивний, знайомий і зрозумілий, так що ряд проблем просто відпадає.
  2. Ви можете користуватися будь-якими засобами, якими розташовує Ворд. У тому числі програвати відео та аудіо записи, видавати зображення, крім того, стають доступні будь-які можливості конвертації файлів (Наприклад, можна не використовуючи тегів через Ворд створити документ HTML)
  3. Реальністю стає програма, що аналізує документи формату WORD на диску і створення бібліотеки виду назва документа = ім’я файлу, причому всю інформацію можна напряму збирати з WORD документів.
  4. Можна реалізовувати локальні операції, припустимо, всі файли WORD перевести в DOSовскіе TXT файли. І багато, багато іншого.

А на рахунок хто ж цим займається? Ця інформація може бути корисна керівникам. Будь WINDOWS програміст з вищою або середньо спеціальною освітою, знайомий з ЯВУ і ООП. Такого виду програмістів часто називають прикладними. Термін виготовлення в середньому 2-3 місяці з урахуванням бета тестування.







Основи роботи з OLE 

На програмному рівні робота з WORD полягає у використанні OLE. Основна структура взаємодії така: Існує програма СЕРВЕР, яка вважається головною і саме вона виконує всі операції, в нашому випадку сервером є програма WORD. З цих слів вже ясно, що якщо WORD не встановлено на комп’ютері, то є сервер відсутній, то нічого виконано бути не може. Просто нікому буде виконувати. Це, по суті, найбільш поширений питання серед програмістів середнього класу. Друга взаємодіюча програма – це програма КЛІЄНТ, все, що вона робить – це пов’язується з сервером і просить його виконати необхідні операції, сама по собі вона нічого не може. У результаті такої взаємодії і вирішується поставлене завдання. Тепер розглянемо реалізацію:










Procedure Word.Run;
var verr,verr1:string;
i,verrI:integer;
const DigiChar = [“0″,”1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9”];
begin
try
MsWord:=CreateOleObject(“Word.Application”);
MsWord.Visible:=False;
except error (1, “Microsoft Word не встановлений”);
end;
verr:=Trim(Version);
verr1:=””;
for i:=1 to Length(verr) do
if not(verr[i] in DigiChar) then break
else verr1:=verr1+verr[i];
verrI:=StrToInt(verr1); if verrI <9 then error (1, "Потрібна WORD 2000/XP або вище"); end;

Ця процедура пов’язує змінну MsWord з Ole, в результаті чого підвантажується сам WORD, далі ми робимо його поки невидимим і перевіряємо версію, пояснення процедури перевірки версії будуть пізніше.










type Word=class
public
function Version:string; //shadow
procedure Error(i:integer;str:string); //intro
MsWord:Variant; // Main
end;

Головний клас, в якому описані основні змінні і процедури необхідні для коректної роботи з WORD.

Слід пам’ятати і здійснювати всі необхідні перевірки сумісності відразу, щоб уникнути некоректної роботи згодом. У разі відсутності Ворд або невідповідності версії необхідно відразу попередити про це користувача для прийняття необхідних заходів …







Помилки при виклику WORD 


Для початку опишемо процедуру завантаження в WORD DOC файлу, робиться це так:









procedure Word.Open(fileName:string);
begin
try
MsWord.Documents.Add(fileName,EmptyParam);
except Error (2, “файл не знайдено”);
end;
end;


Можна до вже відкритого додати ще один, так щоб в результаті з двох отримати один.









procedure Word.Open_Next(fileName:string);
begin
try
MsWord.Selection.InsertFile(FileName:=filename, ConfirmConversions:=false,Link:=false);
except Error (2, “файл не знайдено”);
end;
end;


A от і процедура, яка найбільш часто використовується в додатках такого типу!









procedure Word.Error(i:integer;str:string);
begin
case i of
1:begin showmessage(str); showmessage (“Продовження роботи неможливо”);
Application.Terminate;
end;
2:begin showmessage(str); showmessage (“Продовження роботи неможливо”);
Application.Terminate;
end;
end;
showmessage(str);
Exit;
end;


А тепер розглянемо проблеми, які зустрічаються при роботі з WORD, про які говорилося раніше.


  1. Якщо встановити Ворд і спробувати відразу зв’язатися з ним через Ole, то нічого не вийде, справа в тому, що при першому запуску WORD програма пропонує надрукувати тестову сторінку, при цьому, ніяк не повідомивши про це Ole клієнту. Через що в роботі вашої програми може відбуватися збій. І виправлення ця помилка не підлягає, дана неприємність – справа рук компанії MICROSOFT створила WORD і поки вона цю проблему вирішувати не збирається, як видно з WORD XP.
  2. Ще може бути ситуація, коли відкривається WORD файл вже зайнятий іншим додатком, або копією вашого, тоді ворд пропонує використовувати режим тільки для читання, а зі звільнення ресурсу пропонує перехід у можливість редагування. Це теж впливає на роботу клієнтської програми, оскільки вимагає від користувача згоди на зміну режимів.
  3. Файл, який ви відкриваєте, просто не існує. Цю проблему вам доведеться вирішувати засобами мови розробки. WORD подібні сервіси не надає.
  4. На використовуваної машині не вистачає пам’яті. Відповідь на це питання дивіться в пункті 3.






Створення звітів в WORD (різні підходи)  


Існує декілька підходів створення нестандартних звітів в WORD, використовуючи OLE технології, розглянемо їх по порядку:


  1. Це стандартний підхід. Клієнт робить запит, сервер виконує, клієнт робить наступний запит і так далі, поки задача не буде вирішена.
  2. Можна використовувати вбудований в WORD мову VBA, написати необхідні макроси на Visual Basic Script і впровадити їх в поточний документ, тоді залишиться тільки викликати їх і все. За рахунок цього можна реально виграти в часі, але волею випадку цей метод в основному використовується в комп’ютерні віруси, за рахунок чого відноситься до вірусних технологій і через це деякі антивіруси можуть визначати вашу програму як інфіковану WORD вірусом. Тому даний метод так і не отримав поширення серед Ole програм.
  3. Третій метод – найважливіший, а полягає він в поєднанні перших двох, таким чином, демонструючи взаємне доповнення підходів.

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










procedure Word.search(data:string);
var What,Which,Count,Name:OLEVariant;
begin
What:=-1;
Which:=unAssigned;
Count:=unAssigned;
Name:=data;
MsWord.Selection.GoTo(What,Which,Count,Name);
end;


Тепер закладку ми знайшли запишемо в те місце небудь









procedure Word.insert(info:string;_bold,_italic,_StrikeThrough,_Underline:boolean;
_Size:integer;_center:boolean);
begin
MsWord.Selection.Font.Bold:=_bold;
MsWord.Selection.Font.italic:=_italic;
MsWord.Selection.Font.StrikeThrough:=_StrikeThrough;
MsWord.Selection.Font.Underline:=_Underline;
MsWord.Selection.Font.Size:=_Size;
if _center=true then MsWord.Selection.ParagraphFormat.Alignment:=1;
MsWord.selection.TypeText(info);
end;

Чудово, крім простого запису, ми отримали, і доступ до конфігурації тексту і можемо писати текст з атрибутами жирний, Курсив, закреслений, Підкреслений, вказувати розмір шрифту і навіть відслідковувати центровку, повірите мені – цього більш ніж достатньо для реалізації програм будь-якого ступеня складності!


Тепер напишемо процедуру переходу до наступної комірки таблиці, вважаємо, що на першу ми перейшли по закладці!









procedure Word.NextCell;
begin
MsWord.Run(“NextCell”);
end;

Таким же чином запускаються макроси WORD, тільки замість NextCell треба вставити ім’я макросу який хочемо запустити. Важливо не забувати, що через Ole можна викликати тільки “вільні макроси” тобто без параметрів! (VIRUS TECHNOLOGIES NOT FOR GAME)

А ось ще процедура. Вона дозволяє пропускати потрібне число елементів таблиці з урахуванням, що позиціонування на закладці ще можливо не було.










procedure Word.SkipCell(n:integer);
var i:integer;
begin
if n<1 then Exit;
if not NewList then begin
for i:=1 to n do MsWord.Run(“NextCell”);
end
else if n>1 then begin
search(“a1”);
for i:=1 to n-1 do MsWord.Run(“NextCell”)
end else
begin
search(“a1”);
end;
end;



Є ще команда по роботі з закладками. Це видалення.









MsWord.ActiveDocument.Bookmarks.Item(1).Delete;
 

Дана команда видаляє першій закладці. Це дуже зручно для багатосторінкового документа. Адже кожна сторінка містить однакові закладки, тому, перш ніж завантажити нову сторінку необхідно видалити старі закладки, інакше закладки не завантажаться.


Корисна процедура для всіх типів підходів до ole програмування. Вона перераховує сантиметри в пікселі.









function Word.CentimetersToPoints(a:Single):Single;
begin
{Converts a measurement from centimeters to points (1 cm = 28.35 points).
Returns the converted measurement as a Single.
Syntax
expression.CentimetersToPoints(Centimeters)
expression Optional. An expression that returns an Application object.
Centimeters Required Single. The centimeter value to be converted to points.}
Result:=28.35*a;
end;







Попереднє налаштування сторінки WORD 

Однією з найпоширеніших проблем роботи з Ole WORD – різні настройки конфігурації у різних версій WORD і на різних машинах, Внаслідок чого іноді документ відтворюється некоректно. Цю проблему можна вирішити, поставивши параметри конфігурації сторінки вручну. Серед таких налаштувань окремо можна виділити можливості коригування відступів праворуч, ліворуч, зверху і знизу, а також ряд інших параметрів.










procedure Word.Normalize;
begin
//MsWord.ActiveDocument.PageSetup.LineNumbering.Active := False;
//MsWord.ActiveDocument.PageSetup.Orientation :=0;// wdOrientPortrait;
MsWord.ActiveDocument.PageSetup.TopMargin := CentimetersToPoints(0.75);
MsWord.ActiveDocument.PageSetup.BottomMargin := CentimetersToPoints(0.2);
MsWord.ActiveDocument.PageSetup.LeftMargin := CentimetersToPoints(0.5);
MsWord.ActiveDocument.PageSetup.RightMargin := CentimetersToPoints(0.5);
MsWord.ActiveDocument.PageSetup.Gutter := CentimetersToPoints(0);
MsWord.ActiveDocument.PageSetup.HeaderDistance := CentimetersToPoints(1.27);
MsWord.ActiveDocument.PageSetup.FooterDistance := CentimetersToPoints(1.27);
//MsWord.ActiveDocument.PageSetup.PageWidth := CentimetersToPoints(21);
//MsWord.ActiveDocument.PageSetup.PageHeight := CentimetersToPoints(29.7);
//MsWord.ActiveDocument.PageSetup.FirstPageTray :=0;// wdPrinterDefaultBin;
//MsWord.ActiveDocument.PageSetup.OtherPagesTray :=0;// wdPrinterDefaultBin;
//MsWord.ActiveDocument.PageSetup.SectionStart :=2;// wdSectionNewPage;
//MsWord.ActiveDocument.PageSetup.OddAndEvenPagesHeaderFooter := False;
//MsWord.ActiveDocument.PageSetup.DifferentFirstPageHeaderFooter := False;
//MsWord.ActiveDocument.PageSetup.VerticalAlignment :=0;// wdAlignVerticalTop;
//MsWord.ActiveDocument.PageSetup.SuppressEndnotes := False;
//MsWord.ActiveDocument.PageSetup.MirrorMargins := False;
//MsWord.ActiveDocument.PageSetup.TwoPagesOnOne := False;
//MsWord.ActiveDocument.PageSetup.GutterPos :=0;// wdGutterPosLeft;
end;

Як ви бачите, ряд налаштувань закоментований, і це не випадковість. Оскільки кожне звернення до сервера займає час, то дуже об’ємне конфігурування системи може привести до того, що користувач подумає, що програма, мабуть, зависла і перезавантажиться, не давши виконати всі конфігурування цілком. Тому я раджу ввести цю можливість як корисну утиліту програми, типу: Full Correction







Корисні утиліти 

Взагалі-всього описаного вище цілком достатньо для роботи, але є таке поняття, як “підв’язати бантики і шнурочки” і саме це ми і зробимо …


Отримати версію WORD:









function Word.Version:string;
var verr:string;
begin
verr:=MsWord.Version;
Result:=verr;
end;


Закрити WORD:









procedure Word.Quit;
begin
MsWord.Quit;
end;


Закрити документ WORD:









procedure Word.Close;
begin
MsWord.Documents.Close;
end;


Зберегти активний документ:









procedure Word.Save(Name:string);
begin
MsWord.ActiveDocument.SaveAs(FileName:=Name);
end;


Відправлення активного документа на друк:









procedure Word.Print;
begin
MsWord.ActiveDocument.Print;
end;


Розрив сторінки – перехід до нової сторінки. Реалізується так:









MsWord.Selection.InsertBreak;







 

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*