当easyExcel创建表的时候,会创建一个临时的存储文件。如果你的的jvm设置了
环境 java.io.tmpdir 的值,(一个路径。这就是你存放临时文件的路径
就会走你设置的路径。
如果你没有手动设置过 jvm默认值会是 null,那么他会有一个默认路径
win:C:\Users\<username>\AppData\Local\Temp
linux:/tmp
而一旦你的运行环境,在/tmp这个文件下没有权限
那么代码执行到创建这个临时文件就会报错。
两种解决办法
一修改这个tmp的文件操作权限。
如果你只有一个服务器的话,这么做也行。
二在代码中临时修改jvm这个参数
public void createAndUploadData(List<?> data,Class<?> aClass,String name){
String currentDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String[] split = name.split("\\.");
String fileName = split[split.length-1]+ "_" + currentDate + ".xlsx";
//工作目录
final String userDirPath = System.getProperty("user.dir");
String directoryPath = userDirPath + File.separator + "dataStatistics";
// 自定义临时目录
String customTempDir = directoryPath + File.separator +"mid";
File directory = new File(directoryPath);
File tempDir = new File(customTempDir);
if (!directory.exists() || !tempDir.exists()) {
directory.mkdirs();
tempDir.mkdirs();
}
//文件创建路径
String filePath = directoryPath + File.separator + fileName;
try {
// 记录原始临时目录
String originalTempDir = System.getProperty("java.io.tmpdir");
log.debug("originalTempDir mid mkdir:{}",originalTempDir);
log.debug("customTempDir mid mkdir:{}",customTempDir);
// 设置自定义临时目录
System.setProperty("java.io.tmpdir", customTempDir);
ExcelWriter excelWriter = EasyExcel.write(filePath, aClass).build();
// 创建一个名为 "Sheet1" 的表
WriteSheet writeSheetOverview = EasyExcel.writerSheet(split[split.length-1]).head(aClass).build();
// 填充数据
excelWriter.write(data, writeSheetOverview);
// 执行操作
excelWriter.close();
//恢复原来的临时目录
System.setProperty("java.io.tmpdir", originalTempDir);
// 获取生成的 Excel 文件
File excelFile = new File(filePath);
InputStreamResource resource = new InputStreamResource(new FileInputStream(excelFile));
// 现在你可以将multipartFile传递给需要处理或上传的地方
log.info("MultipartFile已创建,文件名:" + excelFile.getName());
} catch (Exception e) {
log.error("MultipartFile创建失败,文件名:{}" , fileName,e);
}
}