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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2009, 16:44   #1  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
Масштаб в Excel
Привет всем.
В параметрах страницы Excel есть флажок "Разместить не более чем на 1 стр. в ширину и 1 стр. в высоту". Может кто знает как его установить через код?
Старый 30.09.2009, 16:50   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
запишите макрос в Excel а потом получившийся код перенести в аху

З.Ы. записал у себя, предполагаю что вам интересно вот это:
Цитата:
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup
......
.FitToPagesWide = 1
.FitToPagesTall = 1
.....
End With
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 30.09.2009 в 16:54.
Старый 30.09.2009, 16:51   #3  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,699 / 405 (17) +++++++
Регистрация: 23.03.2006
запишите макрос в Excel, нужные свойства вроде FitToPagesWide и FitToPagesTall
Старый 30.09.2009, 17:21   #4  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
Ок. Вот я как раз и не понимаю, как этот супермакрос будет выглядеть в Х++...
Старый 30.09.2009, 17:44   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от decoder Посмотреть сообщение
Ок. Вот я как раз и не понимаю, как этот супермакрос будет выглядеть в Х++...
Примерно так:
X++:
#define.xlDialogPageSetup(7)
static void Job210_ExcelFitToPagesDemo(Args _args)
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    COM doc;
    COM app;
    COM worksheet;
    COM pageSetup;
    COM temp;

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

    pageSetup = worksheet.PageSetup();

    pageSetup.FitToPagesWide(2);
    pageSetup.FitToPagesTall(3);

    // это для демонстрации того, что получается
    temp = app.Dialogs();
    temp = temp.Item(#xlDialogPageSetup);
    temp.Show();

}
Но сразу скажу: РАДОВАТЬСЯ РАНО! Есть подводные камни. Запустите мой джоб, поймите что я имею в виду и продолжим...

P.S. Коллеги забыли про еще один оператор VBA. Полный фрагмент на VBA должен выглядеть так:
Код:
    With ActiveSheet.PageSetup
        .Zoom = False
        .FitToPagesWide = 2
        .FitToPagesTall = 3
    End With
И это нормально работает в Excel. А теперь попробуйте задать этот Zoom из Аксапты - оператор pageSetup.Zoom(false); вызовет ошибку... Думаем, что делать дальше...

P.P.S. Нашёл пилюлю вот здесь: http://www.ozgrid.com/forum/showthread.php?t=49644

Вместо трёх операторов делаем один:
X++:
    //// pageSetup.Zoom(false); // и так не работающий
    // pageSetup.FitToPagesWide(2);
    // pageSetup.FitToPagesTall(3);

    app.ExecuteExcel4Macro('PAGE.SETUP(;;;;;;;;;;;;{2;3})');
Остается вопрос с языком формул, разделителем списка Excel и разделителем колонок массива. Как видно, у меня язык формул английский, а оба разделителя - точка с запятой. У кого-то сработает с запятой, у кого-то с русскими буквами (щас вспомню как по-русски называется этот оператор... ПАРАМЕТРЫ.СТРАНИЦЫ - кто б сомневался )

P.P.P.S. Вот как-то так вырисовывается пример в окончательном виде с учетом всех известных на данный момент особенностей региональных настроек Excel:
X++:
#define.xlDialogPageSetup(7)
static void Job210_ExcelFitToPagesDemo(Args _args)
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    COM doc;
    COM app;
    COM temp;

    str macroFormula;
    str xlListSep   = KKu::excelListSeparator(app);
    str xlColSep    = KKu::excelColumnSeparator(app);
    str xlForLang   = KKu::excelFormulaLanguage(app);

    int fitToPagesWide =  0; // страниц в ширину
    int fitToPagesTall = 10; // страниц в высоту
    ;

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

    xlListSep   = KKu::excelListSeparator(app);
    xlColSep    = KKu::excelColumnSeparator(app);
    xlForLang   = KKu::excelFormulaLanguage(app);

    macroFormula = strFmt('%1(%2{%3%4%5})',
        xlForLang=='English'?'PAGE.SETUP':'ПАРАМЕТРЫ.СТРАНИЦЫ',
        strRep(xlListSep,12),
        fitToPagesWide ? int2str(fitToPagesWide) : (xlForLang=='English'?'#N/A':'#Н/Д'),
        xlColSep,
        fitToPagesTall ? int2str(fitToPagesTall) : (xlForLang=='English'?'#N/A':'#Н/Д'));

    app.ExecuteExcel4Macro(macroFormula); // для активного в данный момент листа

    // это для демонстрации того, что получается
    temp = app.Dialogs();
    temp = temp.Item(#xlDialogPageSetup);
    temp.Show();

}
Если задать обе переменные fitToPagesWide и fitToPagesTall равными 0, то соответствующие поля "Fit to" в диалоге "Page Setup" будут пустыми и выделенной станет верхняя опция "Adjust to ... % normal size".

