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

需求

需要将指定数据导出成表格样式的图片,如图

业务拆解

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

代码实现

需要引入的依赖

java 复制代码
	  <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文件引入以下代码

java 复制代码
 <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导出
 */
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 ,更多操作见官方文档

java 复制代码
//加载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 文件目录下获取字体。
  2. 服务器中新建字体存放文件夹
java 复制代码
mkdir /usr/share/fonts/chinese
  1. 将window中的字体移动到服务器
  2. 设置访问权限
java 复制代码
chmod -R 777 /usr/share/fonts/chinese
  1. 建立字体缓存
java 复制代码
//字体扩展
mkfontscale
//新增字体目录
mkfontdir
//刷新缓存
fc-cache -fv
  1. 重启服务
java 复制代码
reboot
相关推荐
a程序小傲12 小时前
蚂蚁Java面试被问:注解的工作原理及如何自定义注解
java·开发语言·python·面试
幽络源小助理12 小时前
SpringBoot+Vue摄影师分享社区源码 – Java项目免费下载 | 幽络源
java·vue.js·spring boot
0和1的舞者12 小时前
《软件测试分类指南:8 大维度 + 核心要点梳理》
java·软件测试·单元测试·测试·黑盒测试·白盒测试·测试分类
TAEHENGV13 小时前
创建目标模块 Cordova 与 OpenHarmony 混合开发实战
android·java·开发语言
是一个Bug13 小时前
如何阅读JDK源码?
java·开发语言
+VX:Fegn089513 小时前
计算机毕业设计|基于springboot + vue健身房管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Ledison713 小时前
Springboot 3.5.7 + Springcloud 2025 升级记录
java
没有bug.的程序员13 小时前
熔断、降级、限流:高可用架构的三道防线
java·网络·jvm·微服务·架构·熔断·服务注册
派大鑫wink13 小时前
【Day15】集合框架(三):Map 接口(HashMap 底层原理 + 实战)
java·开发语言
苹果醋313 小时前
iview— Select— Option选中后有空格
运维·vue.js·spring boot·nginx·课程设计