利用easyexcel生成excel文件测试小记之一(easyexcel入门)
By:Roy.LiuLast updated:2020-12-02
以前经常用POI来生成EXCEL文件,如果利用现成的POI工具类,也是很快可以生成EXCEL的,但从各种渠道信息看来,easyexcel封装了POI, 对于一般常用的excel导出,使用起来会更简便,而且性能也有所提升。所以今天就测试了用easyexcel来生成excel文件。测试的方式也很简单,我假设有一个单据,单据包含了主表,从表,将其抽象成两个类,一个Master类(订单主类),一个Detail类 (订单明细数据).
@Data
@ToString
public class Master {
private String sheetNo;
private String customer;
private Date createdDate;
}@Data
public class Detail {
private String productId;
private String productName;
private BigDecimal price;
private BigDecimal number;
private BigDecimal amount;
private String memo;
}用到的easyexcel依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency>
写一个测试类,在每次测试之前初始化一些数据:
@SpringBootTest
public class WriteExcel_1 {
private Master master;
private List<Detail> details = new ArrayList<>();
/**
* 初始化测试数据
*/
@Before
public void initData() {
master = new Master();
master.setCustomer("特朗普集团");
master.setSheetNo("SO2020000011111");
master.setCreatedDate(new Date());
for(int i=0; i<100; i++) {
Detail d = new Detail();
d.setProductId("product:" + i);
d.setProductName("产品:" + i);
d.setPrice(new BigDecimal("26.80"));
d.setNumber(new BigDecimal("20.5"));
d.setAmount(d.getPrice().multiply(d.getNumber()));
d.setMemo("备注产品:" + i);
details.add(d);
}
}
/**
* 仅仅输出明细数据到excel文件
*/
@Test
public void writeSimpleExcelForDetail() {
String path = this.getClass().getResource("/").getPath();
System.out.println(path);
String fileName = path + File.separator + "writeSimpleExcel.xlsx";
// 这里 需要指定写用哪个class去写,指定模板名称及数据
EasyExcel.write(fileName, Detail.class).sheet("sheet名称").doWrite(details);
}
}运行上面的测试方法, 会生成如下的EXCEL文件,但这个EXCEL文件可能你会过于简单

你会发现,这个EXCEL文件,标题栏没有明确的中文意思,每一列的宽度也不正常。那么该如何调整呢,可以利用如下注解去解决:
@Data
public class Detail {
@ExcelProperty("产品ID")
@ColumnWidth(10)
private String productId;
@ExcelProperty("名称")
@ColumnWidth(25)
private String productName;
@ExcelProperty("价格")
@ColumnWidth(10)
private BigDecimal price;
@ExcelProperty("数量")
@ColumnWidth(10)
private BigDecimal number;
@ExcelProperty("总金额")
@ColumnWidth(15)
private BigDecimal amount;
@ExcelProperty("备注")
@ColumnWidth(50)
private String memo;
}注意到注解
@ExcelProperty @ColumnWidth 了吗,一个用来指定标题头的名称,一个用来指定这一列的宽度, 修改成上面的类之后,再次运行,得到如下的EXCEL

这样就好看多了,也正规多了,但又可能面对如下的问题,如果我只显示这个类的部分字段呢(也就是排除一些字段或者只包好一部分字段),而且这些字段是有顺序的。这个时候要怎么做呢, 对于要排除的字段,可以用 excludeColumnFiledNames 来过滤,另外,如果对excel列的顺序有要求的话,同样用 @ExcelProperty(value="名称",order = 0) 方式, order 指定顺序. 下面是详细源码,排除备注(memo)字段,并且将产品名称放在第一列展示 :
@Data
public class Detail {
@ExcelProperty("产品ID")
@ColumnWidth(10)
private String productId;
@ExcelProperty(value="名称",order = 0)
@ColumnWidth(25)
private String productName;
@ExcelProperty("价格")
@ColumnWidth(10)
private BigDecimal price;
@ExcelProperty("数量")
@ColumnWidth(10)
private BigDecimal number;
@ExcelProperty("总金额")
@ColumnWidth(15)
private BigDecimal amount;
@ExcelProperty("备注")
@ColumnWidth(50)
private String memo;
}对应的测试 方法为:
/**
* 仅仅输出明细数据到excel文件, 排除部分字段
*/
@Test
public void writeSimpleExcelExculdeColumns() {
String path = this.getClass().getResource("/").getPath();
List<String> excludeColumns = new ArrayList<>();
excludeColumns.add("memo");
String fileName = path + File.separator + "writeSimpleExcel.xlsx";
// 这里 需要指定写用哪个class去写,指定模板名称及数据
EasyExcel.write(fileName, Detail.class).excludeColumnFiledNames(excludeColumns).sheet("sheet名称").doWrite(details);
}运行代码之后,生成的excel格式如下:

From:一号门

COMMENTS