这里导出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);
}
}