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
相关推荐
全栈老实人_12 分钟前
考研互学互助系统|Java|SSM|VUE| 前后端分离
java·开发语言·tomcat·maven
天天进步201516 分钟前
Java全栈项目实战:校园报修服务系统
java·开发语言
Themberfue42 分钟前
Java 网络原理 ①-IO多路复用 || 自定义协议 || XML || JSON
xml·java·开发语言·网络·计算机网络·json
wm10431 小时前
JavaEE 3大组件 Listener Servlet Filter
java·servlet·java-ee
疯一样的码农1 小时前
基于Spring Boot + Vue3实现的在线商品竞拍管理系统源码+文档
java·spring boot·后端
Y编程小白2 小时前
SpringBoot的pom.xml文件中,scope标签有几种配置?
xml·spring boot·后端
m0_748251352 小时前
【SpringBoot】日志文件
java·spring boot·spring
m0_748234712 小时前
Java-33 深入浅出 Spring - FactoryBean 和 BeanFactory BeanPostProcessor
java·开发语言·spring
知初~3 小时前
java相关学习文档或网站整理
java·开发语言·学习
码农小灰3 小时前
什么是缓存穿透、缓存击穿、缓存雪崩,在项目中是如何解决和预防?它们分别会带来什么危害?
java·缓存