xujie-joe 发表于 2022-11-7 11:11:46

Excel转PDF,字体遮挡(DOCXLS-7005)

本帖最后由 Lynn.Dou 于 2022-11-14 16:26 编辑

之前发过的贴子:

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

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



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 = "$A:$O";

      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("&P/&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());

但是没效果,还是遮挡了

xujie-joe 发表于 2022-11-7 11:12:46

打印范围是:A到O列

Lynn.Dou 发表于 2022-11-7 15:40:34

您好,
这边验证下此问题,有结果贴中回复您。

Lynn.Dou 发表于 2022-11-8 17:15:54

测试过程中注意到该json数据不全,请提供完整的json数据,以便问题的进一步调研。

xujie-joe 发表于 2022-11-8 17:55:13

Lynn.Dou 发表于 2022-11-8 17:15
测试过程中注意到该json数据不全,请提供完整的json数据,以便问题的进一步调研。

如附件

Lynn.Dou 发表于 2022-11-8 18:19:35

测试导出的pdf文件未出现遮挡问题,附件为示例demo,您可以实际测试下。
另,注意到您提供的json文件与前面截图不一致,请检查下是否提供json有误。

为了更快的复现此问题,建议您在附件的demo基础上做修改,可复现后上传贴中这边调研看看。

xujie-joe 发表于 2022-11-8 18:53:59

Lynn.Dou 发表于 2022-11-8 18:19
测试导出的pdf文件未出现遮挡问题,附件为示例demo,您可以实际测试下。
另,注意到您提供的json文件与前 ...

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


Lynn.Dou 发表于 2022-11-9 09:32:11

xujie-joe 发表于 2022-11-8 18:53
要把这行代码注释掉,不将字体设置为12号,ssjson里面是多大字体就多大,这样就能复现了

问题已复现,已将此问题记录下来进一步调研原因,待有进展在贴中回复您。
本贴先做保留处理。

Lynn.Dou 发表于 2022-11-24 16:15:35

更新进展:
此问题计划在V5.2.5修复,待产品正式发布后会在贴中通知您,届时您可以升级测试下。

xujie-joe 发表于 2022-11-24 16:23:50

Lynn.Dou 发表于 2022-11-24 16:15
更新进展:
此问题计划在V5.2.5修复,待产品正式发布后会在贴中通知您,届时您可以升级测试下。

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


2:准备何时发布V5.2.5的
页: [1] 2
查看完整版本: Excel转PDF,字体遮挡(DOCXLS-7005)