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

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

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

Author24 — интернет-сервис помощи студентам
Пишу на C++ Builder XE. Необходимо прочитать документ: найти в нем определенную таблицу и прочитать с одного из ее столбцов все значения. Значения я получаю, но так же нужно получить номер страницы, на какой расположена ячейка, с которой это значение считано. Как быть ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2012, 11:43
Ответы с готовыми решениями:

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

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

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

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

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32959 / 21276 / 8169
Регистрация: 22.10.2011
Сообщений: 36,546
Записей в блоге: 8
24.08.2012, 12:05 2
Курсор в ячейке находится? Тогда так:
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  [ТС] 3
Цитата Сообщение от 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
32959 / 21276 / 8169
Регистрация: 22.10.2011
Сообщений: 36,546
Записей в блоге: 8
24.08.2012, 13:45 4
Цитата Сообщение от 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  [ТС] 5
Цитата Сообщение от 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  [ТС] 6
А как быть со сложными таблицами, если нужно прочитать таблицу по строкам, количество строк известно, количество столбцов - тоже, когда несколько строк в 1 столбце объединены, вылетает ошибка, что нет такого семейства
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32959 / 21276 / 8169
Регистрация: 22.10.2011
Сообщений: 36,546
Записей в блоге: 8
30.08.2012, 19:30 7
Правильно вылетает. При объединенных ячейках надо знать, как именно они объединены, и обращаться строго по правильным индексам. Примеры правильных индексов - в аттаче (обрати внимание, ячеек 2:1 и 2:2 не существует, при попытке обращения к ним будет ошибка):
Миниатюры
Как получить номер текущей страницы документа MS Word при работе через OLE  
0
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
30.08.2012, 19:42  [ТС] 8
Я понимаю, а как же генерировать индексы ? У меня простые 2 цикла i,j. как понять, что ячейки объединены, или что ее не существует или как вообще тут быть ? Как понять, что под 1,1 ничего нет, а сразу 2,3 ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32959 / 21276 / 8169
Регистрация: 22.10.2011
Сообщений: 36,546
Записей в блоге: 8
30.08.2012, 20:50 9
Лучший ответ Сообщение было отмечено 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  [ТС] 10
Спасибо. А можно ли как - то узнать, подчеркнут ли текст или использовались ли маркеры ?
0
2 / 2 / 0
Регистрация: 01.03.2010
Сообщений: 46
10.09.2012, 16:26  [ТС] 11
Как вообще определяется форматирование и в частности как рассматривать отдельные слова в тексте? Интересует Цвет, подчеркивание и маркеры
0
10.09.2012, 16:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2012, 16:26
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru