这里导出excel用到的是 阿里巴巴的easyexcel
1、首先导入依赖
<!--alibaba easyexcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version>
</dependency>
2、对需要导出的实体类加注解
@ExcelProperty("商品编号")
private Integer id;
@ExcelProperty("商品名称")
private String name;
@ExcelProperty("商品价格")
private Float price;
@ExcelProperty("商品购买数量")
private Integer buynum;
@ExcelProperty("商品库存")
private Integer num;
3、下载接口
- 准备一个List格式的数据。
- 将响应数据设置为excel格式。
- 写入数据。Easyexcle提供了API供用户使用,只需要一行代码就能够将List列表转化为Excel文件。write方法指定输出流和写入数据的class对象;sheet方法指定excel的sheet名称;doWrite则指定写入的列表数据。
@GetMapping("/download")
public void download(HttpServletResponse response) {try {// 准备数据List<GoodsDo> Goodslist = new ArrayList<>(10);for (int i = 0; i < 10; i++) {GoodsDo s = new GoodsDo();s.setId(i * 10 + 1);s.setName("name" + i);s.setBuynum(i);s.setNum(20+i);s.setPrice(2.11+i);Goodslist.add(s);}// 设置响应response.setContentType("application/vnd.excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("file", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 写入数据EasyExcel.write(response.getOutputStream(), GoodsDo.class).sheet("sheet1").doWrite(Goodslist);} catch (Exception e) {e.printStackTrace();}
}
访问http://localhost:8081/easyexcel/doenload下载excel
写入
1、指定写入
@ExcelProperty(value="主标题",index=0)
可用index指定写入哪一列
2、合并列(参照商品编号和商品名)
@ExcelProperty({"主标题","商品编号"})
private Integer id;
@ExcelProperty({"主标题","商品名称"})
private String name;
@ExcelProperty("商品价格")
private Double price;
@ExcelProperty("商品购买数量")
private Integer buynum;
@ExcelProperty("商品库存")
private Integer num;
3、格式转换
给实体类加注解
//格式转换为xx年xx月xx时xx分xx秒
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
@ExcelProperty("日期标题")
private Date date;
//给每个数字后边加%
@NumberFormat("#.##%")
@ExcelProperty(value = "数字标题")
private Double doubleData;
4、重复写(写到单个或多个sheet)
1、 写到同一个sheet,只创建一次sheet
String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
// 这里需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {// 这里注意 如果同一个sheet只要创建一次WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来for (int i = 0; i < 5; i++) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);}
}
2、写到不同sheet,把创建sheet语句放到循环里,且sheetNo要变化
fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";// 这里指定文件try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面for (int i = 0; i < 5; i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);}}
3、写到不同sheet,但是是不同对象。
fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";// 这里 指定文件try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面for (int i = 0; i < 5; i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class可以每次都变// 实际上可以一直变WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);}}