Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Программно повернуть лист Word в альбомный


Автор: Нитонисе 1.3.2010, 11:21
Надо повернуть лист Word в альбомный, для последующего создания там таблицы.

Попутно вопрос по таблице - там нужно будет объединять ячейки (смежные по горизонтали и по вертикали), как это делается?

Работаю с компонентом WordApplication.

Автор: chaos 1.3.2010, 11:23
4 года назад надо было подобное.
помогла эта книга
user posted image

Автор: Нитонисе 1.3.2010, 11:41
Так это Дельфи.

Автор: Данкинг 1.3.2010, 11:54
chaos, у меня такая есть. smile 
Цитата(Нитонисе @  1.3.2010,  11:41 Найти цитируемый пост)
Так это Дельфи. 

А какая разница в данном случае? smile Тебе нужно свойство листа (ActiveSheet->PageSetup->Orientation) установить в xlLandscape. smile 

Автор: Нитонисе 6.3.2010, 18:08
Открываю ворд, добавляю документ и пытаюсь его развернуть, но выскакивает ошибка.
Вот код:
Код

WordApplication1->Connect();
WordApplication1->set_Visible(true);
WordApplication1->Documents->Add();
WordApplication1->ActiveDocument->PageSetup->Orientation = wdOrientLandscape;

А вот ошибка.
http://www.radikal.ru

И что она означает?

Автор: Данкинг 6.3.2010, 18:26
Нитонисе, если я не путаю, для параметров страницы в системе должен быть установлен принтер.

Автор: Нитонисе 6.3.2010, 18:31
Цитата(Данкинг @  6.3.2010,  18:26 Найти цитируемый пост)
Нитонисе, если я не путаю, для параметров страницы в системе должен быть установлен принтер.

То есть если не установлен принтер, то я не смогу повернуть лист? Либо это как-то можно иначе сделать?

Автор: Данкинг 6.3.2010, 19:09
Цитата(Нитонисе @  6.3.2010,  18:31 Найти цитируемый пост)
то я не смогу повернуть лист?

Ну да. Как иначе - лично я не в курсе.

Автор: Нитонисе 6.3.2010, 20:16
А можно как нибудь установить фиктивный принтер? реального нет. Чтоб проверить.

Автор: Данкинг 6.3.2010, 20:29
Цитата(Нитонисе @  6.3.2010,  20:16 Найти цитируемый пост)
А можно как нибудь установить фиктивный принтер?

dopdf - он даже бесплатный. При печати сохраняет в .pdf.

Автор: Нитонисе 7.3.2010, 00:31
Цитата(Данкинг @  6.3.2010,  20:29 Найти цитируемый пост)
dopdf - он даже бесплатный. При печати сохраняет в .pdf.

Установил эту программу, но результат тот же. Скорее всего дело не в установленном либо неустановленном принтере. 
А у вас такой код работает?

Автор: Данкинг 7.3.2010, 19:50
А если вместо константы (wdOrientLandscape) подставить её значение = 1 ?

Автор: Нитонисе 7.3.2010, 20:52
Цитата(Данкинг @  7.3.2010,  19:50 Найти цитируемый пост)
А если вместо константы (wdOrientLandscape) подставить её значение = 1 ?

Та же самая ошибка. А попробуйте у себя этот мой код? Там всего четыре строчки, я их повесил на обработчик нажатия кнопки. У вас такая ошибка будет?
И может кто подскажет вариант разворота листа через OLE-технологию?

Автор: Данкинг 7.3.2010, 21:30
Попробовал. Ошибок не выдаёт, но и не разворачивает. smile 

Автор: Нитонисе 7.3.2010, 23:30
Цитата(Данкинг @  7.3.2010,  21:30 Найти цитируемый пост)
Попробовал. Ошибок не выдаёт, но и не разворачивает.

Странно.

А как запустить ворд, открыть новый документ и повернуть лист в нем напрямую через OLE, а не через компоненты?

Автор: Данкинг 7.3.2010, 23:40
Цитата(Нитонисе @  7.3.2010,  23:30 Найти цитируемый пост)
А как запустить ворд, открыть новый документ и повернуть лист в нем напрямую через OLE, а не через компоненты? 

Я на Билдере этого никогда не делал, только на Дельфи, но уверен на 99% что на форуме работа с Word'ом из Билдере где-нибудь да описывалась.

Автор: Нитонисе 7.3.2010, 23:53
Цитата(Данкинг @  7.3.2010,  23:40 Найти цитируемый пост)
Я на Билдере этого никогда не делал, только на Дельфи, но уверен на 99% что на форуме работа с Word'ом из Билдере где-нибудь да описывалась.
Да принцип-то работы есть, но вот конкретно поворота листа - нет.

