Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;
Doc = Объект.Application.Documents(1);
Doc.Activate();
// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.Selection;
// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
Text.TypeText(Символы.ВК);
Text.ParagraphFormat.Alignment = 4; //3 — по ширине, 1- лево 2 право 4 растянуть
Text.TypeText(Строка(Тема));
А что сделать что бы было по центру
Text.ParagraphFormat.Alignment = ????;
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
1 |
||||
1C 8.x 25.06.2019, 11:26. Показов 9089. Ответов 17 Метки нет (Все метки)
Добрый день!
0 |
198 / 158 / 45 Регистрация: 23.08.2014 Сообщений: 807 |
|
25.06.2019, 12:42 |
2 |
Процедура клиент, сервер ?
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
25.06.2019, 14:39 [ТС] |
3 |
1. Процедура сервер
0 |
198 / 158 / 45 Регистрация: 23.08.2014 Сообщений: 807 |
|
25.06.2019, 16:17 |
4 |
Нельзя сохранять фалы на сервере, нужно перенести на клиент.
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
25.06.2019, 16:18 [ТС] |
5 |
можешь показать
0 |
198 / 158 / 45 Регистрация: 23.08.2014 Сообщений: 807 |
|
25.06.2019, 16:24 |
6 |
Ermak27, полностью процедуру всю переноси на клиент. А данные для заполнения вытаскивай через функции на сервере несли понадобится. Перед процедурой у тебя написано &НаСервере, меняй это на &НаКлиенте. Повалятся ошибки, такие как обращение к константе например и начинай их исправлять потихоньку.
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
25.06.2019, 16:44 [ТС] |
7 |
Я тебя не так понял на счёт сервера. У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте. У меня база крутиться на sql сервере
0 |
198 / 158 / 45 Регистрация: 23.08.2014 Сообщений: 807 |
|
25.06.2019, 16:52 |
8 |
Ermak27, хорошо. Напиши тогда где находится процедура. В модуле формы или модуле объекта ?
0 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
25.06.2019, 17:06 [ТС] |
9 |
|||
Модуле формы. Процедура срабатывает при нажатии кнопки
0 |
198 / 158 / 45 Регистрация: 23.08.2014 Сообщений: 807 |
|
25.06.2019, 18:16 |
10 |
Попробуй так прописать Докум.Documents.SaveAs(ИмяФайла);
0 |
1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,215 Записей в блоге: 1 |
|
25.06.2019, 22:48 |
11 |
У меня вообщем ничего не стоит перед процедурой. Нет &НаСервере и &НаКлиенте. ну не стоит и не стоит. где процедура выполняется, когда не стоит? в воздухе? вряд ли.
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
26.06.2019, 08:40 [ТС] |
12 |
dggrom, выдаёт ошибку Поле объекта не обнаружено (Documents) Добавлено через 2 минуты
0 |
198 / 158 / 45 Регистрация: 23.08.2014 Сообщений: 807 |
|
26.06.2019, 10:02 |
13 |
Yulunga, у него метод записи самой не видет. Ermak27, что за конфигурация, какие формы, управляемые или нет ?
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
26.06.2019, 10:05 [ТС] |
14 |
dggrom, Не управляемые, Обычное приложение
0 |
1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,215 Записей в блоге: 1 |
|
26.06.2019, 13:01 |
15 |
по мне так проблема в этом: запутал с какой-то целью. поэтому и нет там сейвас, что применяется не к тому к чему надо. чехарда. имена переменных закончились?
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
26.06.2019, 13:51 [ТС] |
16 |
Yulunga, я закомментировал Word=Докум;, теперь выдаёт ошибку Метод объекта не обнаружен (Range)
0 |
Yulunga 1155 / 702 / 203 Регистрация: 22.04.2013 Сообщений: 5,215 Записей в блоге: 1 |
||||
26.06.2019, 17:47 |
17 |
|||
ну вот чем не код для рыбы. сейвас должен быть для активного документа
0 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
27.06.2019, 11:22 [ТС] |
18 |
|||
Yulunga, как мне мой код поправить? Код который в самом начале, он так и выводит как надо, но встала задача сохранить эти вордовские документы по индексу, вот тут проблема и появилась у меня. Вчера я переделал немного код
Можете подсказать как мне сделать чтобы два значения выводила. Миниатюры
0 |
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
// "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
// "Ссылка" - ДокументСсылка (в моем случае - счет).
Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект(ПутьКФайлу);
// Покажем документ. Для красоты.
Объект.Application.Visible = 1;
Word = Объект.Application;
Doc = Объект.Application.Documents(1);
Doc.Activate();
// Готовим переменную в которой будет содержимое нашего документа
// (текст, таблицы и проч).
Text = Word.S_election;
// Очистим документ
// Ctrl-A
Text.WholeStory();
// Del
Text.Delete(1, 1);
// Двигаемся на 3 строки ниже. Документ пустой, поэтому добавляем
// строки "Переводами коретки"
Text.TypeText(Символы.ВК);
Text.TypeText(Символы.ВК);
Text.TypeParagraph(); // другой вариант того же действия
// Выводим текст.
Text.TypeText("Обычный текст, набранный первую очередь");
// Курсор в конце строки
// Эмулируем нажатие Shift+Home - выделяем строку
Text.HomeKey(, 1);
// Форматирование выделенной строки
Text.Font.Bold = 9999998;
Text.Font.Size = 14;
Text.Font.Name = "Verdana";
// Сдвигаем курсор. Сдвинуть курсор по строкам возможно, только,
// если эти строки уже содержат текст, иначе ничего не произойдет.
Text.MoveUp(,2); // вверх на 2 строки
//Word.S_election.MoveDown(,числострок); // вниз
//Word.S_election.MoveLeft(,числострок); // влево
//Word.S_election.MoveRight(,числострок);// вправо
// Добавление текста. Текст выводится начиная с текщей позиции
// курсора.
Text.HomeKey(, 1);
Text.TypeText("Обычный текст, набранный во вторую очередь");
Text.MoveDown(,1); // вниз на 2 строки
Text.EndKey(); // в конец строки
Text.TypeParagraph(); // и в начало следующей строки
// Очищаем форматирование
Text.ClearFormatting();
// Добавляем таблицу.
// Получаем текущую позицию курсора
Position = Text.Range();
// Параметры: Позиция, число строк, число колонок,
// последние 2 параметра отвечают за автоподбор высоты и отображение
// границ таблицы
Table = Doc.Tables.Add(Position, 1, 6, 1, 2);
// Устанавливаем ширину колонок
Table.Columns(1).PreferredWidth=10;
Table.Columns(2).PreferredWidth=50;
Table.Columns(3).PreferredWidth=10;
Table.Columns(4).PreferredWidth=10;
Table.Columns(5).PreferredWidth=10;
Table.Columns(6).PreferredWidth=10;
// Задаем заголовки колонок
Row1=Table.Rows(1);
Row1.Cells(1).Range.Text="№ п/п";
Row1.Cells(2).Range.Text="Наименование";
Row1.Cells(4).Range.Text="Кол-во";
Row1.Cells(3).Range.Text="Ед. изм.";
Row1.Cells(5).Range.Text="Цена,руб.";
Row1.Cells(6).Range.Text="Сумма,руб.";
// Построчно выводим содержимое таблицы Товары
НомерСтроки = 1;
Для каждого СтрокаТовары Из Ссылка.Товары Цикл
Row=Table.Rows.Add();
Row.Cells(1).Range.Text=НомерСтроки;
// Выравнивание по левому краю
Row.Cells(1).Range.ParagraphFormat.Alignment = 1;
// В качестве текста можно передать только значение "простого" формата
// все агрегатные объекты, переданные как текст, что нормально для платформы 1с
// вызовут исключение.
Row.Cells(2).Range.Text=СтрокаТовары.Номенклатура.Наименование
+?(ЗначениеЗаполнено(СтрокаТовары.ХарактеристикаНоменклатуры),
" ("+СтрокаТовары.ХарактеристикаНоменклатуры+")","");
Row.Cells(4).Range.Text=Строка(СтрокаТовары.Количество);
Row.Cells(4).Range.ParagraphFormat.Alignment = 1;
Row.Cells(3).Range.Text=?(ЗначениеЗаполнено(СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения)
,СтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения.Наименование,"-");
Row.Cells(3).Range.ParagraphFormat.Alignment = 1;
Row.Cells(5).Range.Text=Формат(СтрокаТовары.Цена,"ЧДЦ=2");
Row.Cells(5).Range.ParagraphFormat.Alignment = 1;
Row.Cells(6).Range.Text=Формат(СтрокаТовары.Сумма,"ЧДЦ=2");
Row.Cells(6).Range.ParagraphFormat.Alignment = 1;
НомерСтроки=НомерСтроки+1;
КонецЦикла;
// Задаем форматирование первой строки
// Если сделать это сразу, то все новые строки таблицы будут
// формироваться с тем же форматом
Row1.Range.Font.Bold = 9999998;
Row1.Range.Font.Size = 14;
Row1.Range.Font.Name = "Verdana";
Row1.Range.ParagraphFormat.Alignment = 1;
// Последняя строка...
Row = Table.Rows.Add();
Row.Range.Font.Bold = 9999998;
Row.Cells(1).Range.Text="Итого:";
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
Попытка // эта конструкция выдает исключительную ситуацию, но при этом
// результат все-равно работает))
// объединяем ячейки в конце таблицы
Table.cell(НомерСтроки+1, 1).Merge(Table.cell(НомерСтроки+1, 5));
Исключение
КонецПопытки;
Попытка
Row.Cells(1).Range.ParagraphFormat.Alignment = 3;
Row.Cells(2).Range.Text=Формат(Ссылка.Товары.Итог("Сумма"), "ЧДЦ=2");
Row.Cells(2).Range.ParagraphFormat.Alignment = 1;
Doc.Save();
Объект.Application.Quit();
Объект = Неопределено;
Исключение
Doc.Save();
Сообщить(ОписаниеОшибки());
Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
Часто при создании документа из макета используют метод замены кусков текста. В примере представлен другой вариант выполнения того же действия — с использованием закладок. Также представлен пример построения нумерованного списка, вставки картинки, настройки ее параметров.
Пример использования описанных возможностей прост. При формировании коммерческого предложения бывает необходимо описать список условий, добавить изображение образца продукции.
Для отображения закладок включите эту опцию в настройках вашего Word’а.
В моем примере я заранее создал новый пустой документ, путь к документу и картинке прописан в тексте. Не забудте указать свои пути.
Процедура ВыполнитьОбработку() Экспорт
Попытка
//Объект = ПолучитьCOMОбъект(ПутьКФайлу);
Объект = ПолучитьCOMОбъект("C:UsersNKrylovDesktopТест.docx");
// Покажем документ.
Объект.Application.Visible = 1;
Word = Объект.Application;
ThisDocument = Word.Documents(1);
ThisDocument.Activate();
// Отключим проверку грамматики и вывод информации о грамматических ошибках.
ThisDocument.GrammarChecked=0;
ThisDocument.ShowGrammaticalErrors=0;
// Готовим переменную в которой будет содержимое документа (текст).
S_election = Word.S_election;
// Очистим документ
// Ctrl-A
S_election.WholeStory();
// Del
S_election.Delete(1, 1);
// Уменьшим междустрочный интервал.
S_election.ParagraphFormat.LineSpacingRule = 0; // 1 по умолчанию
S_election.ParagraphFormat.SpaceAfter = 0; // 10 по умолчанию
// Разметим документ. Это можно сделать и предварительно в макете
ThisDocument.Bookmarks.Add("Закладка1", S_election.Range());
S_election.TypeParagraph();
S_election.TypeText("34r3 ");
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка3", S_election.Range());
S_election.TypeParagraph();
ThisDocument.Bookmarks.Add("Закладка4", S_election.Range());
S_election.EndKey();
// Так можно работать с текстом только в конкреной области документа - это и будет замена метода Find-Execute.
ThisDocument.Bookmarks("Закладка3").Range.S_elect();
S_election = Word.S_election;
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
S_election.MoveDown(, 1);
S_election.Delete(1, 1);
// Этот текст будет выведен не с последней позиции курсора, а в активной области.
// в данном случае - в области закладки 2
ThisDocument.Bookmarks("Закладка2").Range.S_elect();
S_election = Word.S_election;
Text = S_election.Range.Text;
S_election.TypeText(Text + " sdcsdcs");
// При выводе текста закладка "сбросилась". Восстановим.
// "Победить" эту проблему я так и не смог((
// Хотя на практике, закладка больше и не понадобится.
// Дважды выводить текст в одну и ту же область - не имеет смысла.
S_election.HomeKey(, 1);
ThisDocument.Bookmarks.Add("Закладка2", S_election.Range());
S_election.EndKey();
// В области закладки 4 сформируем нумерованный список
ThisDocument.Bookmarks("Закладка4").Range.S_elect();
S_election = Word.S_election; // активная (выделенная) область будет начинаться
// от закладки 4)
// Добавим текст "для опытов"
// 1
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 2
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 3
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// 4
S_election.TypeText("sdcsdcsdcsdc");
S_election.TypeParagraph();
// Выделяем введенный текст
S_election.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; // можно указать форматирование текста списка
// Применим шаблон к выделенному тексту
S_election.Range.ListFormat.ApplyListTemplateWithLevel( Word.ListGalleries(2).ListTemplates(1));
// Перейдем в конец текста
S_election.EndKey(6);
// Добавим картинку
// Параметры: путь к файлу, создавать ссылку на картинку, сохранять с файлом
Picture = S_election.InlineShapes.AddPicture("C:UsersNKrylovDesktopНовый.bmp", Ложь, Истина);
// Зададим размер
Picture.Height = 100;
Picture.Width = 150;
// Чтобы установить обтекание текста, конвертируем рисунок в фигуру
Shape = Picture.ConvertToShape();
Shape.WrapFormat.Type = 0; // по контуру...
ThisDocument.Save();
//Объект.Application.Quit();
Объект = Неопределено;
Исключение
ThisDocument.Save();
Сообщить(ОписаниеОшибки());
//Объект.Application.Quit();
Объект = Неопределено;
КонецПопытки;
КонецПроцедуры
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Selection.EndKey method (Word) |
vbawd10.chm158663161 |
vbawd10.chm158663161 |
word |
Word.Selection.EndKey |
4f27681c-1117-99c2-1aba-bd97082bb8ba |
06/08/2017 |
medium |
Selection.EndKey method (Word)
Moves or extends the selection to the end of the specified unit.
Syntax
expression. EndKey
( _Unit_
, _Extend_
)
expression Required. A variable that represents a Selection object.
Parameters
Name | Required/Optional | Data type | Description |
---|---|---|---|
Unit | Optional | Variant | The unit by which the selection is to be moved or extended. Can be a WdUnits constant. The default value is wdLine. |
Extend | Optional | Variant | Specifies the way the selection is moved. Can be any WdMovementType constant. If the value of this argument is wdMove, the selection is collapsed to an insertion point and moved to the end of the specified unit. If it is wdExtend, the end of the selection is extended to the end of the specified unit. The default value is wdMove. |
Remarks
This method returns an integer that indicates the number of characters the selection or active end was actually moved, or it returns 0 (zero) if the move was unsuccessful. This method corresponds to functionality of the END key.
Example
This example moves the selection to the end of the current line and assigns the number of characters moved to the pos variable.
pos = Selection.EndKey(Unit:=wdLine, Extend:=wdMove)
This example moves the selection to the beginning of the current table column and then extends the selection to the end of the column.
If Selection.Information(wdWithInTable) = True Then Selection.HomeKey Unit:=wdColumn, Extend:=wdMove Selection.EndKey Unit:=wdColumn, Extend:=wdExtend End If
This example moves the selection to the end of the current story. If the selection is in the main text story, the example moves the selection to the end of the document.
Selection.EndKey Unit:=wdStory, Extend:=wdMove
See also
- Selection object
[!includeSupport and feedback]
Word без компонентов
, добавление нескольких таблиц
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Поискал по форуму — подымался этот вопрос ни раз, но ответа так и не было.
#include <ComObj.hpp> Variant Word, Doc, Table,Tables, Cell, Range; Word = CreateOleObject(«Word.Application.8»); Word.OlePropertySet(«Visible»,(Variant)true); Doc = Word.OlePropertyGet(«Documents»); Doc.OleProcedure(«Add»); Doc = Word.OlePropertyGet(«Documents»).OleFunction(«Item», 1); Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row); Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row); Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row); Простенькое создание нескольких таблиц. Проблема в том что каждая последущая таблица рисуется в первой ячейке предыдещей таблицы Я решил эту проблему воспользовавшись компонентом TWordApplication, там после каждого создания таблицы выполнял :
OleVariant L=wdStory; WordApplication1->Selection->EndKey(L,EmptyParam); Так с компонентами тоже не всё в порядке — не хочет запускаться на лругих ПК |
Adil |
|
Дима, эти вопросы поднимались уже не раз. В ворде записываешь макрос и переводишь с бейсика на ole |
Дима |
|
Цитата записываешь макрос и переводишь с бейсика на ole
Читал об этом только конечных решений этого не видел.
Sub End() Selection.EndKey Unit:=wdStory End Sub
В переводе на OLE — это переход в конец документа.
Word.OlePropertyGet(«Selection»).OleFunction(«EndKey»,wdStory,EmptyParam); Ставил его перед и после каждого создания таблицы — НИЧЕГО не получилось. Как правильно сделать подскажаите, пожалуйста? Сообщение отредактировано: Дима — 05.11.07, 12:09 |
Bas |
|
Цитата Дима @ 05.11.07, 12:07 Откуда берут эти значения для OLE я не допёр.
Word_2K.h …. typedef enum WdUnits { wdCharacter = 1, wdWord = 2, wdSentence = 3, wdParagraph = 4, wdLine = 5, wdStory = 6, wdScreen = 7, wdSection = 8, wdColumn = 9, wdRow = 10, wdWindow = 11, wdCell = 12, wdCharacterFormatting = 13, wdParagraphFormatting = 14, wdTable = 15, wdItem = 16 } WdUnits; |
Дима |
|
Bas, а куда это вставлять? Вообще вот эта вещь :
Word.OlePropertyGet(«Selection»).OleFunction(«EndKey»,wdStory,EmptyParam); переводит курсор в конец документа. Это я таблицы как-то так криво вставляю. Видимо вот это :
Doc.OleFunction(«Range»,0,0) указывает вставлять таблицу сначала документа. Пытался делать вот такое:
Variant isRange = Doc.OleFunction(«Range»,0,0); Range = Doc.OleFunction(«Range»,isRange.OlePropertyGet(«End»),isRange.OlePropertyGet(«End»)); Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Range, Col, Row); На второй строчке вылетает ошибка (просто исключительная ситуация и окно с текстом «ошибка»). Добавлено 05.11.07, 13:32
Variant Word = CreateOleObject(«Word.Application.8»); ??? Где описано что вот так таблицу создавать :
Doc = Word.OlePropertyGet(«Documents»); Doc.OleProcedure(«Add»); Doc = Word.OlePropertyGet(«Documents»).OleFunction(«Item», 1); Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row); ??? Где можно почитать как текст вставлять, его стиль и шрифт менять? |
Adil |
|
Цитата Дима @ 05.11.07, 13:03 Где описано что вот так отрывать Word: Ну, именно это надо просто один раз запомнить. Цитата Дима @ 05.11.07, 13:03 Где описано что вот так таблицу создавать : Цитата Дима @ 05.11.07, 13:03 Где можно почитать как текст вставлять, его стиль и шрифт менять? А всё остальное — перевод макросов. К сожалению, сейчас нету под рукой экселя — попробуй записать макрос вставки своих таблиц (полностью, т.е. вставка таблицы, переход в конец в документа, вставка следующей таблицы) и приведи его здесь. |
Дима |
|
Adil, допустим даже если разбераться в Basic, то как всё-таки прикрутить эти операции к OLE в Builder?
Sub Макрос1() ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _ 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitFixed With Selection.Tables(1) If .Style <> «Сетка таблицы» Then .Style = «Сетка таблицы» End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End With Selection.EndKey Unit:=wdStory Selection.TypeParagraph ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=2, NumColumns:= _ 5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _ wdAutoFitFixed With Selection.Tables(1) If .Style <> «Сетка таблицы» Then .Style = «Сетка таблицы» End If .ApplyStyleHeadingRows = True .ApplyStyleLastRow = True .ApplyStyleFirstColumn = True .ApplyStyleLastColumn = True End With End Sub Мне надо бы в С++ написать вот этот кусочек :
Selection.EndKey Unit:=wdStory Selection.TypeParagraph |
Bas |
|
Основная трудность превода в том что ворд вставляет Selection куда не поподя. Поэтому надо явно поределять выделенную область методом Range. |
Дима |
|
Цитата попробуйте вставить тексть или как в макросе новый праграф после созданной таблицы Bas, это первое что я пробовал. Курсор нормально перемещаетсяв конец документа, а вот таблица вставляется в начало Я вставляю таблицу вот так:
Doc.OlePropertyGet(«Tables»).OleFunction(«Add», Doc.OleFunction(«Range»,0,0), Col, Row); Из сего видно что я сам принудительно пишу с начала документа — Doc.OleFunction(«Range»,0,0). Как задать этот Range так чтоб писалось в конце документа? Ещё по ходу дела вопрос — как менять размер и имя шрифта? Сообщение отредактировано: Дима — 05.11.07, 14:37 |
Bas |
|
Вот древний код, даже незнаю рабочий ли он (дааааавно это было)
void __fastcall TForm1::WordApplicationDocumentChange(TObject *Sender) { WordDocument1->ConnectTo(WordApplication1->ActiveDocument); //WordApplication1->Selection->SetRange(1,20); WordApplication1->Selection->InsertAfter(TVariant(«nПереход к документу :»+TVariant(WordApplication1->ActiveDocument->Name))); long s=WordApplication1->Selection->get_Start(); long e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant(«n произведен :»+DateTimeToStr(Now()))); s=WordApplication1->Selection->get_Start(); e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant(«n пользователь :»+TVariant(WordApplication1->Get_UserName()))); s=WordApplication1->Selection->get_Start(); e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant(«n Printer :»+TVariant(WordApplication1->Get_ActivePrinter()))); s=WordApplication1->Selection->get_Start(); e=WordApplication1->Selection->get_End(); WordApplication1->Selection->SetRange(s,e); WordApplication1->Selection->InsertAfter(TVariant(«n Path :»+TVariant(WordApplication1->Get_Path()))); } //————————————————————————— |
Дима |
|
Bas, с компонентами у меня в этом плане проблем нет, спасибо. Как без компонентов реализовать встаку таблицы в конце документа? Или что поставить в Range чтоб таблица прорисовалась в конце документа?
Добавлено 05.11.07, 15:20 Вот кому надо весь код вставки нескольких таблиц подряд. Нормально подряд:
Variant Word, Doc, Selection; Word = CreateOleObject(«Word.Application.8»); Word.OlePropertySet(«Visible»,(Variant)true); Doc = Word.OlePropertyGet(«Documents»); Doc.OleProcedure(«Add»); Doc = Word.OlePropertyGet(«Documents»).OleFunction(«Item», 1); Selection = Word.OlePropertyGet(«Selection»); //курсор в конец документа Selection.OleFunction(«EndKey»,wdStory,EmptyParam); //новый параграф Selection.OleFunction(«TypeParagraph»); Doc.OlePropertyGet(«Tables»).OleFunction(«Add»,Selection.OlePropertyGet(«Range»),Col, Row); //курсор в конец документа Selection.OleFunction(«EndKey»,wdStory,EmptyParam); //новый параграф Selection.OleFunction(«TypeParagraph»); Doc.OlePropertyGet(«Tables»).OleFunction(«Add»,Selection.OlePropertyGet(«Range»),Col, Row); // и т.д. |
Adil |
|
Ну, вот видишь как все просто оказалось. Кстати, если в басике функция не функция а процедура — т.е. ничего не возвращает, то можно использовать OleProcedure вместо OleFunction |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Borland C++ Builder/Turbo C++ Explorer
- Следующая тема
[ Script execution time: 0,0405 ] [ 16 queries used ] [ Generated: 13.04.23, 19:24 GMT ]
vadi61 Пользователь Сообщений: 236 |
#1 27.12.2015 17:39:43 Добрый день,
а как это перенести в Excel — не знаю. Один к одному не получается
стерло все содержимое… |
||||
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#2 27.12.2015 17:45:51
Как из Excel обратиться к другому приложению Особое внимание уделить разъяснению различий между ранним и поздним связыванием и применением именованных констант(в Вашем случае это wdCharacter и wdStory). Плюс обратите внимание на ГЛАВНУЮ ОШИБКУ НОВИЧКА — Ваш случай. Selection есть в Excel и в Word и без явного указания родителя будет относится к приложению, в котором записано. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
SuperCat Пользователь Сообщений: 2737 |
#3 27.12.2015 18:28:09 Просто надо использовать переменную приложения Word:
В данном случае wdStory распознается, так как я использую раннее связывание (Early Binding). Изменено: SuperCat — 27.12.2015 18:29:31 There is no knowledge that is not power |
||
vadi61 Пользователь Сообщений: 236 |
#4 27.12.2015 19:16:04 The_Prist,
и здесь перед закрытием wd1 из него надо удалить две последние строки. SuperCat, Т.е. ошибка, видимо, потому, что значения констант wdStory и wdCharacter Еxcel’ю при позднем связывании неизвестны. А как их узнать, что бы задать цифрой? Нет ошибка не в этом. Нашел значение константы wdStory здесь но все равно ошибка. Изменено: vadi61 — 27.12.2015 19:29:37 |
||
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#5 27.12.2015 19:28:21
как же Вы читали?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||||||
vadi61 Пользователь Сообщений: 236 |
#6 27.12.2015 19:36:27 The_Prist, сделал как Вы сказали. Получил значения констант wdStory = 6, wdCharacter = 1
Ошибка: Объект не поддерживает свойство или метод |
||
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#7 27.12.2015 19:43:54 Я бы вообще отказался от Selection ибо вредно это. Вполне можно вместо него использовать Range:
ну а вообще без полного кода трудно гадать. Да и примеры не помешали бы… Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
vadi61 Пользователь Сообщений: 236 |
The_Prist, та же ошибка на строке wd1.Range.EndKey 6 «Объект не поддерживает свойство или метод» |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#9 27.12.2015 19:48:48
Хочется увидеть, что именно Вы таким образом хотите удалить. Может есть другие методы — надежнее. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#10 27.12.2015 19:55:18 Например, можно два раза эту строку выполнить:
или один раз такую:
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||||
vadi61 Пользователь Сообщений: 236 |
The_Prist, изумительно. Большое спасибо. Попробовал второй вариант с одной строкой — получилось. |
vadi61 Пользователь Сообщений: 236 |
The_Prist, обнаружил ошибку. Удаляются символы не последние, а сдвинутые на количество картинок в файле. А вот дальше так: Может быть знаете как ее обойти? Изменено: vadi61 — 10.01.2016 03:49:41 |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#13 10.01.2016 06:07:42
А не мудрите ли вы? Если под пустыми строками подразумевается параграфы (всё что получается при нажатии кнопки Enter), то проще так. В примере в документе Word. Удаляет пустые параграфы (в том числе состоящие из одних пробелов). Успехов. Прикрепленные файлы
|
||
vadi61 Пользователь Сообщений: 236 |
Андрей VG,спасибо за ответ. Но это же Word! А мне нужно из Excel в вордовском файле строки удалять… У меня нет доступа к получившемуся Word-файлу. |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#15 10.01.2016 11:58:47
Это вы серьёзно — или шутка? Тогда это что?
Разве не доступ к документу Word? Чтобы использовать в моём коде этот документ достаточно заменить ThisDocument на wd1. Естественно, перенеся код в процедуре, в код книги. Успехов. |
||||
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
А я вообще не понял про картинки и символы. Может настало время реально примера с данными, а не на словах описывать проблемы? Скорее соглашусь с Андреем — здесь явно нужен иной подход. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
vadi61 Пользователь Сообщений: 236 |
The_Prist, согласен. Как только доберусь до компьютера — подготовлю пример. Пока только два слова о самОй подготовке Word-файла. Сотрудник открывает Excel-файл, выбирает нужные значения из комбобоксов, устанавливает нужные переключатели, вводит какие-то значения. На основании этих данных Excel готовит данные для вставки в отчет. Потом при нажатии кнопки СОЗДАТЬ вызывается макрос, который выбирает нужные (из заранее подготовленных) шаблонов, вставляет в них данные, а затем соединяет несколько файлов-шаблонов в один готовый отчет. К этому отчету я доступа не имею, то есть все я должен сделать в Excel-макросе. Изменено: vadi61 — 10.01.2016 14:05:41 |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
Так может имеет смысл сначала проверять наличие картинок и их кол-во? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
vadi61 Пользователь Сообщений: 236 |
The_Prist, да, все решилось такой строкой PS. Готовить файлы примеров уже нет необходимости. Изменено: vadi61 — 10.01.2016 15:06:09 |
vadi61 Пользователь Сообщений: 236 |
#20 10.01.2016 15:23:02 The_Prist, я на параллельном форуме нашел Ваш совет от октября 2014 года, где Вы используете выражение Range.End Вставил в свой код
и сработало вне зависимости от количества картинок. |
||