欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

后端生成excel并下载的代码摘要

程序员文章站 2024-03-20 17:32:10
...

生成单个Excel并下载

基本流程就是

  1. 从数据库读取需要导出的数据,这里我们假设待导出数据为: List exportDataList = new ArrayList()
  2. 以Excel2007为例,将exportDataList生成为excel对
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet();
//设置表头,即Excel第一行
XSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("标题1");
row.createCell(1).setCellValue("标题2");
...
//填充数据到excel对象中
for(Object data : exportDataList) {
    //获取当前excel对象最后一行的行号
    int lastRowNum = sheet.getLastRowNum();
    XSSFRow row = sheet.createRow(lastRowNum+1);
    row.createCell(0).setCellValue("第一列内容");
    row.createCell(1).setCellValue("第二列内容");
    ...
}
  1. 利用输出流返回Excel,前端开始下载
//获取HttpServletResponse
HttpServletResponse response = ...
//设置响应编码
response.setCharacterEncoding("UTF-8");
//设置对应的contentType
response.setContentType("application/x-download;charset=UTF-8");
//设置响应header,如果文件名有汉字,需要对其进行url编码
response.setHeader( "Content-Disposition", "attachment;filename="  + URLEncoder.encode(fileName, "UTF-8"));
//将前面生成的excel对象写入到输出流中
OutputStream os = response.getOutputStream();
workbook.write(os);
os.flush();
//关闭流
...

生成多个Excel打包下载

上面是单个Excel文件的下载实现思路,但有时候,生成的Excel很大,或者其他原因需要一次下载多个Excel,这时就需要将待下载的Excel先进行压缩打包,再提供下载。
临时生成多个Excel并打包下载思路如下:

  1. 生成单个Excel对象如上所示,基本一样,只不过为了将每个Excel对象对应的文件名保存下来,这里用到了Map
//具体到单个workbook生成操作,可以参照上面代码
Map<String, XSSFWorkbook> workbookMap = generateWorkbook();
  1. 返回excel对象,前端开始下载
//获取HttpServletResponse
HttpServletResponse response = ...
//设置响应编码
response.setCharacterEncoding("UTF-8");
//设置对应的contentType, 注意这里和上面的不同
response.setContentType("application/octet-stream;charset=UTF-8");
//设置响应header,如果文件名有汉字,需要对其进行url编码;这里设置的是zip文件的名字
response.setHeader( "Content-Disposition", "attachment;filename="  + URLEncoder.encode(fileName, "UTF-8"));

//将前面生成的excel对象写入到输出流中
OutputStream os = response.getOutputStream();
//封装为相应的输出流
ZipOutputStream out = new ZipOutputStream(os);
//将各个excel对象加入到zip输出流中
for (Map.Entry<String, XSSFWorkbook> entry : workbookMap.entrySet()) {
    String fileName = entry.getKey() + ".xlsx";
    out.putNextEntry(new ZipEntry(fileName));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    entry.getValue().write(baos);
    out.write(baos.toByteArray());
    out.closeEntry();
    if (baos != null) {
        baos.close();
    }
}
out.flush();
//关闭流
...

还有一种写法,是将多个excel分别生成临时excel文件暂存到本地,网上资料很多,不在赘述。