easyExcel 获取多个sheet中复杂表头的数据

easyExcel 获取多个sheet中复杂表头的数据

easyExcel 解释

EasyExcel是一个强大且易于使用的Java库,用于简化Excel文件的读写操作。它是阿里巴巴开源的一个基于POI实现的Excel处理工具,并提供了一组简单的API来处理Excel文件,包括读取、写入和转换。

EasyExcel的特点包括:

易于使用:EasyExcel提供了简单而直观的API,使得读取、写入和转换Excel文件变得容易。可以通过少量的代码实现复杂的Excel文件操作。

大数据量处理:EasyExcel对大数据量的处理进行了优化,支持高效读取和写入大型Excel文件,减少内存消耗和处理时间。

支持多种数据转换:EasyExcel支持将Excel文件与Java对象之间进行相互转换,可以方便地将Excel数据映射到Java对象,也可以将Java对象转换为Excel文件。

丰富的功能:EasyExcel提供了丰富的功能,包括支持读取和写入不同格式的Excel文件(例如xls和xlsx),支持读取和写入多个sheet,支持读取和写入复杂的Excel表头,支持数据校验等。

使用EasyExcel进行Excel操作通常包括以下步骤:

读取Excel文件:使用EasyExcel提供的API读取Excel文件,并将读取的数据映射到Java对象。

写入Excel文件:使用EasyExcel提供的API将Java对象数据写入Excel文件。

数据转换:使用EasyExcel提供的转换器功能,将Excel数据和Java对象之间进行相互转换。

总之,EasyExcel是一个功能强大且易于使用的Excel处理工具,它可以帮助开发人员更轻松地处理Excel文件,减少了代码量和开发时间。无论是处理大数据量还是进行数据转换,EasyExcel都是一个很好的选择。

实体

 @Data
public class HermalPowerRnterpriseVO {
   
	// index为excel中指定列(从0开始)
   @ExcelProperty(value = "名称", index = 0)
    private String name;
}

业务代码

    @Override
    public void importData(MultipartFile file) {
   
        //初始化实体
        Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap = initializeSheetMap();
        Map<Class<?>, List<Object>> entityMap = initializeEntityMap(sheetMap);
        //声明并初始化inputStream
        try (InputStream inputStream = file.getInputStream()) {
   
            // 读取excel
            List<ReadSheet> readSheetList = EasyExcel.read(inputStream).build().excelExecutor().sheetList();

            for (ReadSheet readSheet : readSheetList) {
   
                //读取特定Excel表格
                try (InputStream sheetInputStream = file.getInputStream()) {
   
                    AbstractMap.SimpleEntry<Integer, Class<?>> sheetInfo = sheetMap.get(readSheet.getSheetName());
                    if (sheetInfo != null) {
   
                        readSheet(sheetInputStream, sheetInfo.getKey(), sheetInfo.getValue(), entityMap.get(sheetInfo.getValue()));
                    }
                } catch (Exception e) {
   
                    e.printStackTrace();
                }
            }

            // 输出读到的内容
            for (Map.Entry<Class<?>, List<Object>> entry : entityMap.entrySet()) {
   
                log.info(entry.getKey().getSimpleName() + ": " + JSON.toJSONString(entry.getValue()));
            }

        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }

    /**
     * 初始化sheet内容
     * XXX 为sheet的名称,0,1,2,3为指定的sheet下表
     */
    private Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> initializeSheetMap() {
   
        Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap = new HashMap<>(16);
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(0, LoadVO.class));
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(1, HermalPowerRnterpriseVO.class));
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(2, HydropowerEnterpriseVO.class));
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(3, CentralizedSceneryVO.class));
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(4, NewEnergyStorageVO.class));
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(5, PowerAggregatorVO.class));
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(6, LoadAggregatorVO.class));
        sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(7, AggregateBodyVO.class));
        return sheetMap;
    }

    /**
     * 初始化entity内容
     */
    private Map<Class<?>, List<Object>> initializeEntityMap(Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap) {
   
        Map<Class<?>, List<Object>> entityMap = new HashMap<>(16);
        for (Class<?> clazz : sheetMap.values().stream().map(AbstractMap.SimpleEntry::getValue).distinct().toArray(Class<?>[]::new)) {
   
            entityMap.put(clazz, new ArrayList<>());
        }
        return entityMap;
    }

    /**
     * 获取sheet数据
     */
    private void readSheet(InputStream inputStream, Integer sheetNum, Class<?> clazz, List<?> dataList) {
   
        EasyExcel.read(inputStream, clazz, new EasyExcelVOListener(dataList))
				//sheetNum为获取第几个sheet的数据
                .sheet(sheetNum)
                // 跳过表头
                .headRowNumber(2)
                .doRead();
    }
    

