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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.03.2013, 08:53   #1  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
AutoFitRow объединенной ячейки
Добрый день. Родил метод для подбора высоты объединенной ячейки. Ax2009. Работает только для объединенных столбцов, для одной строки
Представляю вашему вниманию
X++:
public void autoFitMergedCellRowHeight(BookMark _bookMark, int _sheetNo = 1)
{
    Com         cells, cell, comWorkSheet, comApplication, row;
    Com         range;
    int         firstRow, lastRow, firstCol, lastCol;
    real        mergedCellRgWidth, rngWidth, possNewRowHeight;
    Counter     colCounter;
    COMVariant  rowVariant;

    Com getCell(int _rowNum, int _colNum)
    {
        Com         cellLoc;
        COMVariant  cellVariant;
        ;
        cellVariant = cells.item(_rowNum, _colNum);
        cellLoc     = COM::createFromVariant(cellVariant);

        return cellLoc;
    }

    real columnWidth(int _rowNum, int _colNum, int _widthHeight)
    {
        Com         cellLoc = getCell(_rowNum, _colNum);
        COMVariant  doubleVariant;
        ;
        switch(_widthHeight)
        {
            case 1 :  doubleVariant = cellLoc.RowHeight()  ; break;
            case 2 :  doubleVariant = cellLoc.ColumnWidth(); break;
        }

        return doubleVariant.double();
    }
    void setCellWidthHeight(int _rowNum, int _colNum, int _widthHeight, real _widthHeightValue)
    {
        Com         cellLoc = getCell(_rowNum, _colNum);
        COMVariant  doubleVariant = COMVariant::createFromReal(_widthHeightValue);

        switch(_widthHeight)
        {
            case 1 :  cellLoc.RowHeight(doubleVariant)  ; break;
            case 2 :  cellLoc.ColumnWidth(doubleVariant); break;
        }
    }
    ;
    comWorkSheet   = this.getWorkSheet(_sheetNo);
    comApplication = m_comDocument.application();
    comWorkSheet.activate();
    
    if (!comWorkSheet || !comApplication)
    {
        return;
    }
    range = this.findRange(_bookMark);
    if(!range || !range.MergeCells() || !range.WrapText())
    {
        return;
    }
    
    [firstCol, firstRow, lastCol, lastRow] = ComExcelDocument_RU::cellRegion2ColRow(_bookMark);
    
    cells    = comWorkSheet.Cells();
    rngWidth = columnWidth(firstRow, firstCol, 2);

    mergedCellRgWidth = 0;
    for (colCounter = firstCol; colCounter <= lastCol; colCounter ++)
    {
        mergedCellRgWidth += columnWidth(firstRow, colCounter, 2);
    }

    range.MergeCells(false);

    setCellWidthHeight(firstRow, firstCol, 2 , MergedCellRgWidth);

    row = this.findRowByNumber(1);
    row.AutoFit();

    rowVariant = row.RowHeight();

    possNewRowHeight = rowVariant.double();

    cell = getCell(firstRow, firstCol);
    cell.ColumnWidth(COMVariant::createFromReal(rngWidth));

    range.MergeCells(true);
    row.RowHeight(COMVariant::createFromReal(possNewRowHeight));
}

Недостающие функции.

X++:
public COM findRowByNumber(int _rowNo, int _sheetNo = 1)
{
    COM         comRows, comWorkSheet, comRow;
    COMVariant  comRowVariant;
    ;

    if (m_comDocument)
    {
        comWorkSheet = this.getWorkSheet(_sheetNo);

        if (!comWorkSheet)
            return null;

        comRows             = comWorkSheet.rows();
        comRowVariant       = comRows.item(_rowNo);
        comRow              = COM::createFromVariant(comRowVariant);
    }

    return comRow;
}

