AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2009, 19:53   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
ХА-ХА-ХАААА... А вообще всё было проще!

COMVariant для Zoom!!

X++:
#define.xlDialogPageSetup(7)
static void Job211(Args _args)
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    COM doc;
    COM app;
    COM worksheet;
    COM pageSetup;
    COM temp;
    COMVariant cv = new COMVariant();

    ;
    excel.newFile();
    doc = Excel.getComDocument();
    app = doc.Application();
    worksheet = app.ActiveSheet();

    pageSetup = worksheet.PageSetup();

    cv.boolean(false);
    pageSetup.Zoom(cv);
    pageSetup.FitToPagesWide(2);
    pageSetup.FitToPagesTall(3);

    // это для демонстрации того, что получается
    temp = app.Dialogs();
    temp = temp.Item(#xlDialogPageSetup);
    temp.Show();
}
Правда, значение comVariant.noValue() - на случай пустого значения полей "Fit to" - что-то пока не получается передать в FitToPagesWide или в FitToPagesTall...

Последний раз редактировалось Gustav; 30.09.2009 в 20:14.
За это сообщение автора поблагодарили: Alenka (1), zelibobis (1), decoder (1).
Старый 30.09.2009, 20:19   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
PS: О! Уже сам догадался
Ну типа, ага. Между прочим, какое-то Ваше же сообщение и вспомнил на эту тему

Владимир, а не посмотрите еще одну затыку:
Цитата:
Сообщение от Gustav Посмотреть сообщение
Правда, значение comVariant.noValue() - на случай пустого значения полей "Fit to" - что-то пока не получается передать в FitToPagesWide или в FitToPagesTall...
У меня вроде один раз получилось, а сейчас не могу воспроизвести... или показалось, что получилось...

P.S. Хотя я, наверное, допёр... Надо было внимательно читать собственную ссылку:
Цитата:
Сообщение от Gustav Посмотреть сообщение
Нашёл пилюлю вот здесь: http://www.ozgrid.com/forum/showthread.php?t=49644
И использовать не comVariant.noValue(), а тоже comVariant.boolean(false). Наверное, так будет нормально:

X++:
    int fitToPagesWide = 10;
    COMVariant cvWide = new COMVariant();

    if (fitToPagesWide)
        cvWide.int( fitToPagesWide );
    else
        cvWide.boolean( false );

    pageSetup.FitToPagesWide(cvWide);
Сейчас Аксапты под рукой нет, окончательно проверю завтра утром.

Последний раз редактировалось Gustav; 30.09.2009 в 23:54.
Старый 01.10.2009, 09:47   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Проверил, работает. Выстрадался окончательный вариант:
X++:
#define.xlDialogPageSetup(7)
static void Job212(Args _args)
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    COM doc;
    COM app;
    COM worksheet;
    COM pageSetup;
    COM temp;

    int fitToPagesWide = 5; // страниц в ширину
    int fitToPagesTall = 0; // страниц в высоту, если 0, то поле пустое

    COMVariant cvZoom = COMVariant::createFromBoolean(false);
    COMVariant cvWide = fitToPagesWide ? COMVariant::createFromInt( fitToPagesWide ) 
                                       : COMVariant::createFromBoolean( false );
    COMVariant cvTall = fitToPagesTall ? COMVariant::createFromInt( fitToPagesTall )
                                       : COMVariant::createFromBoolean( false )    ;
    ;
    excel.newFile();
    doc = excel.getComDocument();
    app = doc.Application();

    worksheet = app.ActiveSheet();
    pageSetup = worksheet.PageSetup();

    pageSetup.Zoom(cvZoom);
    pageSetup.FitToPagesWide(cvWide);
    pageSetup.FitToPagesTall(cvTall);

    // это для демонстрации того, что получается
    temp = app.Dialogs();
    temp = temp.Item(#xlDialogPageSetup);
    temp.Show();
}
Старый 01.10.2009, 11:34   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
И всё-таки сгодится в хозяйстве макро PAGE.SETUP
Я еще раз внимательно изучил ссылку-пилюлю: http://www.ozgrid.com/forum/showthread.php?t=49644.

