Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46

Как получить номер текущей страницы документа MS Word при работе через OLE

24.08.2012, 11:43. Показов 4514. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу на C++ Builder XE. Необходимо прочитать документ: найти в нем определенную таблицу и прочитать с одного из ее столбцов все значения. Значения я получаю, но так же нужно получить номер страницы, на какой расположена ячейка, с которой это значение считано. Как быть ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2012, 11:43
Ответы с готовыми решениями:

Как в VBA для Word'а определить номер текущей страницы документа?
Как в VBA для Word'а определить номер текущей страницы документа(или отследить момент образования новой страницы при заполнении документа).

Как определить номер текущей страницы документа
Всем доброго времени суток. Подскажите, как определить номер текущей страницы в документе MSWord 2003

Как определить номер текущей (просматриваемой) страницы открытого документа?
народ,как определить номер текущей (просматриваемой) страницы открытого документа ?

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
24.08.2012, 12:05
Курсор в ячейке находится? Тогда так:
C++
1
2
int page = wordApp.OlePropertyGet("Selection").
    OlePropertyGet("Information", WdInformation::wdActiveEndPageNumber); // = 3
1
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
24.08.2012, 13:36  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Курсор в ячейке находится? Тогда так:
C++
1
2
int page = wordApp.OlePropertyGet("Selection").
    OlePropertyGet("Information", WdInformation::wdActiveEndPageNumber); // = 3
а как курсор в ячейку поставить ?

Вылетают 2 ошибки на это месте WdInformation::wdActiveEndPageNumber

[BCC32 Error] Unit2.cpp(62): E2090 Qualifier 'WdInformation' is not a class or namespace name
Full parser context
Unit2.cpp(21): parsing: void _fastcall TForm2::Button1Click(TObject *)
[BCC32 Error] Unit2.cpp(62): E2121 Function call missing )
Full parser context

Добавлено через 14 минут
Вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    Variant  vVarApp,vVarDocs, vVarDoc, vVarParagraphs,vVarParagraph, vVarRange,
    vVarTables, vVarTable, vVarCell, vVarRangeCell, vVarPageNumber;
    bool fStart;
    int page;
    AnsiString S="";
    TStringList *SL = new TStringList;
 
    Variant v;
    if(!fStart)
        {
            try
                {
                    vVarApp=CreateOleObject("Word.Application");
                    fStart=true;
                }
            catch(...)
                {
                    MessageBox(0, L"Ошибка при открытии сервера Word", L"Ошибка", MB_OK);
                    return;
                }
        }
    vVarApp.OlePropertySet("Visible",true);
    vVarDocs=vVarApp.OlePropertyGet("Documents");
    vVarDoc=vVarDocs.OleFunction("Open", "C:\\Users\\Fsx\\Desktop\\Новая папка\\b_757_2u.rtf");
    vVarRange = vVarDoc.OleFunction("Range");
    vVarTables=vVarRange.OlePropertyGet("Tables");
 
    for(int i=3;i<=295;i++)
        {
            vVarTable=vVarTables.OleFunction("Item",7);
            vVarCell=vVarTable.OleFunction("Cell",(Variant)(i),(Variant)(2));
            vVarRangeCell = vVarCell.OlePropertyGet("Range");
            S=vVarRangeCell.OlePropertyGet("Text");
            page = vVarApp.OlePropertyGet("Selection").OlePropertyGet("Information", WdInformation::wdActiveEndPageNumber);
 
    if(S.Trim().IsEmpty())
        {
            S="";
            continue;
        }
    else
        {
            SL->Add(S.Trim());
            S="";
        }
    SL->SaveToFile("1.txt");
        }
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
24.08.2012, 13:45
Цитата Сообщение от Fastex Посмотреть сообщение
а как курсор в ячейку поставить ?
А как ты считываешь значение из ячейки, не устанавливая ее активной?