public void autoFitMergedCellRowHeight(BookMark _bookMark, int _sheetNo = 1)
{
    Com         cells, cell, comWorkSheet, comApplication, row;
    Com         range;
    int         firstRow, lastRow, firstCol, lastCol;
    real        mergedCellRgWidth, rngWidth, possNewRowHeight;
    Counter     colCounter;
    COMVariant  rowVariant;

    Com getCell(int _rowNum, int _colNum)
    {
        Com         cellLoc;
        COMVariant  cellVariant;
        ;
        cellVariant = cells.item(_rowNum, _colNum);
        cellLoc     = COM::createFromVariant(cellVariant);

        return cellLoc;
    }

    real columnWidth(int _rowNum, int _colNum, int _widthHeight)
    {
        Com         cellLoc = getCell(_rowNum, _colNum);
        COMVariant  doubleVariant;
        ;
        switch(_widthHeight)
        {
            case 1 :  doubleVariant = cellLoc.RowHeight()  ; break;
            case 2 :  doubleVariant = cellLoc.ColumnWidth(); break;
        }

        return doubleVariant.double();
    }
    void setCellWidthHeight(int _rowNum, int _colNum, int _widthHeight, real _widthHeightValue)
    {
        Com         cellLoc = getCell(_rowNum, _colNum);
        COMVariant  doubleVariant = COMVariant::createFromReal(_widthHeightValue);

        switch(_widthHeight)
        {
            case 1 :  cellLoc.RowHeight(doubleVariant)  ; break;
            case 2 :  cellLoc.ColumnWidth(doubleVariant); break;
        }
    }
    ;
    comWorkSheet   = this.getWorkSheet(_sheetNo);
    comApplication = m_comDocument.application();
    comWorkSheet.activate();
    
    if (!comWorkSheet || !comApplication)
    {
        return;
    }
    range = this.findRange(_bookMark);
    if(!range || !range.MergeCells() || !range.WrapText())
    {
        return;
    }
    
    [firstCol, firstRow, lastCol, lastRow] = ComExcelDocument_RU::cellRegion2ColRow(_bookMark);
    
    cells    = comWorkSheet.Cells();
    rngWidth = columnWidth(firstRow, firstCol, 2);

    mergedCellRgWidth = 0;
    for (colCounter = firstCol; colCounter <= lastCol; colCounter ++)
    {
        mergedCellRgWidth += columnWidth(firstRow, colCounter, 2);
    }

    range.MergeCells(false);

    setCellWidthHeight(firstRow, firstCol, 2 , MergedCellRgWidth);

    row = this.findRowByNumber(1);
    row.AutoFit();

    rowVariant = row.RowHeight();

    possNewRowHeight = rowVariant.double();

    cell = getCell(firstRow, firstCol);
    cell.ColumnWidth(COMVariant::createFromReal(rngWidth));

    range.MergeCells(true);
    row.RowHeight(COMVariant::createFromReal(possNewRowHeight));
}
Работает медленно но эффективно. Можно оптимизировать.

Последний раз редактировалось Kainix; 06.03.2013 в 09:02.
Старый 06.03.2013, 09:10   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Т.е. вы сначала отменяете объединение, а потом восстанавливаете? А никаких косяков, типа потери форматирования, при этом не возникает?

См. также Автовысота строк при экспорте в excel

Последний раз редактировалось S.Kuskov; 06.03.2013 в 09:28.
Старый 06.03.2013, 09:34   #3  
Kainix is offline
Kainix
Участник
 
47 / 96 (4) ++++
Регистрация: 22.11.2007
Да именно так. С форматирование проблем нет, т.е. текст на центр не встает. Единственное что я заметил, что при большом количестве столбцов что пиксели не соответствуют мм, т.е. если объеденены 22 ячейки по 0,5 мм (6 пикселя), а ячейка 11 мм (82 пикселя). А если сделать столбец 18,14 мм (132 пикселя), то именно он соответсвует размеру изначально обьединеных 22 ячеек. Вот это незадача.

Последний раз редактировалось Kainix; 06.03.2013 в 09:36.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Выйти из ячейки грида после двойного клика S.Kuskov DAX: Программирование 9 14.01.2011 13:12
Ячейки комплектации на складе без палет Sirius DAX: Функционал 5 10.04.2006 13:21
ячейки приемки Tressi DAX: Функционал 12 30.01.2006 06:57
Резервирование ячейки при создании заказа и использование механизма "Клиентской яч." RSJustInTime DAX: Функционал 11 06.01.2006 22:24
Буферные ячейки на складе - зачем? renat DAX: Функционал 16 01.04.2004 20:22

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:21.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.