Автор: Данкинг 8.3.2010, 00:07
Так аналогично: создаёшь OLE-объект и задаёшь ему нечто вроде
Код

word->ActiveDocument->PageSetup->Orientation=1;



Автор: Нитонисе 8.3.2010, 00:41
Цитата(Данкинг @  8.3.2010,  00:07 Найти цитируемый пост)
Так аналогично: создаёшь OLE-объект и задаёшь ему нечто вроде

Не, напрямую с OLE сам не разберусь... все же хотелось бы через компоненты. Что ж тут не так-то... Плохо что документации нету нигде по этим компонентам.

Автор: Нитонисе 8.3.2010, 23:55
Попробовал через напрямую через OLE подключиться к ворду и повернуть в нем лист
Код

Variant App,Docs,Doc;
App=CreateOleObject("Word.Application");
App.OlePropertySet("Visible",true);
Docs=App.OlePropertyGet("Documents");
Docs.OleProcedure("Add");
Doc=Docs.OleFunction("Item",1);
Doc.OlePropertyGet("PageSetup").OlePropertySet("Orientation",1);

Последняя строчка кода не выполняется. Ошибка с сообщением - "вызов был отклонен". Как переписать эту строчку, чтобы она работала?

Автор: Usper 9.3.2010, 09:34
Параметры страницы нужно устанавливать не для документа, а для таблицы:
Код
#include  <ComObj.hpp>

    Variant vVarApp, vVarBooks, vVarBook, vVarSheets, vVarSheet, vVarCells,
        vVarCell;
    try
    {
        vVarApp=CreateOleObject("Excel.Application");
    }
    catch (...)
    {
        Application->MessageBoxA("Не могу запустить сервер Microsoft Excel. Продолжение невозможно.",
            "Ошибка", MB_ICONERROR);
        return;
    }
    vVarApp.OlePropertySet("Visible",true);
    vVarBooks=vVarApp.OlePropertyGet("Workbooks");
    vVarApp.OlePropertySet("SheetsInNewWorkbook",3); //создаём 3 листа в книге
    vVarBooks.OleProcedure("Add");
    vVarBook=vVarBooks.OlePropertyGet("Item",1);
    vVarSheets=vVarBook.OlePropertyGet("Worksheets");
    vVarSheet=vVarSheets.OlePropertyGet("Item",1);
    vVarSheet.OleProcedure("Activate");
    vVarSheet.OlePropertyGet("PageSetup").OlePropertySet("Orientation",2);


И обратите внимание, что для альбомного режима параметру ориентация нужно присвоить значение 2, а не 1.

Автор: Нитонисе 9.3.2010, 12:09
Цитата(Usper @  9.3.2010,  09:34 Найти цитируемый пост)
Параметры страницы нужно устанавливать не для документа, а для таблицы:
Так мне надо вордовский лист развернуть, а не эксель.

Автор: Usper 9.3.2010, 12:39
Ой  smile . Тогда я не знаю почему не работает, у меня этот кусок кода выполняется без ошибок. Какая версия ОС и оффиса?

Автор: Нитонисе 9.3.2010, 12:43
Цитата(Usper @  9.3.2010,  12:39 Найти цитируемый пост)
Ой   . Тогда я не знаю почему не работает, у меня этот кусок кода выполняется без ошибок. Какая версия ОС и оффиса?

ОС - XP SP 2
Word 2002.

У тебя мой код работает без ошибок и поворачивает лист?

Автор: Данкинг 9.3.2010, 12:44
Нитонисе, а в самом Ворде параметры страницы (альбомный вид т.е.) нормально выставляются, без ошибок? Бывает ещё, что "офис" тупит.

Автор: Нитонисе 9.3.2010, 12:51
Цитата(Данкинг @  9.3.2010,  12:44 Найти цитируемый пост)
Нитонисе, а в самом Ворде параметры страницы (альбомный вид т.е.) нормально выставляются, без ошибок? Бывает ещё, что "офис" тупит.

В самом ворде все работает. Вот так выглядит макрос.
Код