优化2.0

问题:版本1.0会生成临时文件(这是因为EasyExcel的底层,它使用了ZipFile来处理Excel文件,而未正确关闭ZipFile可能会导致资源泄漏),程序会走垃圾清除:Cleaning up unclosed ZipFile for archive
解决:使用 EasyExcel.read()方法的另一个重载,以关闭自动生成的临时文件。使用 ExcelReader 对象来替代
EasyExcel.read().build().excelExecutor().sheetList(),然后在 finally 块中调用 excelReader.finish() 来关闭和删除临时文件。

临时文件问题代码

 List<ReadSheet> readSheetList = EasyExcel.read(inputStream).build().excelExecutor().sheetList();
    @Override
    public void importData(MultipartFile file) {
   
        //初始化excel实体
        Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap = initializeSheetMap();
        Map<Class<?>, List<Object>> entityMap = initializeEntityMap(sheetMap);
        ExcelReader excelReader = null;
        //声明并初始化inputStream
        try (InputStream inputStream = file.getInputStream()) {
   
            excelReader = EasyExcel.read(inputStream).build();
            // 读取excel
            List<ReadSheet> readSheetList = excelReader.excelExecutor().sheetList();

            for (ReadSheet readSheet : readSheetList) {
   
                //读取特定Excel表格
                try (InputStream sheetInputStream = file.getInputStream()) {
   
                    AbstractMap.SimpleEntry<Integer, Class<?>> sheetInfo = sheetMap.get(readSheet.getSheetName());
                    if (sheetInfo != null) {
   
                        readSheet(sheetInputStream, sheetInfo.getKey(), sheetInfo.getValue(), entityMap.get(sheetInfo.getValue()));
                    }
                } catch (Exception e) {
   
                    e.printStackTrace();
                }
            }

            // 输出读到的内容
            for (Map.Entry<Class<?>, List<Object>> entry : entityMap.entrySet()) {
   
                log.info(entry.getKey().getSimpleName() + ": " + JSON.toJSONString(entry.getValue()));
            }
        } catch (IOException e) {
   
            e.printStackTrace();
        }finally {
   
            if (excelReader != null) {
   
                excelReader.finish();
            }
        }
    }

相关推荐

  1. easyExcel 获取sheet复杂表头数据

    2024-01-10 07:18:04       63 阅读
  2. EasyExcel list<Map>批量导出sheet

    2024-01-10 07:18:04       57 阅读
  3. EasyExcel模板填充以及填充sheet

    2024-01-10 07:18:04       35 阅读
  4. SpringBoot集成EasyExcel实现模板写入sheet导出

    2024-01-10 07:18:04       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-10 07:18:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-10 07:18:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-10 07:18:04       82 阅读
  4. Python语言-面向对象

    2024-01-10 07:18:04       91 阅读

热门阅读

  1. EasyExcel快速导出 100W 数据

    2024-01-10 07:18:04       53 阅读
  2. 【React源码 - Fiber架构之Renderer】

    2024-01-10 07:18:04       57 阅读
  3. Docker 方式安装 RabbitMQ

    2024-01-10 07:18:04       49 阅读
  4. Qt 快速读取大文件最后一行内容

    2024-01-10 07:18:04       65 阅读
  5. 2_单列模式_饿汉式单例模式

    2024-01-10 07:18:04       59 阅读
  6. 单例模式的模板

    2024-01-10 07:18:04       66 阅读
  7. ESP32-WIFI(Arduino)

    2024-01-10 07:18:04       65 阅读