说一下这个功能,首先导出excel这个功能都做n次了,就简书上我都写了两三篇笔记了,但是这次有点小区别,因为据说小程序直接用输出流的形式导出excel文件会打不开,改名字,乱码等等一系列的问题。

当然,作为一个前端渣咱也不敢说,咱也不敢问。反正说是这个方式不能实现就换成能实现的,经过考虑决定实现的方式变成:

把需要的数据以xls文件的格式写到服务器上,然後把访问路径返回给前端。

前端通过这个路径下载文件,

下载成功后触发回调,告诉我这个文件可以删除了。

其实我这里说了三步,代码就是两个方法:

一个按要求把数据写成文件存在本地,返回文件访问路径。

删除指定名称的文件。

具体的代码实现如下:

将数据以文件的形式写入到本地的某个文件夹下,并且把文件名称返回前端(因为访问路径是死的,所以这里只返回文件名称就行)

@Override
public R excelOut(List list,HttpServletResponse response) {
try {
// excel文件名
String fileName = "excelOut" + no + DateUtils.format(new Date()) + ".xls";
// 创建HSSFWorkbook,别问我list哪来的,我哪知道你数据哪来的
HSSFWorkbook wb = PoiUtil.getHSSFWorkbook(list);
//存到本地
File excelFile = new File("D:\\monitor\\"+fileName);
if(!excelFile.exists()) excelFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(excelFile);
//写内容,xls文件已经可以打开
wb.write(fOut);
//刷新缓冲区
fOut.flush();
//关闭
fOut.close();
return R.ok().put("data", fileName);
} catch (Exception e) {
System.err.println(e);
return R.error();
}
}
删除前端缓存完的文件。因为这个逻辑清楚明了,所以比较简单的逻辑。
@Override
public R delFile(String name) {
File file = new File("D:\\monitor\\"+name);
file.delete();
return R.ok();
}

至此这个功能就实现了,其实一点也不复杂,几乎也没啥难度,新手都会的两个io操作,但是这里记录主要是为了思路。其实说起来也没多难,但是当直接导出excel无法实现,能做的也就是转换思路。有时候实现的方式比实现本身更有价值。