Sub Макрос12()
    With ActiveDocument.Styles(wdStyleNormal).Font
        If .NameFarEast = .NameAscii Then
            .NameAscii = ""
        End If
        .NameFarEast = ""
    End With
    With ActiveDocument.PageSetup
        .LineNumbering.Active = False
        .Orientation = wdOrientLandscape
        .TopMargin = CentimetersToPoints(3)
        .BottomMargin = CentimetersToPoints(1.5)
        .LeftMargin = CentimetersToPoints(2)
        .RightMargin = CentimetersToPoints(2)
        .Gutter = CentimetersToPoints(0)
        .HeaderDistance = CentimetersToPoints(1.25)
        .FooterDistance = CentimetersToPoints(1.25)
        .PageWidth = CentimetersToPoints(29.7)
        .PageHeight = CentimetersToPoints(21)
        .FirstPageTray = wdPrinterDefaultBin
        .OtherPagesTray = wdPrinterDefaultBin
        .SectionStart = wdSectionNewPage
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .VerticalAlignment = wdAlignVerticalTop
        .SuppressEndnotes = False
        .MirrorMargins = False
        .TwoPagesOnOne = False
        .BookFoldPrinting = False
        .BookFoldRevPrinting = False
        .BookFoldPrintingSheets = 1
        .GutterPos = wdGutterPosLeft
    End With
    ShowVisualBasicEditor = True
End Sub



Все больше склоняюсь к тому чтобы поставить себе ворд 2007. Уже бы давно поставил, мне в нем не нравится цвет черного шрифта на белом фоне страницы - он какой-то размытый, глаза устают. А в этом ворде - четкий.

Автор: Usper 9.3.2010, 14:44
Цитата(Нитонисе @  9.3.2010,  12:43 Найти цитируемый пост)
У тебя мой код работает без ошибок и поворачивает лист?

