Форум программистов, компьютерный форум, киберфорум
C++: COM, OLE, ActiveX
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
Программист по неволе
24 / 24 / 8
Регистрация: 22.04.2015
Сообщений: 476
Записей в блоге: 1
1

Внести текст в ячейку таблицы Word

01.10.2018, 14:22. Просмотров 2698. Ответов 17
Метки нет (Все метки)

Доброго времени суток.
Помогите решить следующую задачку.
Имеется файл .docx с таблицей.
Я его открываю, и пытаюсь внести текст в ячейку [1,1].
Но что я делаю неправильно? Ибо при выполнении строки vVarTable=vVarDoc.OlePropertyGet("Tables[1]"); возникает исключение EOLESystem Error 'Неизвестное имя'
C++
1
2
3
4
5
6
7
8
9
10
     vVarApp = CreateOleObject("Word.Application");
     vVarApp.OlePropertySet("Visible",true);
     vVarDocs=vVarApp.OlePropertyGet("Documents");
     vVarDocs.OleProcedure("Open", path.c_str(),false,0);
     vVarDoc=vVarDocs.OleFunction("Item",1);
     vVarDoc.OleProcedure("Activate");
 
     String text = "CONTROLL";
     vVarTable=vVarDoc.OlePropertyGet("Tables[1]");
     vVarTable.OlePropertyGet("Cell", 1,1).OlePropertyGet("Range").OlePropertyGet("Text")=text.c_str();
Подскажите, как получить доступ к таблицам, если они уже были созданы ранее в тексте.
Заранее благодарю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2018, 14:22
Ответы с готовыми решениями:

Можно ли заранее вручную внести текст в ячейку StringGrid?
есть два вопроса!!! создаю таблицу в StringGrid, и у меня должны быть введены несколько текстов в...

Как сложить текст из других ячеек в вычисляемую ячейку чтобы был виден текст а не значение ссылок на другие таблицы
С новым годом господа :-) Прошу немного сориентировать в решении нужной мне задачи. Собсно...

Вставить таблицу в ячейку таблицы word
собственно вопрос как это сделать?))))

Решения с переносом в соседнюю ячейку таблицы word
У меня есть шаблон документа, который заполняется с помощью скрипта, но появился проблема, с...

17
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30771 / 20102 / 7853
Регистрация: 22.10.2011
Сообщений: 34,927
Записей в блоге: 6
01.10.2018, 15:19 2
Как минимум нужно:
C++
1
vVarTable = vVarDoc.OlePropertyGet("Tables").OleFunction("Item", 1);
1
Программист по неволе
24 / 24 / 8
Регистрация: 22.04.2015
Сообщений: 476
Записей в блоге: 1
02.10.2018, 08:01  [ТС] 3
Цитата Сообщение от volvo Посмотреть сообщение
vVarTable = vVarDoc.OlePropertyGet("Tables").OleFunction("Item", 1);
Да, а затем еще я добавил:
C++
1
2
3
vVarCell = vVarTable.OleFunction("Cell", 1, 1);
RangeCell = vVarCell.OlePropertyGet("Range");
RangeCell.OlePropertySet("Text", text.c_str());
и получил, что хотел.
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
09.02.2020, 12:44 4
А какие библиотеки надо подключить, чтобы заработало CreateOleObject?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30771 / 20102 / 7853
Регистрация: 22.10.2011
Сообщений: 34,927
Записей в блоге: 6
09.02.2020, 12:57 5
Цитата Сообщение от archerix Посмотреть сообщение
чтобы заработало CreateOleObject
, надо подключить файл ComObj.hpp. В Билдере, разумеется, этот код как раз для него и написан.
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
09.02.2020, 13:51 6
Спасибо. Перед кодом написано просто "С++", я подумал, что это как-то можно выкружить и в обычном С++.

Я с таким по Дельфи знаком, и мне интересно понять, возможно ли так же делать из обычного С++. То, что в Билдере оно есть, я знаю. Хотя по-моему, там это все как-то не так наглядно, как в Дельфи.
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
10.02.2020, 00:01 7
ComObj подключил, все равно неясно - а какого типа должно быть это vVar? Мне казалось, Variant или OleVariant, но компилятор их не понимает.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30771 / 20102 / 7853
Регистрация: 22.10.2011
Сообщений: 34,927
Записей в блоге: 6
10.02.2020, 15:59 8
Это Variant-ы, и компилятор от borland-а их прекрасно понимает, ибо описан этот тип в модуле System, который подключается к любому проекту по умолчанию.
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
11.02.2020, 03:25 9
Ага, заработало, что-то сразу я напутал, видимо.

А вот такой вопрос - в примере открывается готовый документ. А как создать новый?

И еще - а как обозначается параметр - "пустышка" для методов документа и приложения?

Добавлено через 44 минуты
С первым вопросом разобрался.
C++
1
2
vVarDocs = vVarApp.OlePropertyGet("Documents");
vVarDocs.OleProcedure("Add");
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
11.02.2020, 11:12 10
Чего-то никак не удается просто добавить текст в Ворд, все время ругается на ошибки с типами

Пробовал так:
C++
1
2
vVarApp.OlePropertyGet("ActiveDocument").OlePropertyGet("Content")
                     .OleProcedure("InsertAfter",vtexty);
