利用EasyPoi快速导出导入大批量的Excel

发布于:2023-04-27 ⋅ 阅读:(246) ⋅ 点赞:(0)

最近项目组长给我留了一个小需求,要求导出一份Excel,我看着项目组以前的代码照猫画虎的完成了这个需求,项目组以前用的是jxl技术,但是等我写完需求后,我发现了一个宝藏,那就是EasyPoi。这个EasyPoi就是利用注解的方式简化了Excel、Word、PDF等格式的导入导出,而且是百万级数据的导入导出。EasyPoi官方网址:EasyPoi教程_V1.0 (mydoc.io)。下面我写了一个测试用例,真的是很方便,可以利用注解自动完成单元格的合并,设置单元格宽度、设置字符替换、并且可以很好的完成实体类之间一对一、一对多关系的处理,测试代码如下:

首先引入依赖:

        <!-- EasyPoi -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>4.4.0</version>
        </dependency>

        或者是SpringBoot
        <!-- easypoi -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

        <!-- Hutool -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.10</version>
        </dependency>

接下来是实体类:

用户(User):

/**
 * @ClassName User
 * @Author 王弈程
 * @Date 2021/12/1 15:06
 **/
@Data
@ExcelTarget("用户")
public class User implements Serializable {

    @Excel(name = "用户编号",orderNum = "1",width = 20,needMerge = true)
    private String userId;

    @Excel(name = "用户姓名",orderNum = "2",needMerge = true)
    private String userName;

    @Excel(name = "用户生日",orderNum = "4",format = "yyyy-MM-dd",width = 20,needMerge = true)
    private Date userBir;

    @Excel(name = "用户性别",orderNum = "3",replace = {"男_0","女_1"},needMerge = true)
    private  int userSex;

    @ExcelEntity(name = "用户身份证")
    private Card card;

    @ExcelCollection(name = "用户订单",orderNum = "7")
    private List<Order> orderList;

}

身份证(Card):

/**
 * @ClassName Card
 * @Author 王弈程
 * @Date 2021/12/1 15:07
 **/
@Data
@ExcelTarget("身份证")
public class Card implements Serializable {

    @Excel(name = "身份证号码",orderNum = "5",width = 20,needMerge = true)
    private String cardId;

    @Excel(name = "地址",orderNum = "6",width = 20,needMerge = true)
    private String cardAddress;

}

订单(Order):

/**
 * @ClassName Order
 * @Author 王弈程
 * @Date 2021/12/1 15:08
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("订单")
public class Order implements Serializable {

    @Excel(name = "订单编号",width = 20)
    private String orderId;

    @Excel(name = "订单名称",width = 20)
    private String orderName;

    @Excel(name = "订单金额")
    private Double orderMoney;

}

接下来是测试类:

@Test
    public void testExport() throws IOException {
        //获取数据
        List<User> userList = new ArrayList<User>();
        User user = new User();
        Card card = new Card();

        for (int i = 0; i < 10; i++){
            user.setUserId(IdUtil.simpleUUID());
            user.setUserName("这是第"+i+"个人");
            user.setUserBir(new Date());
            card.setCardId(IdUtil.fastUUID());
            card.setCardAddress("呼和浩特市新城区"+i+"号");
            if (i % 2 == 1){
                user.setUserSex(1);
            }else {
                user.setUserSex(0);
            }
            user.setCard(card);
            user.setOrderList(Arrays.asList(new Order(IdUtil.fastUUID(),"qsqs",476.0),new Order(IdUtil.fastUUID(),"zzz",7182.00)));
            userList.add(user);
        }
        ExportParams params = new ExportParams();
        params.setColor(IndexedColors.AQUA.getIndex());
        params.setTitle("用户信息");
        params.setSheetName("sheet-1页");

        //设置Excel
        Workbook workbook = ExcelExportUtil.exportExcel(params,User.class,userList);

        //设置样式
        /*CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        Sheet sheet1 = workbook.getSheet("sheet-1页");
        Row row1 = sheet1.getRow(0);
        row1.setRowStyle(cellStyle);*/



        FileOutputStream outputStream = new FileOutputStream("E:\\aa.xlsx");

        //将Excel写入指定的位置
        workbook.write(outputStream);
        outputStream.close();
        workbook.close();


    }

使用前大家可以看一下官方的文档,里面有注解的使用方法,还有实体类切记要实例化,在这个过程中,我也遇到了一些问题,就是如何设计背景颜色,我的问题是有数据的地方没有颜色,没有数据的地方有颜色,我怀疑是数据就行了覆盖,但是没有解决的办法,如果各位大佬有解决办法的话,请在下面留言,谢谢。


网站公告

今日签到

点亮在社区的每一天
去签到