Да, так и есть.
Прежде чем переходить на другую версия офиса я советую проверить его работоспособность с уже существующем кодом. Я уже сталкивался с тем, что одна и та же моя программа нормально работает с Excel 97-2003, но начинает глючить с Excel 2007.  При том, что макросы, генерируемые для выполнения нужных действий, одинаковы для разных версий Excel. Нужные мне действия просто не выполняются без сообщений об ошибке со стороны 2007 версии Excel :(.

Автор: Нитонисе 9.3.2010, 19:57
Цитата(Usper @  9.3.2010,  14:44 Найти цитируемый пост)
Да, так и есть.

А проверьте этот код
Код

WordApplication1->Connect();
WordApplication1->set_Visible(true);
WordApplication1->Documents->Add();
WordApplication1->ActiveDocument->PageSetup->Orientation = wdOrientLandscape;

Все то же самое, только через компоненты билдера.

У меня был установлен Office XP, переустановил на Office 2003, а потом и на Office 2007 - везде одна и та же ошибка.

Автор: sawfish 10.3.2010, 06:59
У меня Ваш код работает. Но разворот выполняется с задержкой около 10 сек.
XP Pro SP2
Word 2003 SP1

Автор: Usper 10.3.2010, 09:01
Аналогично, оба варианта работают, Win XP SP2 + Office 2003 и Office 2007.

Автор: Нитонисе 10.3.2010, 10:23
Интересно. У меня через OLE-технологию все так же не работает, а вот через компоненты срабатывает, но только если выставить свойство компонента WordApplication1->ConnectKind = ckRunningOrNew. У этого свойства есть недостаток - при закрытия моей программы закрываются и все открытые вордовские документы. Мне более удобно WordApplication1->ConnectKind = ckNewInstance. При установке этого свойства закрываются только те вордовские документы, которые были открыты из моей программы. Тоже не очень удобно, но как сделать чтобы ворд не закрывался вместе с закрытием моей программы - не придумал.

Добавлено через 14 минут и 50 секунд
Посмотрите эту тестовую программку по развороту листа.
В каких режимах работает, а в каких нет?

Автор: Usper 10.3.2010, 11:20
Все три варианта нормально сработали.

Автор: Нитонисе 18.3.2010, 21:40
Вот какая штука получается. Оказывается метод разворота листа компонентами и у меня работает
Код

WordApplication1->ActiveDocument->PageSetup->Orientation = wdOrientLandscape;

Этот метод не хочет работать только с первым листом ворда, который создается. Со вторым и всеми последующими - работает. У других все нормально работает и с первым листом, очевидно что это проблема моего ворда. Вот какая у него есть особенность - когда я запускаю его из своей программы и создаю первый лист, то он создается, но при этом выскакивает вот такая ошибка

http://www.radikal.ru

второй и все последующие листы создаются без этой ошибки.
Точно такая же ошибка выскакивает когда я открываю ворд и из других программ от других разработчиков, значит дело не в программных приемах, а в самом ворде.
В чем может быть дело? Что э это за ошибка такая, которая мне не позволяет развернуть первый создаваемый лист ворда? 
Создавать два листа, использовать для отчета второй, а первый потом удалять - очень уж кривое решение для создания отчета.

Автор: borisbn 19.3.2010, 07:35
Нитонисе, по поводу "неверно указана единица измерения" - попробуй в начале программы ( например, в конструкторе главной формы ) написать
Код

DecimalSeparator = '.';

Автор: chaos 19.3.2010, 07:42
удалено

Автор: Usper 19.3.2010, 08:44
Нитонисе, тут уже надо смотреть Ваш код, может быть никакой ошибки и нет. В ворде параметры страницы могут применяться как ко всему документу, так и к текущему разделу. Я пользуюсь этой особенностью когда мне необходимо только часть листов из документа повернуть.
Хотя если не работает код из поста от 9.3.2010, 19:57...
Как вариант ещё может быть какой-то косяк в шаблоне Normal, который используются по-умолчанию со всеми документами. Попробуйте создать документ своей программой и потом просмотреть непечатаемые знаки в документе.

Автор: Нитонисе 19.3.2010, 12:21
Цитата(borisbn @  19.3.2010,  07:35 Найти цитируемый пост)
Нитонисе, по поводу "неверно указана единица измерения" - попробуй в начале программы ( например, в конструкторе главной формы ) написать

У меня точка установлена в системе как разделитель целой и дробной части. Странно что такая ошибка выскакивает только при создании первого документа. При этом она почти ни на что не влияет, вот разве что мешает этот самый первый лист развернуть в альбомный.



Цитата(Usper @  19.3.2010,  08:44 Найти цитируемый пост)
Нитонисе, тут уже надо смотреть Ваш код, может быть никакой ошибки и нет.

Да код простой - те самый четыре строчки, создающих сервер Word и открывающих там документ, который затем нужно развернуть. Так дело то в том, что скорее всего дело не в коде, потому что точно такая же ошибка с неверной единицей измерения появляется если ворд запустить из какой-нибудь другой программы. Вот у меня есть программа с базой данных документов. Все документы в вордовском формате. Когда я запускаю какой-либо документ - появляется эта ошибка. Но второй и все последующие документы запускаются из этой программы уже без ошибки.


Цитата(Usper @  19.3.2010,  08:44 Найти цитируемый пост)
Попробуйте создать документ своей программой и потом просмотреть непечатаемые знаки в документе.

Это как это посмотреть непечатаемые знаки?

Автор: Usper 19.3.2010, 12:44
Цитата

Для отображения или скрытия знаков форматирования можно также выбрать в меню Сервис команду Параметры, а затем установить или снять соответствующие флажки в группе Знаки форматирования на вкладке Вид.

Поставьте галку "все" и смотрите есть ли в документе "Разрыв раздела" или что-то подобное.

Автор: Нитонисе 19.3.2010, 14:39
Цитата(Usper @  19.3.2010,  12:44 Найти цитируемый пост)
Поставьте галку "все" и смотрите есть ли в документе "Разрыв раздела" или что-то подобное.

Ну вот, у меня появился только такой символ

http://www.radikal.ru

Автор: Usper 19.3.2010, 16:13
Это нормальное состояние нового документа. Значит дело не в разделах документа. Попробуйте переустановить офис.

Автор: Нитонисе 19.3.2010, 16:15
Цитата(Usper @  19.3.2010,  16:13 Найти цитируемый пост)
Это нормальное состояние нового документа. Значит дело не в разделах документа. Попробуйте переустановить офис

Так пробовал. Был установлен Office XP, потом установил Office 2003, потом Office2007, потом снова Office2003. Всегда одно и то же.

Автор: Usper 19.3.2010, 21:48
Остаётся радикальный метод - переустановка системы.  smile 
Хотя для начала лучше проверить всё это в виртуальной машине, Virtual Box'е, например.

Автор: Нитонисе 19.3.2010, 22:31
Цитата(Usper @  19.3.2010,  21:48 Найти цитируемый пост)
Остаётся радикальный метод - переустановка системы.

Да я сколько помню у меня всегда в офисе такая ошибка выскакивала. Раньше просто она не напрягала, а сейчас вон оно как - лист не дает повренуть  smile 

Автор: 6pahan6 20.3.2010, 02:57
http://letitbit.net/download/7701.ebc7039d4a5db91e6a75898c8/286.part2.rar.html
http://letitbit.net/download/9765.9fe2b31983e3caf3fc94fb8a8/286.part1.rar.html

вот две ссылки, там выложены видосы, которые помогут в изучении С++, желаю удачи в изучении...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)