利用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