Пример работы с Word через OLE. Часть 2. Редко используемые элементы.


Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия - с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.

Не ленитесь ставить плюсики. Вам все равно - а мне приятно, и повергает еще что-нибудь полезное написать.

Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.

Для отображения закладок включите эту опцию в настройках вашего Word'а.

В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудьте указать свои пути.

Тестировалось на Office 2007.

Частично текст повторяет предыдущий пример. Некоторые переменные переименованы по стандарту Office: Text --> Selection. Doc --> ThisDocument.

Вот текст модуля:

Процедура ВыполнитьОбработку() Экспорт

    Попытка

       
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
       
Объект = ПолучитьCOMОбъект("C:\Users\NKrylov\Desktop\Тест.docx");
       
// Покажем документ.
       
Объект.Application.Visible = 1;
       
Word = Объект.Application;

       
ThisDocument = Word.Documents(1);
       
ThisDocument.Activate();

       
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
       
ThisDocument.GrammarChecked=0;
       
ThisDocument.ShowGrammaticalErrors=0;

       
// Готовим переменную в которой будет содержимое документа (текст).
       
Selection = Word.Selection;

       
// Очистим документ
        // Ctrl-A
       
Selection.WholeStory();
       
// Del
       
Selection.Delete(1, 1);

       
// Уменьшим междустрочный интервал.
       
Selection.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
       
Selection.ParagraphFormat.SpaceAfter = 0;      // 10 по умолчанию

        // Разметим документ. Это можно сделать и предварительно в макете
       
ThisDocument.Bookmarks.Add("Закладка1", Selection.Range());
       
Selection.TypeParagraph();
       
Selection.TypeText("34r3 ");
       
Selection.HomeKey(, 1);
       
ThisDocument.Bookmarks.Add("Закладка2", Selection.Range());
       
Selection.EndKey();
       
Selection.TypeParagraph();
       
ThisDocument.Bookmarks.Add("Закладка3", Selection.Range());
       
Selection.TypeParagraph();
       
ThisDocument.Bookmarks.Add("Закладка4", Selection.Range());
       
Selection.EndKey();

       
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
       
ThisDocument.Bookmarks("Закладка3").Range.Select();
       
Selection = Word.Selection;

       
Bookmark = ThisDocument.Bookmarks("Закладка3");
       
Table = ThisDocument.Tables.Add(Bookmark.Range(),1,5,1,2);
       
Table.Rows(1).Cells(1).Range.Text = 1;
       
Table.Rows(1).Cells(2).Range.Text = 2;
       
Table.Rows(1).Cells(3).Range.Text = 3;
       
Table.Rows(1).Cells(4).Range.Text = 4;
       
Table.Rows(1).Cells(5).Range.Text = 5;

       
// После вывода таблицы, появится "лишняя строка", удалим ее
        // в результате курсор встанет в область закладки 4
       
Selection.MoveDown(, 1);
       
Selection.Delete(1, 1);

       
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
        // в данном случае - в области закладки 2
       
ThisDocument.Bookmarks("Закладка2").Range.Select();
       
Selection = Word.Selection;
       
Text = Selection.Range.Text;
       
Selection.TypeText(Text + " sdcsdcs");
       
// При выводе текста закладка "сбросилась". Восстановим.
        // "Победить" эту проблему я так и не смог((
        // Хотя на практике, закладка больше и не понадобится.
        // Дважды выводить текст в одну и ту же область - не имеет смысла.
       
Selection.HomeKey(, 1);
       
ThisDocument.Bookmarks.Add("Закладка2", Selection.Range());
       
Selection.EndKey();

       
// В области закладки 4 сформируем нумерованный список
       
ThisDocument.Bookmarks("Закладка4").Range.Select();
       
Selection = Word.Selection; // активная (выделенная) область будет начинаться
        // от закладки 4)

        // Добавим текст "для опытов"
        // 1
       
Selection.TypeText("sdcsdcsdcsdc");
       
Selection.TypeParagraph();
       
// 2
       
Selection.TypeText("sdcsdcsdcsdc");
       
Selection.TypeParagraph();
       
// 3
       
Selection.TypeText("sdcsdcsdcsdc");
       
Selection.TypeParagraph();
       
// 4
       
Selection.TypeText("sdcsdcsdcsdc");
       
Selection.TypeParagraph();
       
// Выделяем введенный текст
       
Selection.MoveUp(,4,1);

       
// Настроим шаблон объекта галереи списков
        // Галереи списков бывают несккольких типов, 2 - нумерованные списки
       
ListTemplate = Word.ListGalleries(2).ListTemplates(1).ListLevels(1);
       
// Формат нумератора списка - точка после символа нумерации
       
ListTemplate.NumberFormat = "%1.";
       
// стиль нумератора - арабские цифры
       
ListTemplate.NumberStyle = 0; // wdListNumberStyleArabic
        // 4 - маленькие латинские буквы.
        // 2 - маленькие римские цифры.
        // 58- меленькие русские буквы.
        // Font = Template.Font; // можно указать форматирование текста списка

        // Применим шаблон к выделенному тексту
 
Selection.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));

       
// Перейдем в конец текста
       
Selection.EndKey(6);

       
// Добавим картинку
        // Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
       
Picture = Selection.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp", Ложь, Истина);
       
// Зададим размер
       
Picture.Height = 100;
       
Picture.Width  = 150;

       
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
       
Shape = Picture.ConvertToShape();
       
Shape.WrapFormat.Type = 0; // по контуру...

       
ThisDocument.Save();
       
//Объект.Application.Quit();
       
Объект = Неопределено;
    Исключение
       
ThisDocument.Save();
       
Сообщить(ОписаниеОшибки());
       
//Объект.Application.Quit();
       
Объект = Неопределено;
    КонецПопытки;

КонецПроцедуры

Файлы обработки:

-