Человеку, который там задает вопрос, нужно было следующее: прочитать значение процентов масштабирования после того, как ранее была применена подгонка по страницам (Fit to). Когда это делается вручную, то сначала устанавливаются значения Fit to и жмётся OK. Рабочий лист при этом должен быть с большим количеством данных, иначе эффекта масштабирования не будет - пустой лист не масштабируется. Далее повторно вызываем диалог "Page Setup" и видим, что в поле "Adjust to...% normal size" отображается конкретный процент масштабирования, который автоматически рассчитался в Excel по нашем параметрам подгонки. И пусть это значение нам и нужно получить в коде.

Отвечающий на вопрос там предлагает дважды выполнить команду PAGE.SETUP. Но мы-то вроде умеем уже и без нее устанавливать необходимые свойства. Правда, оказывается, что этого недостаточно для получения значения Zoom'а...

Не буду вдаваться в подробности, а просто приведу джоб в окончательном виде, когда мне удалось прочитать значение процентов масштабирования после подгонки, и вы сами всё увидите:
X++:
static void Job212_PageSetupReadPercent(Args _args)
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    COM doc;
    COM app;
    COM worksheet;
    COM pageSetup;
    COM temp;
    COM range;

    str macroFormula;
    str xlForLang   = KKu::excelFormulaLanguage(app);

    int fitToPagesWide = 0;
    int fitToPagesTall = 5;

    COMVariant cvZoom = COMVariant::createFromBoolean(false);
    COMVariant cvZoomNum;
    COMVariant cvWide = fitToPagesWide ? COMVariant::createFromInt( fitToPagesWide )
                                       : COMVariant::createFromBoolean( false );
    COMVariant cvTall = fitToPagesTall ? COMVariant::createFromInt( fitToPagesTall )
                                       : COMVariant::createFromBoolean( false )    ;

    void executePageSetup()
    {
        // даже "холостой" вызов PAGE.SETUP (т.е. без параметров)
        // как бы является нажатием кнопки ОК в диалоге "Page Setup"
        macroFormula = strFmt('%1()', xlForLang=='English'?'PAGE.SETUP':'ПАРАМЕТРЫ.СТРАНИЦЫ');
        app.ExecuteExcel4Macro(macroFormula);
    }
    ;

    excel.newFile();
    doc = excel.getComDocument();
    app = doc.Application();

    // заполняем лист большим количеством данных
    worksheet = app.ActiveSheet();
    range = worksheet.Range('A1:Z1000');
    range.Value2('test');

    pageSetup = worksheet.PageSetup();

    pageSetup.Zoom(cvZoom);
    pageSetup.FitToPagesWide(cvWide);
    pageSetup.FitToPagesTall(cvTall);

    // сравните с иным конечным видом диалога "Page Setup, 
    // закомментировав следующую строку
    executePageSetup();

    pageSetup.FitToPagesWide(cvZoom); // cvZoom здесь используется
    pageSetup.FitToPagesTall(cvZoom); // как носитель значения false

    // сравните с иным конечным видом диалога "Page Setup, 
    // закомментировав следующую строку
    executePageSetup();

    // читаем значение процентов масштабирования
    cvZoomNum = pageSetup.Zoom();
    box::info(strFmt('Adjust to %1 % normal size', cvZoomNum.long()));

    // это для демонстрации того, что получается
    temp = app.Dialogs();
    temp = temp.Item(#xlDialogPageSetup);
    temp.Show();
}
Запустив этот джоб в исходном виде вы получите такие картинки:

Название: PageSetup1.JPG
Просмотров: 4650

Размер: 5.8 КбНажмите на изображение для увеличения
Название: PageSetup2.JPG
Просмотров: 630
Размер:	54.0 Кб
ID:	5191

