import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import java.io.*;
import java.net.URLEncoder;
import java.util.List;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.formula.functions.T;
public class EasyExcelUtil {
//报表导出处理
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void toExcle(HttpServletResponse response,List listdata,String filename,Class clazz) {
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String name = URLEncoder.encode(filename, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''"+name+".xlsx");
//获取输出流
ServletOutputStream outputStream= response.getOutputStream();
//获取工作簿对象
ExcelWriter excelWriter = EasyExcel.write(outputStream, clazz).build();
//获取工作表数量
Integer sheetnum=1;
//集合大小
int size = listdata.size();
//这里控制每个工作簿一百万条数据
if ( size <1000000) {
sheetnum=1;
}else {
sheetnum= size %1000000==0 ? size /1000000 : size /1000000+1;
}
// 去调用写入,这里我调用了sheetnum次,实际使用时根据数据库分页的总的页数来。这里最终会写到sheetnum个sheet里面
List<T> subList =null;
for (int i = 0; i < sheetnum; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo
WriteSheet writeSheet = EasyExcel.writerSheet(i,filename+i).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
subList = listdata.subList(i*1000000,i==sheetnum-1 ? size : (i+1)*1000000);
excelWriter.write(subList, writeSheet);
}
//finish 会帮忙关闭流
excelWriter.finish();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是封装的excle工具 直接CV就好,需要下载alibabad的依赖
<!--easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
HttpServletResponse resp = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse();
使用的时候要在请求里面获取resp ,包是自带的不用别的依赖
EasyExcelUtil.toExcle(resp, voList, "用户列表", AccountInfoUploadVo.class);
list就是要导出的列表 ,可以从数据库查询之后进行操作 在导出
第三个参数是导出报表的名称
第4个是映射的实体类 就是List里面存的类型
@ExcelProperty("钱包地址")
private String address;
/**
* 帐户余额
*/
@ExcelIgnore
private BigDecimal money
ExcelIgnore 这个注解是忽略导出
ExcelProperty 这个注解是导出字段的中文