06.03.2013, 08:53 | #1 |
Участник
|
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 |
Участник
|
Т.е. вы сначала отменяете объединение, а потом восстанавливаете? А никаких косяков, типа потери форматирования, при этом не возникает?
См. также Автовысота строк при экспорте в excel Последний раз редактировалось S.Kuskov; 06.03.2013 в 09:28. |
|
06.03.2013, 09:34 | #3 |
Участник
|
Да именно так. С форматирование проблем нет, т.е. текст на центр не встает. Единственное что я заметил, что при большом количестве столбцов что пиксели не соответствуют мм, т.е. если объеденены 22 ячейки по 0,5 мм (6 пикселя), а ячейка 11 мм (82 пикселя). А если сделать столбец 18,14 мм (132 пикселя), то именно он соответсвует размеру изначально обьединеных 22 ячеек. Вот это незадача.
Последний раз редактировалось Kainix; 06.03.2013 в 09:36. |
|