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

27.03.10

Интеграция - Внешние источники данных

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
ОБработка - образец
.epf 8,59Kb
168 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

Для отображения закладок включите эту опцию в настройках вашего 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();
       
Объект = Неопределено;
    КонецПопытки;

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    30444    42    49    

46

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

122000 руб.

19.08.2020    29116    27    3    

28

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (Базовая, ПРОФ, КОРП, ФРЕШ (тонкий клиент)).

17080 руб.

19.12.2016    53468    120    107    

83

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

05.10.2022    13061    14    8    

16

Внешние источники данных Программист Бизнес-аналитик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Обработка для выгрузки данных из подготовленных СКД в фоновом режиме в базу ClickHouseDB, PostgreSQL, MySQL, в шину данных с поддержкой REST API (CSV, JSON. SQL), в локальные файлы (CSV, JSON, XLS, XLSX) или в Google Sheets. Это дополнительная подключаемая обработка.

18000 руб.

21.08.2024    8252    21    4    

18

Внешние источники данных Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Платные (руб)

Быстро и легко. Выгрузка всех элементов и групп номенклатуры (с их иерархией), кроме помеченных на удаление. Без использования COM-объектов.

4880 руб.

16.08.2023    3732    7    8    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Valet 56 27.03.10 13:31 Сейчас в теме
Методика с закладками, по моему шустрее работает, чем с заменой.
Как недостатки, что при отсутствии закладки ошибка проявляется (возможно если один код заполняет шаблоны с разными закладками). А также если имеются одинаковые элементы (к примеру название организации), то на каждый надо свою закладку.
2. Nikola23 710 27.03.10 13:45 Сейчас в теме
Согласен с (1). Закладкой удобно размечать место где встанет картинка, список, таблица. Так - максимально быстро можно будет указать позицию для вставки. Ранее я, например, последовательно проходил весь текст, определяя начало отметки"таблица" которую в последствии удалял, а потом только вставлял требуемый объект. Для обычной вставки нескольких слов во всех смыслах проще использовать обычную замену контекста.
3. LarisaT 31.03.10 11:04 Сейчас в теме
В последнее время актуальной стала задача работы с OpenOffice. Никак не могу найти нормальную информацию по программированию ОО из 1С77. Задача такова. Есть документ ОО Writer. В нем есть таблицы. Необходимо открыть документ, определить количество таблиц в нем, занести в определенные ячейки таблицы текстовую информацию, показать документ на экране. Может кто-то может представить такой код на общее обозрение или прислать мне на lllttt@mail.ru. Можно указать ссылки на соответствующую литературу, можно на материалы в интернете.
6. Nikola23 710 11.08.10 15:18 Сейчас в теме
(3) Среди моих публикаций появилась примеры работы с Open Office...
4. andrew76 07.07.10 10:24 Сейчас в теме
Picture = Selection.InlineShapes.AddPicture("C:\Users\NKrylov\Desktop\Новый.bmp", Ложь, Истина);
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...

вопрос-обязательно переводить вставленный рисунок в фигуру?
просто после этой конвертации объект(рисунок) уходит в крайнее левое положение
на странице Word. И ещё ,не работает метод обтекания текстом.Не подскажете?
maxchaos; +1 Ответить
5. Nikola23 710 07.07.10 14:38 Сейчас в теме
"вопрос-обязательно переводить вставленный рисунок в фигуру" обязательно.
"просто после этой конвертации объект(рисунок) уходит в крайнее левое положение" - вполне вероятно достаточно выбрать другой вариант обтекания (по левому краю, например).
"И ещё ,не работает метод обтекания текстом" - добиться такого эффекта не удалось. Проверьте правильность кода, напишите макрос на VBA, а затем перепишите на языке 1с
Вот список доступных видов обтекания (константы) и соответствующие этим видам значения:
wdWrapBehind = 5;
wdWrapFront = 3;
wdWrapInline = 7;
wdWrapNone = 3; // это не опечатка. Так написано в браузере объектов VBA
wdWrapSquare = 0;
wdWrapThrough = 2;
wdWrapTight = 1;
wdWrapTopBottom = 4;
maxchaos; +1 Ответить
7. Armando 1402 14.02.11 18:03 Сейчас в теме
Shape = Picture.ConvertToShape();

