页面树结构
转至元数据结尾
转至元数据起始

提示:本文档的示例代码仅适用于本文档中的示例报表/场景。若实际报表/场景与示例代码无法完全适配(如报表使用冻结,或多个宏代码冲突等),需根据实际需求开发代码。

示例说明

电子表格在excel中对字段设置了自动换行后,在excel端的打印效果与在浏览器端的打印效果不一致。

如下,是电子表格报表的展示效果和将报表导出Excel之后直接打印的效果。

如下,是该电子表格报表在浏览器访问,通过工具栏上的打印按钮进行打印的效果。

我们可以通过调整设置和宏代码辅助,实现正确的打印效果。

设置方法

前提

1.首先要明确,对于Excel来说,行高和自动换行这两个功能是冲突的。在没有人为调整过行高的情况下,设置自动换行时,Excel中的数据是能够自动换行的。如下:

但是如果人为调整了行高,那么再设置自动换行,是不会生效的。Excel以设置的行高进行展示,不会再根据自动换行所需要的行高去进行调整了。如下:如果先设置的自动换行,再调整行高。也是以人为设置的行高为主


2.因此如果要实现自动换行,且自动调整行高的效果。需要先将人为设置的行高修改回原始默认的行高。如何修改呢?

(1)先将这一行所有单元格的已设置的“自动换行”取消


(2)将鼠标放在行号的下方,比如要调整第3行的行高,则将鼠标放在第3行和第4行的中间那根分界线上,然后双击,即可讲人为设置的行高取消。

(3)在设置回默认行高的情况下,再设置自动换行

(4)可选中单元格,然后在 开始 > 格式 中,勾选“自动调整行高”


3.对于合并了行的单元格来说,自动换行的行高无法确保一定能够自动适应。


设置步骤

1.了解了Excel自动换行和行高等前提条件之后,我们需要在Excel中打开电子表格

2.对于该电子表格中,如果不需要自动换行,只要固定行高的行,我们可以手动设置一下行高。比如类别这一行,不需要自动换行。且要固定行高,因此可以右键设置一下行高。(注:若不设置行高,后续使用的宏代码会自动调整行高)

3.对于需要自动换行的单元格所在的行,根据“前提”中的信息。先将这一行的所有单元格的自动换行取消掉,并且调整行高回到原始的行高

然后再次设置“自动换行”和“自动调整行高”

4.一般情况下,通过上面的设置已经能够解决打印时效果不正确的问题。若打印仍有问题,可增加如下宏代码,做强制处理

(1)在报表宏界面新建服务端模块。在弹出的新建模块对话框中,选择对象为spreadSheetReport、事件为onBeforeOutput、并把下面宏代码复制到代码编辑区域。

宏类型

类型

对象

事件

ServerSide

spreadsheetReport

onBeforeOutput


宏代码1

function main(spreadsheetReport) {
    spreadsheetReport.workbook.worksheets.get(0).autoFitRows(true);
}


另:如果使用上面的报表宏还无法解决,可尝试使用下面的报表宏解决。

宏类型

类型

对象

事件

ServerSide

spreadsheetReport

onBeforeOutput

宏代码2

function main(spreadsheetReport) {
    var options = Packages.com.aspose.cells.AutoFitterOptions();
    options.setAutoFitMergedCells(true);
    spreadsheetReport.workbook.worksheets.get(0).autoFitRows(options);
}

以上两种方式若是还是没有办法解决,可尝试参考如下宏代码:

宏类型

类型

对象

事件

ServerSide

spreadsheetReport

onBeforeOutput

宏代码3

function main(spreadsheetReport) {
    var options = Packages.com.aspose.cells.AutoFitterOptions();
    var cells = spreadsheetReport.workbook.worksheets.get(0).getCells();
    //一行字体高度
    var perRowHeight = 13.5;
    //需要调整的单元格,每个单元格中一行多少字
    var cell_C3perRowCharCount = 17;
    if (spreadsheetReport.outputType == "PDF" || spreadsheetReport.outputType == "PRINT") {
        logger.debug("pdf");
        //需要调整的单元格
        fixExpandCells(cells, "C3", cell_C3perRowCharCount, perRowHeight);
    }
}
function fixExpandCells(cells, pos, perRowCharCount, perRowHeight) {
    var expandedCells = spreadsheetReport.sheets[0].getExpandedPositions(pos);
    for (var i = 0; i < expandedCells.length; i++) {
        var eCell = expandedCells[i];
        var fixCell = cells.get(eCell.row, eCell.column);
        fixCellHeight(cells, fixCell, perRowCharCount, perRowHeight);
    }
}
function fixCellHeight(cells, cell, perRowCharCount, perRowHeight) {
    var fontSize = cell.getDisplayStyle().getFont().getSize();
    var mergedCount = 1;
    if (cell.getMergedRange() != null) {
        cell.getMergedRange().getColumnCount();
    }
    var cellColumn = cell.getColumn();
    var totalWidth = 0;
    for (var i = 0; i < mergedCount; i++) {
        var colWidth = cells.getColumnWidthPixel(i + cellColumn);
        totalWidth += colWidth;
    }
    var value = cell.getValue();
    if (value != null) {
        var values = value.split("\\n");
        var height = 0;
        for (var i = 0; i < values.length; i++) {
            var cellRowCount = (values[i].length() / perRowCharCount);
            var calHeight = Math.ceil(cellRowCount) * perRowHeight;
            height += calHeight;
        }
        var oldHeight = cells.getRowHeight(cell.getRow());
        if (height > oldHeight) {
            if (height < 409) {
                cells.setRowHeight(cell.getRow(), height);
            } else {
                cells.setRowHeight(cell.getRow(), 409);
            }
        }
    }
}

添加宏代码前导出PDF效果:

添加宏代码之后的导出PDF效果:

注意:

1、Excel设置单元格的时候不要使用双边框线。

2、获取需要导出时显示不全的单元格名称,可按照如下截图:


示例资源:自动换行打印效果不一致.xml