Цитата Сообщение от Fastex Посмотреть сообщение
Вылетают 2 ошибки на это месте WdInformation::wdActiveEndPageNumber
Ну, не знаю, при подключении <Word_XP.h> (да, да, у меня OfficeXP и менять не собираюсь ) никаких ошибок не вылетает. Если все же не удастся использовать готовые перечисления - я специально привел нужное числовое значение в комментариях.

Добавлено через 8 минут
Update: Для твоего случая можно сделать так:
C++
1
page = vVarRangeCell.OlePropertyGet("Information", (Variant)3);
1
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
24.08.2012, 14:03  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
А как ты считываешь значение из ячейки, не устанавливая ее активной?

Ну, не знаю, при подключении <Word_XP.h> (да, да, у меня OfficeXP и менять не собираюсь ) никаких ошибок не вылетает. Если все же не удастся использовать готовые перечисления - я специально привел нужное числовое значение в комментариях.

Добавлено через 8 минут
Update: Для твоего случая можно сделать так:
C++
1
page = vVarRangeCell.OlePropertyGet("Information", (Variant)3);
Спасибо! Все работает всеми вариантами
0
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
30.08.2012, 19:16  [ТС]
А как быть со сложными таблицами, если нужно прочитать таблицу по строкам, количество строк известно, количество столбцов - тоже, когда несколько строк в 1 столбце объединены, вылетает ошибка, что нет такого семейства
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
30.08.2012, 19:30
Правильно вылетает. При объединенных ячейках надо знать, как именно они объединены, и обращаться строго по правильным индексам. Примеры правильных индексов - в аттаче (обрати внимание, ячеек 2:1 и 2:2 не существует, при попытке обращения к ним будет ошибка):
Миниатюры
Как получить номер текущей страницы документа MS Word при работе через OLE  
0
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
30.08.2012, 19:42  [ТС]
Я понимаю, а как же генерировать индексы ? У меня простые 2 цикла i,j. как понять, что ячейки объединены, или что ее не существует или как вообще тут быть ? Как понять, что под 1,1 ничего нет, а сразу 2,3 ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
30.08.2012, 20:50
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Что мешает сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Variant vVarTable=vVarTables.OleFunction("Item",1);
    for(int R = 1; R < 4; R++)
        for(int C = 1; C < 5; C++)
        {
            try
            {
                Variant vVarCell=vVarTable.OleFunction("Cell",(Variant)(R),(Variant)(C));
                Variant vVarRangeCell = vVarCell.OlePropertyGet("Range");
                String S=vVarRangeCell.OlePropertyGet("Text");
                StringGrid1->Cells[C][R] = S;
            }
            catch(EOleException &e)
            {
               // merged, поэтому не читается
            }
        }
?
1
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
02.09.2012, 22:02  [ТС]
Спасибо. А можно ли как - то узнать, подчеркнут ли текст или использовались ли маркеры ?
0
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
10.09.2012, 16:26  [ТС]
Как вообще определяется форматирование и в частности как рассматривать отдельные слова в тексте? Интересует Цвет, подчеркивание и маркеры
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2012, 16:26
Помогаю со студенческими работами здесь

Не выходит получить данные из документа через Ole
Формирую в 1С такой запрос, проверей в Lotus отрабатывает на ура, а через OLE не в какую :angry: MSScript.language=...

Получить номер строки в документа Word
procedure TForm1.Button1Click(Sender: TObject); var fileName: string; a: Integer; W: Variant; begin if...

Как в листе Excel определить номер текущей страницы?
Как в листе Exel определить номер текущей страницы? В Word'е знаю, а в Exel не нашел. Заодно - можно ли запретить копирование в ClipBoard?

Как получить имя текущей страницы?
Tipa kak v desktop Me.Name?

OLE-сервер Word. Сохранение документа
Всем привет! Столкнулся с интересным поведением OLE Создаю документ Word, а затем сохраняю его: UnicodeString...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru