导入、导出Excel

目录

1、业务需求操作顺序

2、官方网站

3、写:导出demo

4、读:导入demo

5、常见错误


1、业务需求操作顺序

  1. 创建表需求表,在dto中创建实体类
  2. 创建service用Stream来导入excel表,并在impl中创建监听器
    1. 在监听器中面对大数据量时,先进行一定数量的解析在分次向数据库中插入数据,做的是批量存储,在生产环境下在列表里面放入3000条数据,在用一条批量的sql语句插入数据库,太大了数据库那边承受不了。
  3. 在controller创建接口multipart(file)接收前端传送的文件
  4. 保存Excel数据到数据库

2、官方网站

GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具

快速开始:EasyExcel(文档已经迁移) · 语雀

3、写:导出demo

public class ExcelWriteTest {

    //2007版本的xlsx
    @Test
    public void simpleWriteXlsx() {
        // 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName =  "D:/banking-project/exceltest/simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, ExcelStudentDTO.class)
                .sheet("模板")
                .doWrite(data());
    }

    //2003版本的xls
    @Test
    public void simpleWriteXls() {
        // 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName =  "D:/banking-project/exceltest/simpleWrite" + System.currentTimeMillis() + ".xls";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, ExcelStudentDTO.class)
                .excelType(ExcelTypeEnum.XLS)
                .sheet("模板")
                .doWrite(data());
    }

    private List<ExcelStudentDTO> data() {
        List<ExcelStudentDTO> list = new ArrayList<>();
        for (int i = 0; i < 65536; i++) {
            ExcelStudentDTO data = new ExcelStudentDTO();
            data.setName("字符串" + i);
            data.setBirthday(new Date());
            data.setSalary(0.56);
            list.add(data);
        }
        return list;
    }
}

实体类

@Data
public class ExcelStudentDTO {

    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("生日")
    private Date  birthday;
    @ExcelProperty("薪资")
    private Double salary;
}

4、读:导入demo

创建监听器

@Slf4j
public class ExcelStudentDTOListener extends AnalysisEventListener<ExcelStudentDTO>{

    @Override
    public void invoke(ExcelStudentDTO data, AnalysisContext context) {
        log.info("解析到一条数据: {}",data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("所有数据解析完成!");
    }
}

public class ExcelReadTest {

    /**
     * 最简单的读
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link ExcelStudentDTO}
     * <p>
     * 2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link ExcelStudentDTOListener}
     * <p>
     * 3. 直接读即可
     */
    @Test
    public void simpleReadXlsx() {
        // 写法1:JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        String fileName = "D:/banking-project/exceltest/simpleWrite.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        // 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
        EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).sheet().doRead();

    }

    @Test
    public void simpleReadXls() {
        // 写法1:JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        String fileName = "D:/banking-project/exceltest/simpleWrite.xls";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        // 这里每次会读取3000条数据 然后返回过来 直接调用使用数据就行
        EasyExcel.read(fileName, ExcelStudentDTO.class, new ExcelStudentDTOListener()).excelType(ExcelTypeEnum.XLS).sheet().doRead();

    }
}

5、常见错误

解决方案:加载的时候不让xml文件被过滤掉

<build>
    <!-- 项目打包时会将java目录中的*.xml文件也进行打包 -->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值