Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.36.228] |
|
Сообщ.
#1
,
|
|
|
Таблица на титульном листе располагается в рамке надписи. Если в Ворде с помощью команды "Перейти" хочу перейти на таблицу, то курсор на таблице не останавливается. Он таблицу не видит.
Если бы можно было составить макрос, дошло бы до меня, как перевести на С++. Но макроса нет. Может кто знае, как программно через OleServer выделить таблицу в рамке. Очень буду благодарна. Таких вопросов даже в инете не задают. Редко кому нужно. Но мне постоянно приходится работать программно с вордовскими документами. |
Сообщ.
#2
,
|
|
|
Насколько я понимаю, нужно в ActiveDocument.ActiveWindow.ActivePane перебрать все Page и для каждого изучить коллекцию Rectangles. (Если цель только лишь титульный лист, достаточно ограничиться только первой страницей.) Она содержит объекты Rectangle, в которых нужно поискать те, которые имеют RectangleType равным wdShapeRectangle, взять их Range и делать с ним, что угодно. Это если я правильно понял тип контейнера "рамка надписи".
|
Сообщ.
#3
,
|
|
|
Спасибо за подсказку. Получилось вот что:
Variant shape; shape = Wdoc.OlePropertyGet("Shapes").OleFunction("Range", 1); shape.OleProcedure("Select"); Этим кодом я активирую рамку. На прикрепленном файле это видно. А вот проникнуть в таблицу, которая находится внутри рамки, не получается. Я думала, должно быть так: Variant Tbl = shape.OlePropertyGet("Tables").OleFunction("Item", 1); Но это не работает. Может знаете, как проникнуть в рамку? Я вышла из положения таким образом: 1) Выделила все - в итоге таблица внутри рамки выделилась; 2) Команда "вырезать" 3) Перешла на первый раздел 4) Вставила таблицу - она уже вне рамки и с ней можно работать, вытаскивать данные из ячеек. Но, думаю, должен быть правильный путь. Хотелось бы его узнать. Прикреплённая картинка
|
Сообщ.
#4
,
|
|
|
Ага. Значит всё-таки неправильно. Ну и ладно.
Цитата laifik @ Если на этот раз правильно, то послеНо, думаю, должен быть правильный путь. Хотелось бы его узнать. shape.OleProcedure("Select"); Добавлено P.S. Selection берётся от приложения, а не документа, это глобальный объект. |
Сообщ.
#5
,
|
|
|
К сожалению, ничего не получается. Как только обращаюсь к таблице, которая находится в рамке, курсор переходит на первую таблицу документа.
То же самое происходит и в документе, который я прикрепила. Таблица находится в верхнем колонтитуле (так я думаю). Вхожу в колонтитул, запрашиваю, сколько таблиц в колонтитуле. Получаю ответ = 1. Перехожу на 1 таблицу в колонтитуле. Курсор не видит таблицу и выходит из колонтитула. А вот на второй странице спокойно нахожу таблицу в колонтитуле и обращаюсь к ней. Я неплохо знаю Word, казалось, уже все в нем запрограммировала. Иногда, чтобы понять, как действовать, составляю сначала макрос, а затем пишу на C++. Но в данном документе даже макрос не составляется. Может есть "продвинутые", которые объяснят мне, что происходит с таблицей в данном конкретном документе. Мои действия: //Активизирую колонтитул - нижний Variant ActiveWindow=Wapp.OlePropertyGet("ActiveWindow"); Variant Value=ActiveWindow.OlePropertyGet("View").OlePropertyGet("SplitSpecial"); if(Value!=0 ) ActiveWindow.OlePropertyGet("Panes").OleFunction("Item",2).OleProcedure("Close"); Variant ActivePane=ActiveWindow.OlePropertyGet("ActivePane"); Value=ActivePane.OlePropertyGet("View").OlePropertyGet("Type"); if((Value== 1 ) || (Value== 2 )) { //Value== 1 ActivePane.OlePropertyGet("View").OlePropertySet("Type", 3 ); } //Value== 1 //Перехожу на верхний колонтитул ActivePane.OlePropertyGet("View").OlePropertySet("SeekView",9 ); Range = Wdoc.OlePropertyGet("Sections").OleFunction("Item",1); //Входу в "подвал" Variant Foot = Range.OlePropertyGet("Footers").OleFunction("Item",1).OlePropertyGet("Range"); int n_tab=Foot.OlePropertyGet("Tables").OlePropertyGet("Count"); //Определяю, сколько таблиц создано Variant Tabl_D = Foot.OlePropertyGet("Tables").OleFunction("Item",n_tab); Tabl_D.OleFunction("Cell", 1, 1).OleProcedure("Select"); Ну и несколько аналогичных вариантов, а результата никакого. Прошу помощи Прикреплённый файл__________________.doc (114 Кбайт, скачиваний: 127) |
Сообщ.
#6
,
|
|
|
Дык эта, колонтитулы – это совсем другое.
В твоём документе таблица находится в верхнем колонтитуле, как ни странно, а не в нижнем. Вот тут её видно: MsgBox ActiveDocument.Sections(1).Headers(2).Range.Tables(1).Range.Text |
Сообщ.
#7
,
|
|
|
Полагаю, что это должно быть так:
Range = Wdoc.OlePropertyGet("Sections").OleFunction("Item",1); Variant Headers = Range.OlePropertyGet("Headers").OleFunction("Item",2).OlePropertyGet("Range"); Table_Info = Headers.OlePropertyGet("Tables").OleFunction("Item",1); Я вспомнила, что когда-то мне приходилось рисовать номер документа в колонтитуле (а по факту - вовсе не колонтитуле) слева листа альбомной ориентации. Просто уже подзабыла, что в Ворде все так неоднозначно. Спасибо за ответы. Теперь все должно получиться. |
Сообщ.
#8
,
|
|
|
Это в целом то же, что у тебя, только Headers вместо Footers.
Конкретно тут это автор документа постарался так всё запутать. Но да, иерархия классов в Офисе ужасная. P.S. Вам вот ещё хорошо, а мне год назад пришлось писать тулзу на голом C++ и WinAPI, т.к. она должна была быть лицензионно чиста и бесплатна. |
Сообщ.
#9
,
|
|
|
Еще раз хочу поблагодарить. Все заработало!
Может, кому-нибудь понадобится. Хотя за годы работы с Вордом, мало кто им интересуется и очень мало литературы. |
Сообщ.
#10
,
|
|
|
Цитата laifik @ Хотя за годы работы с Вордом, мало кто им интересуется и очень мало литературы. На каждую версию ворда выходит книжка листов под тысячу, но там только как пользоваться этим монстром. Даже раздел есть - VB for Application |