生成单个Excel并下载
基本流程就是
- 从数据库读取需要导出的数据,这里我们假设待导出数据为:
List exportDataList = new ArrayList()
- 以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("第二列内容");
...
}
- 利用输出流返回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并打包下载思路如下:
- 生成单个Excel对象如上所示,基本一样,只不过为了将每个Excel对象对应的文件名保存下来,这里用到了Map
//具体到单个workbook生成操作,可以参照上面代码
Map<String, XSSFWorkbook> workbookMap = generateWorkbook();
- 返回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文件暂存到本地,网上资料很多,不在赘述。