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
相关推荐
SHUIPING_YANG几秒前
根据用户id自动切换表查询
java·服务器·数据库
爱吃烤鸡翅的酸菜鱼13 分钟前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
惊涛骇浪、19 分钟前
SpringMVC + Tomcat10
java·tomcat·springmvc
墨染点香32 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
ldj20201 小时前
SpringBoot为什么使用new RuntimeException() 来获取调用栈?
java·spring boot·后端
超龄超能程序猿1 小时前
Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践
java·spring boot·后端·spring·spring cloud
风象南1 小时前
SpringBoot配置属性热更新的轻量级实现
java·spring boot·后端
洛阳泰山1 小时前
Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解
java·spring boot·后端·nacos
Y4090011 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
YuTaoShao1 小时前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先