Java根据模板文件生成excel文件,同时将excel文件转换成图片

需求

需要将指定数据导出成表格样式的图片,如图
Java根据模板文件生成excel文件,同时将excel文件转换成图片_第1张图片

业务拆解

  1. 定义一个导出模板
  2. 将得到的数据填入模板中,生成excel文件
  3. 将ecxel文件转换成png格式的图片

代码实现

需要引入的依赖

	  <dependency>
          <groupId>cn.hutool</groupId>
          <artifactId>hutool-all</artifactId>
          <version>5.7.10</version>
      </dependency>
     <dependency>
      	<groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.3.0</version>
    </dependency>
   <dependency>
   	    <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>5.1.0</version>
   </dependency>

如果spire.xls.free下载不下来,需在pom文件引入以下代码

 <repositories>
     <repository>
          <id>com.e-iceblue</id>
          <name>e-iceblue</name>
          <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
      </repository>
  </repositories>

1、定义导出模板

新建如下图excel文件的模板文件(建议xls格式,方便后面转成图片)
在这里插入图片描述

2、将得到的数据填入模板中,生成excel文件

这部分代码主要引用的easyexcel,更多操作见官方文档
存放路径如下:
Java根据模板文件生成excel文件,同时将excel文件转换成图片_第2张图片

/**
 * 模板excel导出
 */
public class TemplateExcelUtil {

    /**
     * 根据模板文件导出excel数据,param格式如下:
     * {
     * "dateTitle":"",
     * "rightDate":"",
     * "relatedPeoples":"",
     * "list":[
     *    {
     *      "projectCode":"",
     *      "projectName":"",
     *      "driverName":"",
     *      "licensePlateCode":"",
     *      "startMileage":"",
     *      "endMileage":""
     *      "diffMileage":""
     *      "setOutDay":""
     *      "setOutTime":""
     *      "remarks":""
     *      "projectPlanUsers":""
     *    }
     *  ]
     * }
     *
     * @param templateFileName 模板文件名
     * @param param            传入参数
     * @param filePath         导出文件名路径
     */
    public static void exportDataForTemplateExcel(String templateFileName, Map<String, Object> param, String filePath) {
        //我把模板文件放到了resource下面了,所以读取resource下的模板文件 && 这里也可以是从服务器获取到的文件
        InputStream inputStream = ResourceUtil.getResourceObj("templates/" + templateFileName).getStream();
        File file = new File(filePath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                throw new ServiceException("文件创建失败");
            }
        }

        //设置创建行的方式
        //纵向换行
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        ExcelWriter excelWriter = EasyExcel.write(file).withTemplate(inputStream).build();
        //写入到sheet
        WriteSheet oneSheet = EasyExcel.writerSheet(0).build();
        //填充
        excelWriter.fill(param,oneSheet);
        //填充数组
        List<Map<String,Object>> list = (List<Map<String,Object>>)param.get("list");
        excelWriter.fill( list ,fillConfig, oneSheet);
        excelWriter.close();
    }

}

3、将ecxel文件转换成png格式的图片

该部分主要引用spire.xls.free,更多操作见官方文档

//加载Excel工作表
Workbook wb = new Workbook();
wb.loadFromFile(filePath);
//获取工作表
Worksheet sheet = wb.getWorksheets().get(0);
//调用方法将Excel工作表保存为图片
String imagePath = "D:/temporary.png";
sheet.saveToImage(imagePath);

坑点:
如果在window中正常,但是部署到服务器导出时,出现下面这种情况,则是因为服务器缺少对应的字体
在这里插入图片描述

将字体导入到服务器

  1. window电脑中的C:\Windows\Fonts文件目录下获取字体。
    Java根据模板文件生成excel文件,同时将excel文件转换成图片_第3张图片
  2. 服务器中新建字体存放文件夹
mkdir /usr/share/fonts/chinese
  1. 将window中的字体移动到服务器
    Java根据模板文件生成excel文件,同时将excel文件转换成图片_第4张图片
  2. 设置访问权限
chmod -R 777 /usr/share/fonts/chinese
  1. 建立字体缓存
//字体扩展
mkfontscale
//新增字体目录
mkfontdir
//刷新缓存
fc-cache -fv
  1. 重启服务
reboot

你可能感兴趣的:(日常工作总结,edge,java,spring,maven,spring,boot)