EasyExcel实现多个sheet读取并导入数据库

官方的导入有单个sheet导入,建一个监听器,多个sheet就要建多个监听器,简单倒是简单,就是需要建多个。

多个sheet,使用一个监听器实现导入并保存数据库

service 
@Slf4j
@Service
public class ExcelFileSystemServiceImpl implements ExcelFileSystemService {
    private static final int NUM_LISTENERS = 8;

    @SneakyThrows
    @Override
    public void uploadFile(MultipartFile file){
        try (ExcelReader excelReader = EasyExcelFactory.read(file.getInputStream()).build()) {
            excelReader.read(listenersAndReadSheets());
        }
    }
    public List<ReadSheet> listenersAndReadSheets() {
        List<ReadSheet> readSheets = new ArrayList<>(NUM_LISTENERS);
        for (int i = 0; i < NUM_LISTENERS; i++) {
            try {
                NoModelDataListener< ?, ? > listener = new NoModelDataListener<>(DaoClassEnum.getDaoClass().get(i));
                ReadSheet readSheet = createReadSheet(i, listener, Class.forName(EntityClassEnum.getEntityClass().get(i)));
                readSheets.add(readSheet);
            } catch (Exception e) {
                // 处理可能的异常,例如日志记录或错误回报
                log.error("Error initializing listener/readSheet for " + EntityClassEnum.getEntityClass().get(i));
                e.printStackTrace();
            }
        }
        return readSheets;
    }
    private ReadSheet createReadSheet(int sheetIndex, NoModelDataListener<?,?> listener, Class<?> entityClass) {
        return EasyExcelFactory.readSheet(sheetIndex)
                .headRowNumber(2)
                .head(entityClass)
                .registerReadListener(listener)
                .build();
    }

}

NoModelDataListener

批量写数据库可以自己实现

@Slf4j
public class NoModelDataListener<X extends BaseAreaEntity,Y extends BatchBaseMapper<X>> extends AnalysisEventListener<X> {

    Class<Y> yClass;
    @SuppressWarnings("unchecked")
    public NoModelDataListener(Class<?> yClass) {
        this.yClass = (Class<Y>) yClass;
    }


    private static final int BATCH_COUNT = 10000;
    private List<X> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    @Override
    public void invoke(X data, AnalysisContext context) {
        cachedDataList.add(data);
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

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

    /**
     * 加上存储数据库
     */
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", cachedDataList.size());
        Y y = SpringContentUtils.getBean(yClass);
        y.insertBatch(cachedDataList,BATCH_COUNT / 100);
        log.info("存储数据库成功!");
    }
}

好的,我可以为您提供一些指导。 首先,您需要使用EasyExcel库来读取Excel文件。您可以使用以下Maven依赖项将其添加到项目中: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> ``` 接下来,您可以使用以下代码来读取Excel文件中的多个工作表: ``` String fileName = "example.xlsx"; InputStream inputStream = new FileInputStream(fileName); ExcelReader excelReader = new ExcelReader(inputStream, null, new AnalysisEventListener<Object>() { @Override public void invoke(Object object, AnalysisContext context) { // 处理每一行数据 } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 数据处理完毕后的操作 } }); // 读取第一个、第二个工作表 excelReader.read(new Sheet(1, 1), new Sheet(2, 1)); excelReader.finish(); inputStream.close(); ``` 在上面的代码中,您可以使用`Sheet`类指定要读取的工作表。这里,我们读取了第一个和第二个工作表。 接下来,您可以在`invoke`方法中处理每一行数据。例如,您可以将数据保存到数据库中: ``` @Override public void invoke(Object object, AnalysisContext context) { // 将数据保存到数据库中 MyData myData = (MyData) object; myDataRepository.save(myData); } ``` 其中,`MyData`是您自己定义的数据类,`myDataRepository`是您的数据访问对象。 最后,在`doAfterAllAnalysed`方法中,您可以执行所有数据处理完毕后的操作。例如,您可以关闭数据库连接等等。 希望这可以帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值