java实现excel打压缩包下载
最近做了这个功能的需求,总结一下,实现这个功能步骤为三步。
1.设置HTTP协议的响应头
Http协议的请求被封装在了HttpServletRequest里面,而响应则被封装在了HttpServletResponse,不管使用的是什么框架spring mvc还是自己公司封装的框架,都要先拿出response。
response.setHeader("Content-Type","application/octect-stream");
response.setHeader("Content-Disposition","attachment;filename=test.zip");
告诉浏览器,要传输二进制流文件,和文件名,响应结果,chrome浏览器利用审查的network,查看响应头是否设置成功。
2.拿到response的输出流,初始化ZipOutputStream
初始化ZipOutputStream的时候需要传入一个OutputStream,此时我们将response的OutputStream作为形参传给ZipOutputStream(这个OutputStream能够写HTTP响应的实体内容)
OutputStream outputStream = response.getOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(outputStream);
// 设置注释
zipOut.setComment("welcome to here to look look");
想要压缩包里面有多个excel文件的话就向Zipout里面添加多个ZipEntry,设置的注释就是这个
byte[] buffer = new byte[5*1024];
int length = 0;
for (int j = 0; j < data.size(); j++) {
List list = data.get(j);
String fileName = "test"+j+".xls";
zipOut.putNextEntry(new ZipEntry(fileName));
InputStream inputStream = createExcel(list);
while ((length = inputStream.read(buffer)) != -1) {
zipOut.write(buffer,0,length);
}
inputStream.close();
}
zipOut.close();
这里的data是一个List<List<Map>> ,装的数据就是想写进excel里面的数据。createExcel() 这函数就是我们的第三步了。
3.这一步主要是创建excel的实体,和输出流转输入流。
public InputStream createExcel(List list) throws Exception{
//第一步创建workbook
HSSFWorkbook wb = new HSSFWorkbook();
//第二步创建sheet
HSSFSheet sheet = wb.createSheet("表1");
HSSFSheet sheet2 = wb.createSheet("表2");
HSSFSheet sheet3 = wb.createSheet("表3");
//第三步创建行row:添加表头0行(表1)
HSSFRow row = sheet.createRow(0);
HSSFCellStyle style = wb.createCellStyle();
//第四步创建单元格
HSSFCell cell = row.createCell(0); //第一个单元格
cell.setCellValue("编号");
cell.setCellStyle(style);
.....
//第五步插入数据
List list1 = result.get(0);
for (int i = 0; i < list1.size(); i++) {
//创建行
row = sheet.createRow(i+1);
//创建单元格并且添加数据
row.createCell(0).setCellValue(list1.get(i).getAt("id"));
.....
}
// 重复以上操作给余下的sheet添加表头和数据
....
//第六步将生成excel转化为输入流返回
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
wb.write(outputStream);
ByteArrayInputStream swapStream = new ByteArrayInputStream(outputStream.toByteArray());
return swapStream;
} catch (IOException e) {
e.printStackTrace();
}
}
表1、表2、表3就是excel里面的这个
然后就没有然后了,前端直接请求就行了。