Почему при использовании метода ConvertToShape() может появляться ошибка 0x80004005 :?:
На одной машине работает, на другой - нет :(
Office 2007

Причем на проблемной машине на VBA эта конструкция работает
11. Nikola23 710 19.10.11 20:50 Сейчас в теме
(7) Armando, ответ можно найти в комменте (10)

(10) alexeyburtsev, ваш код отличается. Вполне возможно, что и методы к объектам надо применять другие.
8. cool.vlad4 2 14.02.11 18:26 Сейчас в теме
Для замены и поиска лучше чем способ регэксами мне кажется нет. А вот закладки пожалуй оригинально. Для картинок как раз самое то, наверное.
9. MECUBO 18.02.11 10:01 Сейчас в теме
Доброго времени суток. Пришел с целью поиска помощи!
Я делаю программу которая должна редактировать шаблон ворда.
С начала я пытался сделать всё через WordApplication но добился только открытия нового документа и вставки текста.
Ета версия мне не подошла так как мне нужно открыть шаблон! Через некоторое время у меня получилось открыть шаблон через Ole но при любой попытке добавления текста показывает ошибки.
Вот мой скрипт (прошу не обращать внимания на мусор в скрипте так как я занимаюсь программированием совсем не давно).
//---------------------------------------------------------------------------

#include <vcl.h>
#include "Unit1.h"
#include <ComObj.hpp>
#include <utilcls.h>
#include "Unit2.h"
#include <utilcls.h>
#include <word_2K.h>
#include <shellapi.h>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Word_2K_SRVR"
#pragma resource "*.dfm"
TForm1 *Form1;
Variant  vVarApp,vVarDocs,vVarDoc,vVarTable,vVarParagraph;
//---------------------------------------------------------------------------
//void __fastcall TForm1::FormCreate(TObject *Sender)
//{
//SplashForm=new TSplashForm(this);
//SplashForm->ShowModal();
//SplashForm->Free();
//}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::N1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{

TWordApplication
  *WordApplication=0;

TWordDocument
  *WordDocument=0;

AnsiString
  Mess="",
  tmpAnsiString;

float
  FontSize=8;

OleVariant
  Start;

vVarApp = CreateOleObject("Word.Application");
vVarApp.OlePropertySet("Visible",true);
vVarDocs = vVarApp.OlePropertyGet("Documents");
vVarDoc = vVarDocs.OleFunction("Open","I:\\Borland\\CBuilder6\\Projects\\KM-1.DOC");
vVarDoc.OleProcedure("Activate");

//str=RichEdit1->Text;
//vVarParagraph.OlePropertySet("Text",str);

//TVariant ovWhat = wdGoToBookmark;
//TVariant Bookmark = "asdf";
//tmpAnsiString= Bookmark;
//WordApplication->Selection->GoTo(&ovWhat, EmptyParam, EmptyParam, &Bookmark);
//WordApplication->Selection->TypeText(WideString("Èâàíîâ"));

//tmpAnsiString=RichEdit1->Text;
//WordApplication->Selection->Font->Size=7;
//WordDocument->Range(EmptyParam,EmptyParam)->InsertAfter(StringToOleStr(tmpAnsiString));

//tmpAnsiString=ComboBox1->Text;
//WordDocument->Range(EmptyParam,EmptyParam)->InsertAfter(StringToOleStr(tmpAnsiString));

}
//---------------------------------------------------------------------------
Показать

если не затруднит подскажите варианты добавления текста из полей RichEdit и Label по средствам заминения закладок.
10. alexeyburtsev 44 19.10.11 19:28 Сейчас в теме
Большое спасибо за науку, как раз изготавливаю коммерческое предложение.
Обнаружил такое явление.

Bm1=Док.Bookmarks(Букмарка).range;
NewPicture=Bm1.InlineShapes.AddPicture(ФайлФото);
...
NewPicture.ConvertToShape();

Работает, если я переключаюсь в окно Word листаю страницы, наблюдая работу "макроса". Если я этого не делаю - выдается сообщение об ошибке ConvertToShape().

Вылечилось после добавления строки

Док.Bookmarks(Букмарка).range.Select();
12. skunk 02.04.14 14:06 Сейчас в теме
13. kentavr27 97 04.08.15 22:44 Сейчас в теме
(0) Быть может Вы подскажите...
Из 1С-ки создаю документ Word, в таком виде
Синоним переменной: ИмяПеременной
, где "синоним..." это простой текст, а ИмяПеременной -- это есть закладка. Никак не могу совладать, что бы закладкой являлось ИмяПеременной полностью (это как в Word-е выделить слово и выбрать "Вставить закладку"). Мой текст
Selection.TypeText("ИмяПеременной");
//дальше пытаюсь выделить напечатанное слово
Selection.MoveLeft(2, 1);
Закладки=Word.ActiveDocument.Bookmarks();
Закладка=Закладки.Add("ИмяПеременной",Selection.Range());
Selection.TypeParagraph();

Закладка при таких действиях вставляется перед словом "ИмяПеременной" ([]ИмяПеременной) а нужно в виде [ИмяПеременной]
Подскажите пож. как получить желаемый результат
14. Nikola23 710 11.08.15 23:01 Сейчас в теме
(13) kentavr27,
Что бы понять, какой код необходимо добавить для решения Вашей задачи, запишите макрос и откройте его в редакторе VBA. Все что написано выше, я получил именно этим способом.
15. vovan_victory 65 31.08.15 21:33 Сейчас в теме
Nikola23, ни как не пойму, если в файле несколько страниц,то как вставить картинку на каждую страницу?
Разобрался. Вопрос снят.
16. Ti_Gor1 01.10.17 20:54 Сейчас в теме
(15) подскажи как вставить картинку на каждую страницу.
Добавляю 3 страницы и 3 фото, они все на 3 странице оказываются...
17. PopovaNat 28.06.18 11:51 Сейчас в теме
Спасибо за статью, особенно за текст модуля!
Для отправки сообщения требуется регистрация/авторизация