记录:easyexcel模板full导出数据本地电脑成功liunx环境失败

在使用复杂的excel模板导出数据时,类似复杂的报告,花样的表头,多个工作区间,在使用easyexcel的full填充时遇到本地调试成功,当相同的代码发布的Linux环境,在相同参数的情况下,没有任何错误日志输出,却填充失败。

实现的代码

 /**
     * 
     * @param onceAbsoluteMergeStrategies 自定义的合并单元格策略
     * @param fileStyleTemplate excel模板文件
     * @param values 填充的值
     * @param response http输出
     * @throws IOException IO异常
     */
 private void writeExcel(List<OnceAbsoluteMergeStrategy> onceAbsoluteMergeStrategies, File fileStyleTemplate, List<Map<String, Object>> values, HttpServletResponse response) throws IOException {

        log.info(">>>>>>>>> report values : [{}] <<<<<<<<<<<<<<<",JSONObject.toJSONString(values));

        ExcelWriter excelWriter = null;
        try {

            String excelFileName = "report" + System.currentTimeMillis();

            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");

            String fileName = URLEncoder.encode(excelFileName, "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");

            ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream())
                    .withTemplate(fileStyleTemplateForGresb).excelType(ExcelTypeEnum.XLS);
            if (CollectionUtil.isNotEmpty(onceAbsoluteMergeStrategies)) {
                for (OnceAbsoluteMergeStrategy strategy : onceAbsoluteMergeStrategies) {
                    excelWriterBuilder.registerWriteHandler(strategy);
                }
            }
            excelWriter = excelWriterBuilder.build();
            WriteSheet writeSheet1 = excelWriterBuilder.sheet("sheet1").build();
            excelWriter.fill(values, writeSheet1);
            WriteSheet writeSheet2 = excelWriterBuilder.sheet("sheet2").build();
            excelWriter.fill(values, writeSheet2);
            WriteSheet writeSheet3 = excelWriterBuilder.sheet("sheet3").build();
            excelWriter.fill(values, writeSheet3);
            WriteSheet writeSheet4 = excelWriterBuilder.sheet("sheet4").build();
            excelWriter.fill(values, writeSheet4);

        } catch (Exception e) {
            log.error(">>>>生成报告失败<<<<", e);
            throw new BizException(BizExCodeEnum.SERVICE_ERROR);
        } finally {
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }

对比了两个环境的差异,首先排除了可能是网关转发导致的原因,查询线上大家遇到的情况,定位到可能是由于两侧的环境不同引起的。
结合官方文档的这段话,判断可能是由于字体不存在导致的。
记录:easyexcel模板full导出数据本地电脑成功liunx环境失败_第1张图片
上到Linx服务器,用命令 fc-list查看已有的字体,模板中确实不存在。
调整了模板中的所有字体为“宋体”,再次尝试导出,{.xxxx} 被成功填入想要的值,判断确实是由于字体缺失引起的。
解决方案:
1.调整excel模板的字体为linux系统中有的字体
2.在linux上安装需要的字体

补充《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《〈《
改了字体以后 还是会出现不太稳定,时好时坏的情况,将日志调整成debug模式,对比发现失败的时候日志中出现多次打印 finsh,大概是.fill() 会自动关闭。
记录:easyexcel模板full导出数据本地电脑成功liunx环境失败_第2张图片
由于时间问题,目前已经放弃了easy- Excel,直接使用poi实现。

你可能感兴趣的:(java)