pom依赖导入
<!--easypoi-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
方法实现
package com.example.mybatismysql8demo.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class GoodsExportExcel implements Serializable {
@Excel(name = "商品名称",width = 30)
private String goodsName;
@Excel(name = "价格",width = 30)
private BigDecimal price;
@Excel(name = "数量",width = 30)
private Integer num;
public GoodsExportExcel(String goodsName, BigDecimal price, Integer num) {
this.goodsName = goodsName;
this.price = price;
this.num = num;
}
}
package com.example.mybatismysql8demo.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.example.mybatismysql8demo.config.ExcelExportStyler;
import com.example.mybatismysql8demo.vo.GoodsExportExcel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@RestController
public class EasypoiController {
@PostMapping("/batchExport")
public void batchExport(HttpServletResponse response){
//每种水果导一张excel
List<GoodsExportExcel> goodsExportExcels = new ArrayList<>();
goodsExportExcels.add(new GoodsExportExcel("苹果",new BigDecimal(10),11));
goodsExportExcels.add(new GoodsExportExcel("苹果",new BigDecimal(14),6));
goodsExportExcels.add(new GoodsExportExcel("香蕉",new BigDecimal(8),12));
goodsExportExcels.add(new GoodsExportExcel("香蕉",new BigDecimal(13),20));
//按照水果名称分组
Map<String, List<GoodsExportExcel>> nameMap = goodsExportExcels.stream().collect(Collectors.groupingBy(GoodsExportExcel::getGoodsName));
//批量导出
exportZip(response, GoodsExportExcel.class, new HashMap<>(nameMap),"水果信息","水果信息导出");
}
public void exportZip(HttpServletResponse response,Class<?> cls,Map<String,List<?>> exportList,String sheet,String fileName) {
try {
response.setContentType("application/octet-stream");
// 表示不能用浏览器直接打开
response.setHeader("Connection", "close");
// 告诉客户端允许断点续传多线程连接下载
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".zip").getBytes("GB2312") , "ISO8859-1"));
response.setCharacterEncoding("UTF-8");
OutputStream out = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(out);
//循环导出
for (Map.Entry<String,List<?>> map : exportList.entrySet()) {
//导出的文件名称
String entryName = map.getKey() + ".xlsx";
List<?> data = map.getValue();
ZipEntry entry = new ZipEntry(entryName);
//设置sheet名
ExportParams params = new ExportParams();
params.setSheetName(sheet);
//全局样式
params.setStyle(ExcelExportStyler.class);
//文件格式
params.setType(ExcelType.HSSF);
//easypoi导出excel文件
Workbook workbook = ExcelExportUtil.exportExcel(params, cls, data);
//编写新的zip条目,并将流定位到条目数据的开头
zos.putNextEntry(entry);
//workBook.write会指定关闭数据流,直接用workbook.write(zos),下次就会抛出zos已被关闭的异常,所以用ByteArrayOutputStream来拷贝一下。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//workbook写入bos
workbook.write(bos);
//bos写入zos
bos.writeTo(zos);
zos.closeEntry();
}
if(zos != null) {
zos.flush();
zos.close();
}
} catch (Exception e) {
System.out.println("错误信息:"+e.getMessage());
}
}
}
结果打印