Робота з 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>

*

*