java生成excel,大数据缓存,解决内存溢出问题

使用poi生成excel,导入jar包

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.10-FINAL</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.10-FINAL</version>
</dependency>

生成excel主要的对象是:Workbook 是一个接口,主要有三种创建方式

1,创建2003 版本的excle,后缀 .xls,最多只能存5.6w行,256列左右的数据
Workbook workbook = new XSSFWorkbook();
2,创建2007 及以后的版本, 后缀 .xlsx 可以存104w行,16384列左右的数据,但这种方式数据稍微大一点就会OOM
Workbook workbook = new HSSFWorkbook();
3, 专门用来生成大数据excel,但也会受到 excel 104w 上限的限制
Workbook workbook = new SXSSFWorkbook();
4,生成 .csv 后缀的excel文件, .csv理论上就纯文本,存多少数据都没问题,但数据太大打开会非常慢
用上面三种方式都可以生成

先来看看普通数据的读取,标准 .xls .xlsx 可以直接生成Workbook对象, 但CSV文件是根据特殊字符分割生成数组。

//读取 excel 根据路径生成输入流,获取workbook对象,获取sheet,获取行row,获取列cell
/**
 * @param filePath    文件路径
 * @param endWith     结束符
 * @return
 * @throws Exception
 */
public static List<List<List<String>>> readXls(String filePath, String endWith) throws Exception {

    InputStream is = null;
    try {
        is = new FileInputStream(filePath);
        //HSSFWorkbook表示整个Excel
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
        //循环每一页,并处理当前的循环页
        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
            //HSSFSheet表示某一页
            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            if (hssfSheet == null) {
                continue;
            }

            //处理当前页,循环处理每一行的数据
            List<List<String>> sheetResult = new ArrayList<>();
            for (int rowNumIndex = 0; rowNumIndex <= hssfSheet.getLastRowNum(); rowNumIndex++) {
                //HSSFRow表示每一行的数据
                HSSFRow hssfRow = hssfSheet.getRow(rowNumIndex);
                int minColIx = hssfRow.getFirstCellNum();
                int maxColIx = hssfRow.getLastCellNum();
                String firstColumn = hssfRow.getCell(0).getStringCellValue();
                //结尾符
                if (StringUtils.isBlank(firstColumn) ||
            
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java导入excel大量数据出现内存溢出问题可以通过以下几种方法来解决: 1. 分批导入:将大量数据分成多个小批次导入,每次只处理一部分数据,避免一次性加载全部数据导致内存溢出。可以按照行或者列进行分批导入,读取一部分数据后进行处理,然后再读取下一部分数据。 2. 内存优化:在导入数据时,可以优化内存使用,减少内存消耗。例如,使用SXSSF模式代替XSSF模式,SXSSF模式可以将Excel数据写入临时文件而不是全部加载到内存中,减少内存压力。 3. 限制每次读取的数据量:可以通过设置读取数据的行数或者列数限制来减少内存使用。例如,使用Apache POI库的setReadWindow方法来限制每次读取的行数和列数。 4. 增加JVM内存:通过增加JVM的内存限制来避免内存溢出问题。可以通过调整-Xms和-Xmx参数来增加JVM的初始内存和最大内存限制。 5. 优化代码逻辑:检查和优化导入数据的代码逻辑,确保没有内存泄漏或者无用的数据加载。可以使用工具来进行代码分析,找出潜在的问题并进行优化。 6. 使用缓存机制:对于重复的数据,可以使用缓存机制来减少重复加载。可以将已经读取的数据缓存起来,在需要的时候直接从缓存中获取,避免重复读取导致的内存占用过高。 7. 使用数据库存储:对于大量数据的导入,可以考虑将数据存储在数据库中,而不是全部加载到内存中。可以使用数据库的批量插入操作来提高导入效率。 综上所述,解决java导入excel大量数据出现内存溢出问题可以通过分批导入、内存优化、限制每次读取的数据量、增加JVM内存、优化代码逻辑、使用缓存机制以及使用数据库存储等方法来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值