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
相关推荐
ChinaRainbowSea5 分钟前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
KiddoStone14 分钟前
多实例schedule job同步数据流的数据一致性设计和实现方案
java
岁忧35 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao39 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干2 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
春生野草3 小时前
关于SpringMVC的整理
spring
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq