利用easyexcel生成excel文件测试小记之一(easyexcel入门)

摘要: 以前经常用POI来生成EXCEL文件,如果利用现成的POI工具类,也是很快可以生成EXCEL的,但从各种渠道信息看来,easyexcel封装了POI, 对于一般常用的excel导出,使用起来会更简便,而且性能也有所提升。所以今天就测试了用easyexcel来生成excel文件。

以前经常用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格式如下:


上一篇: 一篇文章梳理spring boot 加载 spring data jpa的全过程.
下一篇: 利用easyexcel生成excel文件-复杂表头/多表头/自定义表头设计
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号