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里面的这个
在这里插入图片描述

然后就没有然后了,前端直接请求就行了。

猜你喜欢

转载自blog.csdn.net/qq_35986866/article/details/83575271