1.对于非加密excle文件,将文件读成二进制流返回
ServletOutputStream out = null;
FileInputStream in = null;
try {
in = new FileInputStream(new File(path));
//设置文件ContentType类型
response.setContentType("application/vnd.ms-excel");
//设置文件头:最后一个参数是设置下载文件名
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(path, "UTF-8"));
out = response.getOutputStream();
// 读取文件流
int len = 0;
byte[] buffer = new byte[1024 * 10];
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.flush();
}
catch (Exception e) {
logger.error("responseFileStream error:" + e.toString());
} finally {
out.close();
in.close();
}
2.对于加密excle文件,直接读二进制流读不出来,可以用WorkbookFactory读取数据,此方法对于加密不加密excle都可以转成流,但是对于加密文件,返回给前端下载后的文件不需要密码也可以打开
OutputStream os = null;
FileInputStream in = null;
Workbook wb=null;
try {
in = new FileInputStream(new File(emailConfig.getTaxesQueryFilePath()+"/"+path));
//设置文件ContentType类型
response.setContentType("application/vnd.ms-excel");
//设置文件头:最后一个参数是设置下载文件名
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(path, "UTF-8"));
os = response.getOutputStream();
wb = WorkbookFactory.create(in, password);
//调取response对象中的OutputStream对象
wb.write(os);
os.flush();
os.close();
}
catch (Exception e) {
logger.error("excel转流异常" + e);
} finally {
os.close();
in.close();
wb.close();
}
3.对于需要保证安全性的加密文件,需要采用easyExcle将获取文件数据,然后将数据写入response流
//根据地址获取excel表数据
InputStream fis = new FileInputStream(path);
ExcelListener<Map<String,Object>> listener = new ExcelListener<Map<String,Object>>();
ExcelReader excelReader = EasyExcelFactory.read(fis, null, listener).password(password).headRowNumber(0).build();
excelReader.readAll();
List<Map<String,Object>> list = listener.getDatas();
//一定要记得关闭流
excelReader.finish();
//将map类型数据转化为对象
ArrayList<TaskTaxesQuery> taxesQueryList = new ArrayList<>();
for (int i = 1; i < list.size(); i++) {
Map<String, Object> map = list.get(i);
TaskTaxesQuery taskTaxesQuery = new TaskTaxesQuery(
map.get(0).toString(),map.get(1).toString(),map.get(2).toString(),map.get(3).toString(),
map.get(4).toString(),map.get(5).toString(),map.get(6).toString(),map.get(7).toString()
);
taxesQueryList.add(taskTaxesQuery);
}
//将数据写入response返回流
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(path , "UTF-8"));
//构建excelWriter
@Cleanup("finish") ExcelWriter writer = EasyExcel
//将数据映射到TaskTaxesQuery实体类并响应到浏览器
.write(new BufferedOutputStream(response.getOutputStream()),TaskTaxesQuery.class)
//自动关闭输出流
.autoCloseStream(Boolean.TRUE)
//excel版本,强烈建议导出07版excel,因为省内存
.excelType(ExcelTypeEnum.XLS)
//是否需要表头
.needHead(Boolean.TRUE)
//设置excel保护密码
.password(password)
//构建
.build();
//初始化sheet
WriteSheet writeSheet = EasyExcel.writerSheet().build();
writeSheet.setSheetName(path);
//导出excel,注意导出结束要finish
writer.write(taxesQueryList,writeSheet);
版权声明:本文为gkkljy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。