目录
一、导入easyExcel的依赖
<!--阿里easyExcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.3</version>
</dependency>
二、构建导出的实体类
实体类属性要记得加注解
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* excel
*
* @author yunyan
* @date 2023/5/26
*/
@Data
public class ExcelDO {
@ExcelProperty("商品编号")
private Integer id;
@ExcelProperty("商品名称")
private String name;
@ExcelProperty("商品价格")
private Float price;
@ExcelProperty("商品购买数量")
private Integer buyNum;
@ExcelProperty("商品库存")
private Integer num;
}
三、下载接口
- 准备一个List格式的数据。
- 将响应数据设置为excel格式。
- 写入数据。Easyexcle提供了API供用户使用,只需要一行代码就能够将List列表转化为Excel文件。write方法指定输出流和写入数据的class对象; sheet方法指定excel的sheet名称; doWrite则指定写入的列表数据。
import com.alibaba.excel.EasyExcel;
import com.example.testinterface.entity.ExcelDO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* excel测试控制器
*
* @author yunyan
* @date 2023/5/26
*/
@RestController
@RequestMapping("/easyExcel")
public class TestExcelController {
@GetMapping("/download")
public void download(HttpServletResponse response){
try {
//准备数据
List<ExcelDO> excelDOList =new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
ExcelDO excelDO =new ExcelDO();
excelDO.setId(i*10+1);
excelDO.setName("name"+i);
excelDO.setBuyNum(i);
excelDO.setNum(20+i);
excelDO.setPrice(2.11F+i);
excelDOList.add(excelDO);
}
//设置响应
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(), ExcelDO.class).sheet("sheet1").doWrite(excelDOList);
}catch (Exception e){
e.printStackTrace();
}
}
}
3.1、下载excel文件
访问http://localhost:8080/easyExcel/download将excel文件下载到浏览器默认下载的位置
文件打开如下图所示
四、在文件中写入
4.1、指定写入
@ExcelProperty(value="主标题",index=0)
可使用index指定写入哪一列
4.2、合并列
/**
* excel
*
* @author yunyan
* @date 2023/5/26
*/
@Data
public class ExcelDO {
@ExcelProperty({"主标题", "商品编号"})
private Integer id;
@ExcelProperty({"主标题","商品名称"})
private String name;
@ExcelProperty("商品价格")
private Float price;
@ExcelProperty("商品购买数量")
private Integer buyNum;
@ExcelProperty("商品库存")
private Integer num;
}
将需要合并的列和用大括号和合并列名括起来
4.3、格式转换
给实体类加相关注解
//格式转换为xx年xx月xx时xx分xx秒
@DateTimeFormat( "yyyy年MM月dd日HH时mm分ss秒")
@ExcelProperty("日期标题")
private Date date;
//给每个数字后边加%
@NumberFormat( "#.##%")
@Excelproperty( value ="数字标题")
private Double doubleData;
4.4、重复写(写到单个或多个sheet)
1、写到同一个sheet,只创建一次sheet
String fileName = TestFileutil.getPath() +"repeatedWrite" + System.currentTimewillis() +".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.currentTimewillis() + ".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);
}
}