官方文档:https://www.yuque.com/easyexcel/doc/fill
其实参考官网文档已经可以正常使用了,这里主要是记录如何在模板中填充图片
请求参数
注意:sheetNo 能帮助我们定位数据是哪个sheet
{
"fileId": 804,
"data": [
{
"sheetNo": 0,
"content": "简单说明",
"test_image": 907,
"test2_image": 908
},
{
"sheetNo": 1,
"name": "名称"
}
]
}
解析页面表单
/**
* 解析页面表单,根据Map填充
*
* @param map
* @return
*/
@Override
public AjaxResult parse(Map<String, Object> map) {
// 1. 获取前端的传值 -> cn.hutool.json
Map<String, Object> jsonMap = JSONUtil.parseObj(map);
// 1.1 获得 fileId 数据
// 这里理论上直接传 fileId 即可,即可找到模板对应的文件
Integer fileId = (Integer) jsonMap.get(FORM_FILE_ID);
// 2. 根据 fileId 查库
MyFile myFile = fileService.selectFileById(Long.valueOf(fileId));
// 2.1 检查一波
if (ObjectUtil.isNull(myFile)) {
return AjaxResult.error();
}
// 3. 获取模板文件位置
String templateFilePath = myFile.getPath();
// 3.1 检查一波
if (!FileUtils.checkAllowDownload(templateFilePath)) {
return AjaxResult.error("资源文件非法,不允许下载。");
}
// 4. 获取 data 数据 -> cn.hutool.json
JSONArray dataArray = (JSONArray) jsonMap.get(FORM_DATA);
// 5. 返回新文件路径信息
Map<String, String> newFilePathMap = getNewFilePath(myFile.getSuffix());
// 6. 生成文件
genFileByTemplate(newFilePathMap.get(FILE_NEW_FILE_DOWNLOAD_PATH),
getTemplatePath(templateFilePath).get(FILE_TEMPLATE_DOWNLOAD_PATH),
dataArray);
// 7. 写库返回数据
AjaxResult ajaxResult = insertFile(myFile, newFilePathMap.get(FILE_NEW_FILE_PATH));
// 8. 保存测试数据
this.insertTemplate(Long.valueOf(fileId), (Long) ajaxResult.get("id"), JSONUtil.parseObj(map).toString());
return ajaxResult;
}
生成文件方法
/**
* 生成文件
*
* @param newFileDownloadPath 新文件路径
* @param templateDownloadPath 模板文件路径
* @param dataArray 数据数组
*/
private void genFileByTemplate(String newFileDownloadPath, String templateDownloadPath, JSONArray dataArray) {
// 先检查一波
this.checkPathExists(newFileDownloadPath);
// 参考官网即可
ExcelWriter excelWriter = EasyExcel.write(newFileDownloadPath).withTemplate(templateDownloadPath).build();
// 遍历map
for (Object obj : dataArray) {
Map<String, Object> param = new JSONObject(obj).toBean(Map.class);
// 获取sheetNo
Integer sheetNo = (Integer) param.get(SHEET_NO);
log.debug("sheetNo: " + sheetNo);
// 特殊处理方法
tickHandleByParam(param);
imageHandleByParam(param);
// 多sheet填充
// sheetNo 的作用在这里!!
WriteSheet writeSheet = EasyExcel.writerSheet(sheetNo).build();
try {
excelWriter.fill(param, writeSheet);
} catch (Exception e) {
e.printStackTrace();
// 文件已经生成,但是空的,删除它
this.deleteFile(newFileDownloadPath);
throw new MyException("请检查sheetNo是否配置正确");
}
}
excelWriter.finish();
}
处理图片方法
/**
* 图片处理
*
* @param param
*/
private void imageHandleByParam(Map<String, Object> param) {
for (Map.Entry<String, Object> entry : param.entrySet()) {
try {
String mapKey = entry.getKey();
if (mapKey.contains(CONTAIN_IMAGE_KEY)) {
// 文件id
Integer fileId = (Integer) entry.getValue();
MyFile myFile = fileService.selectFileById(Long.valueOf(fileId));
if (ObjectUtil.isNull(myFile)) {
continue;
}
// 本地资源路径
String localPath = Config.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(myFile.getPath(), Constants.RESOURCE_PREFIX);
// 填充图片
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(new File(downloadPath));
// 图片后缀格式
String suffix = file.getSuffix();
ImageIO.write(bufferImg, suffix, byteArrayOut);
bufferImg.flush();
// 注意:这里需要put回原来的key里
param.put(mapKey, byteArrayOut.toByteArray());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}