Для початку, трохи загальних моментів по роботі з MS Office в Delphi. І перше, що ми зробимо - це створимо об'єкт Word.Application. Створюється цей об'єкт абсолютно так само, як і об'єкт Excel.Application:
uses ComObj; var Word: variant; [. ] Procedure CreateWord (const Visible: boolean); begin Word: = CreateOleObject ( 'Word.Application'); Word.Visible: = Visible; end;
Все досить просто. Далі ми можемо працювати з об'єктом наступним чином:
- Створювати документ Word з нуля
- Відкрити вже існуючий документ і змінити в ньому текст для отримання необхідної форми документа.
Розглянемо обидва варіанти, тому що обидва вони мають як свої плюси, так і недоліки.
1. Створення документа Microsoft Word в Delphi з нуля.
Щоб створити новий документ необхідно виконати метод Add у колекції Documents, тобто .:
і після цієї операції вже починати працювати з документами звертаючись до нього по індексу або імені в колекції. Також, можна створити новий документ за шаблоном (* .dot). Для цього необхідно виконати той же метод Add, але з одним вхідним параметром - шляхом до файлу-шаблоном:
Згоден з вами, Наіль. І завжди намагаюся якраз мінімізувати зайві витрати при розробці програм. Переконати людини можна, особливо, коли в руках є «убеждалка» у вигляді прайс-листа :) Але можу якщо сам по собі замовник програми ніяк не залежить від закупівлі софта - переконати практично нереально. Простий приклад - університет. В універі все закупівлі софа проходять централізовано, і окремо взятої кафедрі по барабану скільки чого варто - вона просто регулярно відраховує до фонду універу фіксований відсоток з доходу і завжди має свіжий софт і нікому не важливо треба кафедрі цей софт чи ні - всунули балванки і йди встановлюй . Кафедрі потрібно нестандартна програма, наприклад, генеруюча списки студентів за певними ознаками (не обов'язково статевим) і повинна формувати документ, скажімо для секретаря кафедри, навчальних майстрів і т.д. щоб вони його далі переробляли, вносили чогось і т.д. Як думаєте яке перша вимога в цьому випадку? звіт в файлі Word / Excel. І тільки заїкнися по Оо - задушать :).
З.И. За посилання на бібліотеку - спасибо огроменное, тому що паралельно якраз в Лазарус намагаюся подружитися з оО - може частина бібліотеки і стати в нагоді якраз
Алімбеков Хидзен.
Ось текст макросу:
[Code]
Sub Макрос1 ()
'
'Макрос1 Макрос
'
'
With ListGalleries (wdNumberGallery) .ListTemplates (1) .ListLevels (1)
.NumberFormat = "% 1."
.TrailingCharacter = wdTrailingTab
.NumberStyle = wdListNumberStyleArabic
.NumberPosition = CentimetersToPoints (0.63)
.Alignment = wdListLevelAlignLeft
.TextPosition = CentimetersToPoints (1.27)
.TabPosition = wdUndefined
.ResetOnHigher = 0
.StartAt = 1
With .Font
.Bold = wdUndefined
.Italic = wdUndefined
.StrikeThrough = wdUndefined
.Subscript = wdUndefined
.Superscript = wdUndefined
.Shadow = wdUndefined
.Outline = wdUndefined
.Emboss = wdUndefined
.Engrave = wdUndefined
.AllCaps = wdUndefined
.Hidden = wdUndefined
.Underline = wdUndefined
.Color = wdUndefined
.Size = wdUndefined
.Animation = wdUndefined
.DoubleStrikeThrough = wdUndefined
.Name = ""
End With
.LinkedStyle = ""
End With
ListGalleries (wdNumberGallery) .ListTemplates (1) .Name = ""
Selection.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate: = _
ListGalleries (wdNumberGallery) .ListTemplates (1), ContinuePreviousList: = _
False, ApplyTo: = wdListApplyToWholeList, DefaultListBehavior: = _
wdWord10ListBehavior
Selection.TypeText Text: = "Пункт 1"
Selection.TypeParagraph
Selection.TypeText Text: = "Пункт 2"
Selection.TypeParagraph
Selection.TypeText Text: = "Пункт 3"
Selection.TypeParagraph
Selection.Range.ListFormat.RemoveNumbers NumberType: = wdNumberParagraph
Selection.TypeText Text: = "Кінець нумерованого списку"
End Sub
[/ Code]
Прошу вибачення за дурне питання, але як саме викликати цю функцію в коді? В тому сенсі, що мені наприклад треба замінити рядки в декількох місцях, тобто викликати треба кілька разів. Перш за все, не помітивши, що це НЕ процедура, думав просто окремим оператором кілька разів, але потім помітив function, і не можу збагнути як викликати, адже виклик повинен бути після оператора присвоєння.
Владислав Баженов.Так і викликайте кілька разів в коді. Результат функції - boolean. Якщо заміна тексту пройшла успішно, то функція поверне True, інакше False. Якщо вам не важливо заміниться текст чи ні, то викликайте так:
begin
// тут якийсь код
FindAndReplace ( 'Текст', 'Замінюючий текст');
// знову кокой-то ваш код
FindAndReplace ( 'Текст2', 'Замінюючий Текст2');
end;
Або так, есді подальша робота залежить від того, буде замінене чи текст чи ні:
begin
// тут якийсь код
if FindAndReplace ( 'Текст', 'Замінюючий текст') then
FindAndReplace ( 'Текст2', 'Замінюючий Текст2')
else
ShowMessage ( 'Не вдалося замінити рядок "Текст"')
end;