需求
需要将指定数据导出成表格样式的图片,如图
业务拆解
- 定义一个导出模板
- 将得到的数据填入模板中,生成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();//写入到sheetWriteSheet 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