После запуска этого же джоба с закомментированными строками executePageSetup (см. в комментариях, где я прошу это сделать) картинки будут менее радостными:

Название: PageSetup3.JPG
Просмотров: 4676

Размер: 6.6 КбНажмите на изображение для увеличения
Название: PageSetup4.JPG
Просмотров: 676
Размер:	56.7 Кб
ID:	5193

Вот как-то так...

Уфф... И приятно, что ЦСКА вчера не посрамил Страну и выиграл 2:1
Старый 01.10.2009, 14:28   #5  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
Еще вопрос.. для кучи
На форме установлен элемент ActiveX "ExcelSheet" и в нем есть "экселевское" меню в том числе кнопка "Экспорт в Microsoft Excel".
Можно ли при экспорте этой кнопкой попутно задать значение параметра страницы (напр. тот же самый "Разместить не более чем на 1 стр. в ширину и 1 стр. в высоту") создаваемого документа?
Или это ActiveX и его нельзя.. или я чего-то не понимаю..
Старый 01.10.2009, 15:26   #6  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от decoder Посмотреть сообщение
На форме установлен элемент ActiveX "ExcelSheet" и в нем есть "экселевское" меню в том числе кнопка "Экспорт в Microsoft Excel".
Эта штука называется Spreadsheet. Это "почти" Excel, но "далеко не совсем".

Файлы по Spreadsheet'у, которые наверняка есть на вашем компутере:
  • OWCDSS11.CHM (или OWCRSS11.CHM - не знаю чем они отличаются) - "Справка компонента электронных таблиц Microsoft Office 2003" - это описание того, что пользователь может делать ручками
  • OWCFUN11.CHM - "Справка функций электронных таблиц Microsoft Office 2003" - это функции рабочего листа (типа SUM или СУММ), которыми можно пользоваться при работе со Spreadsheet (в большом Excel, конечно, выбор побогаче, но тут тоже не бедный)
  • OWCVBA11.CHM - "Microsoft Office 2003 Web Components Visual Basic Reference" - справочник по программированию (всех компонентов семейства OWC, не только Spreadsheet)
Вместо 11 могут быть еще файлы по 10 (просто подравьте цифру в поиске файлов), или даже по 12,


В OWCDSS11.CHM про печать говорится следующее:
Цитата:
Печать листа

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

В обозревателе Microsoft Internet Explorer, в меню Файл выберите команду Печать.

Примечание. Если электронная таблица шире или длиннее печатной страницы, области, выходящие за ее границы, не печатаются. Для расширения возможностей управления печатью данных, включая возможность печати длинных таблиц и расстановки разрывов страниц, электронную таблицу можно экспортировать в Microsoft Excel, нажав на панели инструментов кнопку Экспорт в Microsoft Excel . Сведения о печати из Microsoft Excel содержатся в справке по Microsoft Excel.
В OWCVBA11.CHM нет ничего про нужный нам PageSetup. Так что, извините!
Старый 26.11.2009, 02:49   #7  
Stainless is offline
Stainless
Участник
MCBMSS
Columbus IT
 
34 / 114 (4) +++++
Регистрация: 26.01.2007
Столкнулся с похожей проблемой, необходимо измений масштаб примечания в Excel, VBA-код:

X++:
Range("A1").AddComment
Range("A1").Comment.Visible = False
Range("A1").Comment.Text Text:="*:"
Selection.ShapeRange.ScaleWidth 1.98, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.ScaleHeight 2.7, msoFalse, msoScaleFromTopLeft
Не могу никак разобраться как изменить Scale

+ сам разобрался:
X++:
comShape          = comComment.Shape();
comTextFrame    = comShape.TextFrame();
comTextFrame.AutoSize(1);

Последний раз редактировалось Stainless; 26.11.2009 в 03:13.
Теги
excel, масштаб, программно, com-объект

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
emeadaxsupport: How does the Export to Excel feature work under the hood? Blog bot DAX Blogs 0 07.09.2009 19:05
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:38.