最近项目组长给我留了一个小需求,要求导出一份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(); }
使用前大家可以看一下官方的文档,里面有注解的使用方法,还有实体类切记要实例化,在这个过程中,我也遇到了一些问题,就是如何设计背景颜色,我的问题是有数据的地方没有颜色,没有数据的地方有颜色,我怀疑是数据就行了覆盖,但是没有解决的办法,如果各位大佬有解决办法的话,请在下面留言,谢谢。