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

27.03.10

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

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

Скачать файлы

Наименование Файл Версия Размер
ОБработка - образец
.epf 8,59Kb
167
.epf 8,59Kb 167 Скачать

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

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

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

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

См. также

Перенос данных из Парус 8 в ЗГУ 3

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

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

84000 руб.

19.08.2020    22447    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

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

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

60000 руб.

05.10.2022    9208    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

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

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

24000 руб.

24.04.2017    48700    97    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81562    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

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

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

24000 руб.

16.11.2018    30000    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19126    52    50    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Valet 56 27.03.10 13:31 Сейчас в теме
Методика с закладками, по моему шустрее работает, чем с заменой.
Как недостатки, что при отсутствии закладки ошибка проявляется (возможно если один код заполняет шаблоны с разными закладками). А также если имеются одинаковые элементы (к примеру название организации), то на каждый надо свою закладку.
2. Nikola23 696 27.03.10 13:45 Сейчас в теме
Согласен с (1). Закладкой удобно размечать место где встанет картинка, список, таблица. Так - максимально быстро можно будет указать позицию для вставки. Ранее я, например, последовательно проходил весь текст, определяя начало отметки"таблица" которую в последствии удалял, а потом только вставлял требуемый объект. Для обычной вставки нескольких слов во всех смыслах проще использовать обычную замену контекста.
3. LarisaT 31.03.10 11:04 Сейчас в теме
В последнее время актуальной стала задача работы с OpenOffice. Никак не могу найти нормальную информацию по программированию ОО из 1С77. Задача такова. Есть документ ОО Writer. В нем есть таблицы. Необходимо открыть документ, определить количество таблиц в нем, занести в определенные ячейки таблицы текстовую информацию, показать документ на экране. Может кто-то может представить такой код на общее обозрение или прислать мне на lllttt@mail.ru. Можно указать ссылки на соответствующую литературу, можно на материалы в интернете.
6. Nikola23 696 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 696 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 1399 14.02.11 18:03 Сейчас в теме
Shape = Picture.ConvertToShape();

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

Причем на проблемной машине на VBA эта конструкция работает
11. Nikola23 696 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 696 11.08.15 23:01 Сейчас в теме
(13) kentavr27,
Что бы понять, какой код необходимо добавить для решения Вашей задачи, запишите макрос и откройте его в редакторе VBA. Все что написано выше, я получил именно этим способом.
15. vovan_victory 63 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 Сейчас в теме
Спасибо за статью, особенно за текст модуля!
Оставьте свое сообщение