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());
但是没效果,还是遮挡了
打印范围是:A到O列 您好,
这边验证下此问题,有结果贴中回复您。 测试过程中注意到该json数据不全,请提供完整的json数据,以便问题的进一步调研。
Lynn.Dou 发表于 2022-11-8 17:15
测试过程中注意到该json数据不全,请提供完整的json数据,以便问题的进一步调研。
如附件
测试导出的pdf文件未出现遮挡问题,附件为示例demo,您可以实际测试下。
另,注意到您提供的json文件与前面截图不一致,请检查下是否提供json有误。
为了更快的复现此问题,建议您在附件的demo基础上做修改,可复现后上传贴中这边调研看看。
Lynn.Dou 发表于 2022-11-8 18:19
测试导出的pdf文件未出现遮挡问题,附件为示例demo,您可以实际测试下。
另,注意到您提供的json文件与前 ...
要把这行代码注释掉,不将字体设置为12号,ssjson里面是多大字体就多大,这样就能复现了
xujie-joe 发表于 2022-11-8 18:53
要把这行代码注释掉,不将字体设置为12号,ssjson里面是多大字体就多大,这样就能复现了
问题已复现,已将此问题记录下来进一步调研原因,待有进展在贴中回复您。
本贴先做保留处理。 更新进展:
此问题计划在V5.2.5修复,待产品正式发布后会在贴中通知您,届时您可以升级测试下。 Lynn.Dou 发表于 2022-11-24 16:15
更新进展:
此问题计划在V5.2.5修复,待产品正式发布后会在贴中通知您,届时您可以升级测试下。
1:目前我这是写死的15.1.4,这是怎么和V版本对应上的,升版后,会对我这其它产生什么影响吗
2:准备何时发布V5.2.5的
页:
[1]
2