需求
需要将指定数据导出成表格样式的图片,如图
业务拆解
- 定义一个导出模板
- 将得到的数据填入模板中,生成excel文件
- 将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,更多操作见官方文档
存放路径如下:
/**
* 模板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中正常,但是部署到服务器导出时,出现下面这种情况,则是因为服务器缺少对应的字体
将字体导入到服务器
- 在window电脑中的C:\Windows\Fonts文件目录下获取字体。
- 在服务器中新建字体存放文件夹
mkdir /usr/share/fonts/chinese
- 将window中的字体移动到服务器
- 设置访问权限
chmod -R 777 /usr/share/fonts/chinese
- 建立字体缓存
//字体扩展
mkfontscale
//新增字体目录
mkfontdir
//刷新缓存
fc-cache -fv
- 重启服务
reboot