Или так, по-хитрому:
C++
1
2
3
4
vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
vVarParagraph=vVarParagraphs.OleFunction("Item",1);
vVarParagraph.OlePropertyGet("Range").
             OlePropertySet("Text","123");
Пока получилось только передавать по одному символу типа Char, при этом в документе возникает его номер, а не он сам
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30771 / 20102 / 7853
Регистрация: 22.10.2011
Сообщений: 34,927
Записей в блоге: 6
11.02.2020, 12:30 11
C++
1
2
vVarApp.OlePropertyGet("ActiveDocument").OlePropertyGet("Content")
                     .OleProcedure("InsertAfter", WideString(vtexty));
- никогда проблем не было...
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
11.02.2020, 13:59 12
Ну а у меня вот так вот

C++
1
2
3
4
5
6
stexty="123";
vtexty="Hello, World";
ctexty='a';
 
vVarApp.OlePropertyGet("ActiveDocument").OlePropertyGet("Content")
                     .OleProcedure("InsertAfter",vtexty);
Пробую подставлять их по очереди, переменные имеют тип строковый, вариант и чар соответственно. Работает только чар, и то странно - вместо буквы передается ее код. Остальные выкидывают сообщение об ошибке типов.

Добавлено через 9 минут
Попробовал передать вот так, нашел в интернете вроде бы работающий пример
C++
1
stexty.c_str()
Передался первый символ, после чего программа упала. У меня Билдер какой-то неправильный что ли?

Добавлено через 57 минут
А кто-то пробовал пользовать Ворд путем подключения библиотеки MSWORD.OLB? Я правда, пока не могу вникнуть как ее подключить. Примеры кода выглядят как-то более удобно и привычно, чем тут.
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
12.02.2020, 13:48 13
И открыть существующий файл тоже не выходит. Тут stexty - строка.

C++
1
2
3
4
   stexty = "D:\testB.docx";
   wrd = CreateOleObject("Word.Application");
   wrd.OlePropertySet("Visible",true);
   wrd.OlePropertyGet("Documents").OleProcedure("Open", stexty.c_str());
Вылетает сообщение, что файл не найден, а в скобочках приписка - 'D:\%09est'. Что бы это значило?

Добавлено через 6 минут
Такое чувство, что строка с названием файла передается не полностью, часть символов в конце отбрасывается.
0
Модератор
Эксперт CЭксперт С++
4194 / 3727 / 672
Регистрация: 07.10.2015
Сообщений: 7,634
12.02.2020, 13:52 14
Цитата Сообщение от archerix Посмотреть сообщение
"D:\testB.docx"
C++
1
"D:\\testB.docx"
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
12.02.2020, 13:58 15
Так изначально было написано - тогда вылетала ошибка "Неверное имя каталога". Собственно, потому и попробовал с одной чертой для опыту Весь мозг сломал уже, не знаю, что еще попробовать.

Название, расширение и само наличие файла десять раз перепроверено. Пробовал эту строку из переменой забивать в консоль - запускается.
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
13.02.2020, 03:24 16
Вроде удалось угадать - надо передавать текст как WideString. Интересно это только у меня так оригинально?
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
13.02.2020, 12:56 17
Можно тут спросить - а как таким образом выполнять поиск и замену в Ворде? Или лучше создать новую тему? В найденных в тырнете статьях не увидел такого
0
0 / 0 / 0
Регистрация: 08.02.2020
Сообщений: 131
14.02.2020, 01:36 18
Ну ладно, сам делюсь результатами изысканий в тырнетах и опытов Функция "заменить все", насколько понимаю. У меня работает.

C++
1
2
vVarApp.OlePropertyGet("Selection").OlePropertyGet("Find").OleProcedure("Execute", WideString("World"),
                               false, false, false, false, false, true, 1, false, WideString("Planet"), 2);
И есть такая расшифровка параметров:

OleProcedure ("Execute",
s1/*Текст, который будем менять*/,
false/*учитывать регистрe*/,
false/*Только полное слово*/,
false/*Учитывать универсальные символы*/,
false/*Флажок Произносится как*/,
false/*Флажок Все словоформы*/,
true/*искать вперед*/,
1/*Активация кнопки Найти далее*/,
false/* Задание формата */,
s2/*На что заменить*/,
2/*Заменить все*/);

Добавлено через 58 минут
А кто знает, как выделить определенный фрагмент текста, с такого-то символа по такой-то?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2020, 01:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вставить дату в ячейку таблицы в Word 2013
Подскажите, пож, как в Microsoft Word 2013 в одну из ячеек готовой таблицы вставить возможность...

Как изменить размер изображения, вставленного в ячейку таблицы MS Word?
Формирую таблицу с картинками в MS Word из 1С по технологии COM. Столкнулся с тем, что картинка...

Опустить кнопку и текст в ячейку таблицы
Она оранжевого цвета в верхнем правом углу.Ее нужно опустить на шапку шайта.Делал верстку блочно...

Как в ячейку таблицы вписать текст
function test() { document.getElementById("td3").innertext = "F-11"; } <table>...

Как в ячейку таблицы вписать текст
Тут возникла такая необходимость: есть ссылка и есть ячейка таблицы. Как сделать так, что бы при...

В ячейку таблицы вставить текст из файла txt
Есть таблица (<table>) через js обращаюсь к отдельной ячейке ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.