在生产环境上导出出现报错的问题,初步排查日志,发现是
java.io.IOException: No such file ordirectory
然后查看poi导出源码:发现下面一段逻辑
@Override
public File createTempFile(String prefix, String suffix) throws IOException {
// Identify and create our temp dir, if needed
// 创建临时目录用于存放文件
if (dir == null)
{
dir = new File(System.getProperty("java.io.tmpdir"), "poifiles");
dir.mkdir();
if (System.getProperty("poi.keep.tmp.files") == null)
dir.deleteOnExit();
}
// Generate a unique new filename
File newFile = File.createTempFile(prefix, suffix, dir);
// Set the delete on exit flag, unless explicitly disabled
if (System.getProperty("poi.keep.tmp.files") == null)
newFile.deleteOnExit();
// All done
return newFile;
}
从代码逻辑中可以看到,创建的临时文件在{java.io.tmpdir}/poifiles 目录下
我们没有改变java.io.tmpdir的默认值,故默认/tmp。 故excel依赖的临时目录为/tmp/poifiles,而且此目录只有第一次使用时创建。后续linux服务器自动清理了一次/tmp目录,把/tmp/poifiles目录删除了。导致找不到依赖的临时目录。
windows下:AppData\Local\Temp\poifiles文件夹下,生成一个叫poi-sxssf-sheet**************的文件
Linux系统下:会在/tmp/poifiles文件下生成该临时文件
解决问题 改变目录,或者手动创建目录