Для исполнения джоба выше нужны некоторые методы из моего сборника статических методов - класса KKu (мой персональный "Global"). Вот они:
X++:
// определение разделителя колонок Excel - для FormulaArray
static str excelColumnSeparator(COM _excelApplication = null)
{
    #define.xlColumnSeparator(14)
    ;
    return KKu::excelSeparator(#xlColumnSeparator, _excelApplication);
}


// Определение языка формул Excel для свойства Range.Formula
// (именно Formula, а не FormulaLocal !!!)
// подробности см. здесь:
// [url=http://www.axforum.info/forums/showthread.php?p=195646#post195646]Строка в Excel[/url]

// СПОСОБ:
// помещаем в "международное" свойство формулу на русском языке
// и проверяем последующую реакцию Excel
// по окончании проверки удаляем временные объекты
static str excelFormulaLanguage(COM _excelApplication = null)
{
    str         ret;
    COM         workbook;
    COM         range;
    COMVariant  rangeText;
    boolean     separateSession = false;
    ;

    // если сессия не передается параметром...
    if (! _excelApplication)
    {
        // ...то пробуем прицепиться к существующей
        _excelApplication = COM::getObject('Excel.Application');

        // если существующей тоже нет...
        if (! _excelApplication)
        {
            // то создаем отдельную - кратковременную - только лишь для определения языка
            _excelApplication = new COM('Excel.Application');
            separateSession = true;
        }
    }

    workbook = _excelApplication.Workbooks();
    workbook =  workbook.Add();
    range    = _excelApplication.Range('A1');

    // помещаем в "международное" свойство формулу на русском языке
    // и проверяем последующую реакцию Excel
    range.NumberFormat('0'); // на всякий случай
    range.Formula('=СУММ(1+1)');
    range.Calculate(); // на всякий случай
    rangeText = range.Text();

    if (rangeText.bStr()=='2')  // здесь ожидаются значения: #NAME? или #ИМЯ? или 2
        ret = 'Russian';
    else
        ret = 'English';

    workbook.Close(false);

    if (separateSession)
        _excelApplication.Quit();

    return ret;
}


// определение разделителя списка Excel
// нужно для диапазонов вида Range('C:C,F:F')
// можно передать Excel берем параметром из контекста задачи,
// чтобы не загружать отдельную сессию из-за единственного символа;
// а можно и не загружать
static str excelListSeparator(COM _excelApplication = null)
{
    #define.xlListSeparator(5)
    ;
    return KKu::excelSeparator(#xlListSeparator, _excelApplication);
}


// Created on 04 Авг 2009 at 16:04:57 by KKU
// поскольку уже нужно как минмиум два разделителя для Excel: списка и колонок, то делаем для них общее ядро
static str excelSeparator(int _separator, COM _excelApplication = null)
{
    SysExcelApplication xlApp;
    COMVariant          sep;
    ;

    // если сессия не передается параметром...
    if (! _excelApplication)
    {
        // ...то пробуем прицепиться к существующей
        _excelApplication = COM::getObject('Excel.Application');

        // если существующей тоже нет...
        if (! _excelApplication)
        {
            // то создаем отдельную - кратковременную - только лишь для определения разделителя
            xlApp = SysExcelApplication::construct();
            _excelApplication = xlApp.comObject();
        }
    }

    sep = _excelApplication.International(_separator);

    return sep.bStr();
    // если была создана отдельная кратковременная, то она автоматически закроется
}
Уфф... Всё! Поехал домой болеть за ЦСКА против Бешикташа

Последний раз редактировалось Gustav; 30.09.2009 в 19:31.
Старый 30.09.2009, 19:53   #6  
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   #7  
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.
Старый 30.09.2009, 19:57   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,658 / 1162 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Gustav
А теперь попробуйте задать этот Zoom из Аксапты - оператор pageSetup.Zoom(false); вызовет ошибку... Думаем, что делать дальше...
"Чего тут думать?! Трясти надо!" (c)

При работе с COM-объектами параметры надо передавать/принимать не как типы данных Axapta, а как типы ComVariant. То, что ИНОГДА проскакивают значения параметров в виде типов Axapta - это исключения. Обычно это связано с параметрами, которые принимают (или могут принять) целочисленные значения. Поскольку таких параметров большинство, то создается иллюзия, что так и надо. Но, вообще-то, это не корректно.

В общем, нормально работает такой код

X++:
    COM                     comPageSetup;
    ComVariant              comVariantParm;
    ;

    (...)
    comVariantParm = COMVariant::createFromBoolean(false);
    comPageSetup.Zoom(comVariantParm);
PS: О! Уже сам догадался
За это сообщение автора поблагодарили: Gustav (8), decoder (1).
Теги
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, время: 07:28.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.