找回密码
 立即注册

QQ登录

只需一步,快速开始

xujie-joe
金牌服务用户   /  发表于:2022-11-7 11:11  /   查看:2812  /  回复:11
本帖最后由 Lynn.Dou 于 2022-11-14 16:26 编辑

之前发过的贴子:

https://gcdn.grapecity.com.cn/fo ... 91&page=1#pid597070

这里面解决了部分问题,当内容的字体变大时,内容较多时,转PDF还是会出现遮挡问题,如图

image.png211123961.png

ssjson如附件

代码如下

public byte[] excelToPdf(String excelContent) {
        Workbook workbook = new Workbook();
        workbook.fromJson(excelContent);

        IWorksheets worksheets = workbook.getWorksheets();

        // 用于计算单元格高度
        IWorksheet forCalculateSheet = worksheets.add();

        // 不同的模板所打印的区域不同
        // 获取Excel需要转PDF的列的范围
        String pdfArea = "$AO";

        for (int j = 0; j < worksheets.getCount(); j++) {
            IWorksheet worksheet = worksheets.get(j);

            // 设置Excel转PDF列的范围
             worksheet.getPageSetup().setPrintArea(pdfArea);

             // 以下属性的设置,可以让Excel转为PDF的时候所有列不换页
            worksheet.getPageSetup().setIsPercentScale(false);
            worksheet.getPageSetup().setFitToPagesWide(1);

            worksheet.getUsedRange().setWrapText(true);
            worksheet.getRows().autoFit(true);

            // 因为worksheet.getRows().autoFit(true);不会对合并单元格生效,所以
            // 一行行,如果遇到合并单元格的情况,
            // 将合并单元格的内容,复制到forCalculateSheet的某一个单元格中,计算高度,重新赋值给行高
            int rowCount = worksheet.getRowCount();
            int columnCount = worksheet.getColumnCount();
            for (int r = 0; r < rowCount; r++) {
                for (int c = 0; c < columnCount; c++) {
                    IRange range = worksheet.getRange(r, c);
                    // 判断单元格是否在合并单元格区域内
                    if (range.getMergeCells()) {
                        // 获取合并单元格区域
                        IRange mergeArea = range.getMergeArea();
                        Double rowHeight = autoFitMergedCells(forCalculateSheet, mergeArea);
                        if (rowHeight > range.getRowHeight()) {
                            range.setRowHeight(rowHeight);
                        }
                    }
                }
            }


            // 上下左右各10边距
            worksheet.getPageSetup().setLeftMargin(15);
            worksheet.getPageSetup().setTopMargin(15);
            worksheet.getPageSetup().setRightMargin(15);
            worksheet.getPageSetup().setBottomMargin(15);

            // 都设置为A4纸
            worksheet.getPageSetup().setPaperSize(PaperSize.A4);
            // 竖向生成
            worksheet.getPageSetup().setOrientation(PageOrientation.Portrait);

            // 设置页脚的页数
            worksheet.getPageSetup().setCenterFooter("&/&N");

        }
        // 删除新增sheet
        forCalculateSheet.delete();

        // 再转为PDF
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        workbook.save(out, SaveFileFormat.Pdf);
        byte[] contents = out.toByteArray();
        return contents;
    }




public static Double autoFitMergedCells(IWorksheet newWorksheet, IRange mergedcell) {
        // 获取合并单元格的列宽 和 value
        Object value = mergedcell.getValue();
        Double width = mergedcell.getWidthInPixel();

        IRange range = newWorksheet.getRange(mergedcell.getRow(), mergedcell.getColumn());
        // 给新建sheet中非合并单元格设置列宽和value
        range.setValue(value);
        range.setColumnWidthInPixel(width);
        range.getFont().setSize(mergedcell.getFont().getSize());

        //  设置自适应行高,获取新行高,并返回
        range.setWrapText(true);
        range.autoFit();
        return range.getRowHeight();
    }


开始认为是字体大小问题,加了行代码:
range.getFont().setSize(mergedcell.getFont().getSize());

但是没效果,还是遮挡了
image.png645850219.png

gongyi.zip

10.68 KB, 下载次数: 55

11 个回复

倒序浏览
xujie-joe
金牌服务用户   /  发表于:2022-11-7 11:12:46
沙发
打印范围是:A到O列
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-7 15:40:34
板凳
您好,
这边验证下此问题,有结果贴中回复您。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-8 17:15:54
地板
测试过程中注意到该json数据不全,请提供完整的json数据,以便问题的进一步调研。
image.png440013121.png
回复 使用道具 举报
xujie-joe
金牌服务用户   /  发表于:2022-11-8 17:55:13
5#
Lynn.Dou 发表于 2022-11-8 17:15
测试过程中注意到该json数据不全,请提供完整的json数据,以便问题的进一步调研。

如附件

gongyi.zip

14.21 KB, 下载次数: 55

回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-8 18:19:35
6#
测试导出的pdf文件未出现遮挡问题,附件为示例demo,您可以实际测试下。
另,注意到您提供的json文件与前面截图不一致,请检查下是否提供json有误。
image.png68521422.png
为了更快的复现此问题,建议您在附件的demo基础上做修改,可复现后上传贴中这边调研看看。

GcExcel_demo_maven.zip

185.32 KB, 下载次数: 62

回复 使用道具 举报
xujie-joe
金牌服务用户   /  发表于:2022-11-8 18:53:59
7#
Lynn.Dou 发表于 2022-11-8 18:19
测试导出的pdf文件未出现遮挡问题,附件为示例demo,您可以实际测试下。
另,注意到您提供的json文件与前 ...

要把这行代码注释掉,不将字体设置为12号,ssjson里面是多大字体就多大,这样就能复现了

image.png473428039.png
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-9 09:32:11
8#
xujie-joe 发表于 2022-11-8 18:53
要把这行代码注释掉,不将字体设置为12号,ssjson里面是多大字体就多大,这样就能复现了

问题已复现,已将此问题记录下来进一步调研原因,待有进展在贴中回复您。
本贴先做保留处理。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-24 16:15:35
9#
更新进展:
此问题计划在V5.2.5修复,待产品正式发布后会在贴中通知您,届时您可以升级测试下。
回复 使用道具 举报
xujie-joe
金牌服务用户   /  发表于:2022-11-24 16:23:50
10#
Lynn.Dou 发表于 2022-11-24 16:15
更新进展:
此问题计划在V5.2.5修复,待产品正式发布后会在贴中通知您,届时您可以升级测试下。

1:目前我这是写死的15.1.4,这是怎么和V版本对应上的,升版后,会对我这其它产生什么影响吗
image.png895767211.png

2:准备何时发布V5.2.5的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部