EasyExcel的导入和导出

导入:

下面是从http请求流中读取数据流,其他形式的数据流道理相同;

逻辑代码:

    @PostMapping(value = "import", consumes = "multipart/*", headers = "content-type=multipart/form-data")
    public String import(MultipartHttpServletRequest request) {
        log.info("import批量录入数据开始");
        String fileName="";
        try {
            Map<String, MultipartFile> fileMap = request.getFileMap();
            for (Map.Entry<String, MultipartFile> part : fileMap.entrySet()) {
                InputStream inputStream = part.getValue().getInputStream();
                fileName=part.getValue().getOriginalFilename();
                Boolean isExcel = FileUtil.isExcelFile(fileName);//就是判断下扩展名是不是xls、xlsx;
                if (!isExcel) {
                    throw new ValidateException("导入的文件不是excel文件");
                }
                List<Data> data = new LinkedList<>();
                EasyExcel.read(inputStream).head(Data.class).autoTrim(true).registerReadListener(
                        new AnalysisEventListener<ByteArea>() {
                            @Override
                            public void invoke(Data data1, AnalysisContext analysisContext) {
                                data.add(data1);
                            }
                            @Override
                            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                                log.info("读取文件[{}]成功,一共:{}行......", part.getKey(), data.size());
                            }
                        }
                ).doReadAll();//读取所有的sheet;
                importService.import(data);
            }
        } catch (Exception e) {
            log.error("批量录入数据异常", e);
            return "批量录入数据异常";
        }
        return "批量录入数据正常";
    }

类的属性注解中的value要和Excel列头的名字相同,保证Excel数据可以映射到对象的属性中:

导出相关常用API

注解ExcelProperty 指定写到第几列,默认根据成员变量排序。value指定写入的名称,默认成员变量的名字。ExcelIgnore 默认所有字段都会写入excel,这个注解会忽略这个字段。DateTimeFormat 日期转换,将Date写到excel会调用这个注解。里面的value参照java.text.SimpleDateFormat。NumberFormat 数字转换,用Number写excel会调用这个注解。里面的value参照java.text.DecimalFormat。

EasyExcel相关参数needHead 监听器是否导出头。useDefaultStyle 写的时候是否是使用默认头。head 与clazz二选一。写入文件的头列表,建议使用class。autoTrim 字符串、表头等数据自动trim。sheetNo 需要写入的编码。默认0。sheetName 需要些的Sheet名称,默认同sheetNo。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Data implements Serializable {

    /**
     * 区域id
     */
    @ExcelProperty("areaCode")
    private String areaCode;
    /**
     * 区域名称
     */
    @ExcelProperty("areaName")
    private String areaName;
    /**
     * 父级id
     */
    @ExcelProperty("fatherId")
    private String fatherId;
    /**
     * 级别
     */
    @ExcelProperty("level")
    private Integer level;
}

POM依赖引入:

<properties>
    <easyExcel.version>2.2.6</easyExcel.version>
</properties>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>${easyExcel.version}</version>
</dependency>

导出:

下面是导出的核心部分代码,可根据实际场景进行调整代码

ByteArrayOutputStream os = new ByteArrayOutputStream();
ExcelWriter excelWriter = EasyExcel.write(os).build();
WriteSheet writeSheet = EasyExcel.writerSheet("第" + (i - 1) + "部分").build();
excelWriter.write(page.getResult(), writeSheet);
excelWriter.finish();
os.close();

总结

可以看出不管是excel的读取还是写入,都是一个注解加上一行代码完成,可以让我们少些很多解析的代码,极大减少了重复的工作量。当然这两个例子使用了最简单的方式,EasyExcel还支持更多场景,例如读,可以读多个sheet,也可以解析一行数据或者多行数据做一次入库操作;写的话,支持复杂头,指定列写入,重复多次写入,多个sheet写入,根据模板写入等等。更多的例子可以去参考EasyExcel官方文档https://www.yuque.com/easyexcel/doc/easyexcel

对于EasyExcel库,我们可以使用它来实现数据的导入导出。下面是一个示例代码,演示了如何使用EasyExcel进行数据的导入导出: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.support.ExcelTypeEnum; import java.util.ArrayList; import java.util.List; public class EasyExcelDemo { public static void main(String[] args) { // 导出数据 exportData(); // 导入数据 importData(); } private static void exportData() { // 准备数据 List<User> userList = new ArrayList<>(); userList.add(new User("张三", 20)); userList.add(new User("李四", 25)); // 导出文件路径 String exportFilePath = "D:/users.xlsx"; // 设置表头 Table table = new Table(0); table.setHead(User.getHead()); // 入数据到Excel文件 ExcelWriter excelWriter = EasyExcel.write(exportFilePath, User.class).excelType(ExcelTypeEnum.XLSX).build(); Sheet sheet = new Sheet(1, 0, User.class); sheet.setSheetName("用户信息"); excelWriter.write(userList, sheet, table); excelWriter.finish(); } private static void importData() { // 导入文件路径 String importFilePath = "D:/users.xlsx"; // 读取Excel文件并转换为对象列表 List<User> userList = EasyExcel.read(importFilePath).head(User.class).sheet().doReadSync(); // 输出导入的数据 for (User user : userList) { System.out.println(user); } } static class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public static List<String> getHead() { List<String> head = new ArrayList<>(); head.add("姓名"); head.add("年龄"); return head; } // 省略 getter setter 方法 @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } } ``` 上述示例代码中,我们先定义了一个 `User` 类作为数据的实体类,然后使用EasyExcel库进行数据的导出导入。在导出数据的部分,我们首先准备了一个用户列表 `userList`,然后指定导出的文件路径 `exportFilePath`,接着设置表头信息,最后使用 `ExcelWriter` 将数据入到Excel文件中。在导入数据的部分,我们指定导入的文件路径 `importFilePath`,然后使用 `EasyExcel.read()` 方法读取Excel文件,并使用 `doReadSync()` 方法将Excel数据转换为对象列表。 请注意,上述示例代码中使用的是EasyExcel的最新版本,你需要在你的项目中添加相应的依赖。你可以通过访问EasyExcel的官方网站来获取更多关于EasyExcel库的信息文档:[https://www.yuque.com/easyexcel/doc/easyexcel](https://www.yuque.com/easyexcel/doc/easyexcel)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值