SXSSFWorkbook的使用

简介

SXSSFWorkbook是Apache POI库中的一个类,主要用于处理大容量的Excel文件。专为处理.xlsx格式的Excel文件设计,即Office Open XML(OOXML)格式。它不适用于旧的.xls(BIFF8 BIFF记录格式)文件。如果你需要处理大容量的.xls文件,Apache POI库中并没有直接对应的内存优化解决方案,但可以通过分块读写数据的方式实现类似效果。对于xlsx文件的大数据量操作,使用SXSSFWorkbook是最佳实践。

相比于传统的XSSFWorkbook(用于操作XLSX格式的文件),SXSSFWorkbook在内存使用上做了优化,SXSSFWorkbook通过维护一个有限大小的工作表缓存(默认100行)来减少内存消耗。当缓存满时,它会将最旧的行数据写入硬盘并从内存中移除,从而使得程序能够在处理大数据量时避免内存溢出的问题。

1.导出数据到EXCEL

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class SXSSFExcelExporter {

    public void exportToExcel(List dataList, String outputPath) throws IOException {
        // 创建一个SXSSFWorkbook对象,参数100表示缓存的最大行数
        SXSSFWorkbook workbook = new SXSSFWorkbook(100);

        // 创建一个新的工作表
        Sheet sheet = workbook.createSheet("Data Sheet");

        // 创建表头样式(可选)
        CellStyle headerCellStyle = createHeaderCellStyle(workbook);

        // 写入表头数据
        Row headerRow = sheet.createRow(0);
        for (int i = 0; i  values;

        // getter 方法...
        public List getValues() {
            return values;
        }
    }

    public static void main(String[] args) throws IOException {
        // 假设已经有了一个数据列表
        List dataList = ...; 

        String outputPath = "output.xlsx";
        SXSSFExcelExporter exporter = new SXSSFExcelExporter();
        exporter.exportToExcel(dataList, outputPath);
    }
}

在上述代码中,首先创建了一个 SXSSFWorkbook 实例,并设置了一个适当的行缓存大小。接着,创建一个工作表并在其中添加表头和数据行。最后,将生成的工作簿内容写入指定路径的 .xlsx 文件中。

为了确保高效处理大数据集,请确保将实际数据源分批次读取或查询,并在每次处理完一批数据后调用 SXSSFWorkbookflush()dispose() 方法来释放已写出到磁盘的行所占用的内存。

2.读取EXCEL数据

SXSSFWorkbook不仅可以用来导出数据,也可以用于读取和修改Excel文件中的数据。虽然它最常被提及的用途是处理大数据量时高效地将数据写入.xlsx格式的Excel文件中,但该类同样提供了对工作簿、工作表以及单元格级别的操作接口,因此你可以使用它来:

  1. 创建新的Excel文件并填充数据(导出)。
  2. 打开现有的.xlsx文件,并逐行或分批次读取数据。
  3. 修改已有的.xlsx文件内容,比如更新特定行或列的数据。
  4. 删除或添加新的工作表到工作簿中。

由于其设计初衷是为了优化内存使用,所以在读取大文件时,SXSSF模式不会一次性加载整个文件到内存中,而是按需加载部分数据,这对于读取或修改大型数据集非常有用。不过,在进行大量读写操作时,需要注意其内部的行缓存策略可能会导致较旧的数据从内存中移除并被写入硬盘临时存储区域。

import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class SXSSFExcelReader {
    public void readExcel(String filePath) throws IOException {
        // 创建文件输入流
        FileInputStream fis = new FileInputStream(new File(filePath));

        // 创建 SXSSFWorkbook 对象
        SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 参数指定行缓存大小,这里是100行
        try {
            // 获取第一个工作表
            XSSFSheet sheet = workbook.getXSSFSheetAt(0);

            // 读取数据
            for (Row row : sheet) {
                for (Cell cell : row) {
                    String cellValue = "";
                    switch (cell.getCellType()) {
                        case STRING:
                            cellValue = cell.getStringCellValue();
                            break;
                        case NUMERIC:
                            cellValue = String.valueOf(cell.getNumericCellValue());
                            break;
                        // 处理其他类型(BOOLEAN, FORMULA, BLANK, ERROR等)
                        // ...
                    }
                    System.out.print(cellValue + "\t");
                }
                System.out.println();
            }
        } finally {
            // 关闭 SXSSFWorkbook 以释放资源
            workbook.close();
            fis.close();
        }
    }
}

这段代码首先创建一个 SXSSFWorkbook 实例,并通过文件路径打开.xlsx文件。然后,它获取工作簿中的第一个工作表,并逐行、逐单元格地读取内容。

请注意,在实际应用中,您可能需要根据单元格的类型适当地处理每个单元格的内容,上面的示例仅演示了字符串和数值类型的简单处理方式。此外,如果文件中有多张工作表,您可以通过 getSheetAt(int index)getSheet(String name) 方法访问不同索引或名称的工作表。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
POI海量数据⼤数据⽂件⽣成 海量数据⼤数据⽂件⽣成SXSSFWorkbook使⽤简介 使⽤简介   在之前我们知道处理xls的excel⽤的workbook是HSSFWorkbook,处理xlsx的excel⽤的是XSSFWorkbook。   上⾯两个类导出excel的时候数据会驻留在内存中,所以当数据量⼤的时候容易造成内存溢出。SXSSFWorkbook是⽤来⽣成海 量excel数据⽂件,主要原理是借助临时存储空间⽣成excel。POI要求3.8以上,⽣成的⽂件格式要求是07及以上版本,因为excel07级以 上版本的⾏数1048576,量很⼤,⽽03版本的只有6万多。   读取07及以上版本的excel仍然是"XSSFWorkbook",写⼊则为"SXSSFWorkbook "。 导出的代码:(⼀个简单的测试,如果想封装⼯具类,参考:) package cn.xm.exam.utils; import java.io.File; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public class SXSSFExcelUtil { public static void main(String[] args) { String[] title = { "id", "name", "sex" }; // 创建⼀个⼯作簿 Workbook workbook = new SXSSFWorkbook(); // 创建⼀个⼯作表sheet Sheet sheet = workbook.createSheet(); // 创建第⼀⾏ Row row = sheet.createRow(0); // 创建⼀个单元格 Cell cell = null; // 创建表头 for (int i = 0; i < title.length; i++) { cell = row.createCell(i); cell.setCellValue(title[i]); } // 从第⼆⾏开始追加数据 for (int i = 1; i <= 10000; i++) { // 创建第i⾏ Row nextRow = sheet.createRow(i); // 参数代表第⼏列 Cell cell2 = nextRow.createCell(0); cell2.setCellValue("a" + i); cell2 = nextRow.createCell(1); cell2.setCellValue("user" + i); cell2 = nextRow.createCell(2); cell2.setCellValue("男"); } // 创建⼀个⽂件 File file = new File("G:/tt1.xls"); try { file.createNewFile(); // 打开⽂件流 FileOutputStream outputStream = new FileOutputStream(file); workbook.write(outputStream); outputStream.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 补充:SXFFSWoorkbook导出的excel相⽐于XSSFWoorkbook导出的更节省空间: 下⾯分别是SXXFS\XFFS\HFFS导出上⾯1万条数据的excel的⽂件⼤⼩: 补充:测试HSSF\XSSF导出的数据占⽤内存,⽽SXFFS导出的数据不容易造成内存溢出 数据改为5万条并且写⼊之后查看内存信息: (1)查看XSSF导出的时候占⽤JVM内存 package cn.xm.exam.utils; import java.io.File; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache
SXSSFWorkbook 是 Apache POI 库中的一个类,用于在内存中创建和操作大型Excel文件。与 XSSFWorkbook 相比,SXSSFWorkbook 具有更低的内存占用和更好的性能,特别适用于处理大量数据的情况。 使用 SXSSFWorkbook,您可以按照以下步骤来创建和操作Excel文件: 1. 导入必要的类: ```java import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFRow; ``` 2. 创建 SXSSFWorkbook 对象: ```java SXSSFWorkbook workbook = new SXSSFWorkbook(); ``` 3. 创建 SXSSFSheet 对象: ```java SXSSFSheet sheet = workbook.createSheet("Sheet1"); ``` 4. 创建 SXSSFRow 对象,并设置单元格值: ```java SXSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue("Value 1"); row.createCell(1).setCellValue("Value 2"); // 可以继续为其他单元格设置值 ``` 5. 可以使用循环来处理大量的数据,并将其写入到 Excel 文件中: ```java for (int i = 0; i < data.size(); i++) { SXSSFRow row = sheet.createRow(i); // 设置单元格值,可以根据数据源的结构进行设置 } ``` 6. 最后,将数据写入到文件中并保存: ```java try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) { workbook.write(outputStream); } ``` 请注意,上述代码只是一个简单的示例,您需要根据实际需求来处理数据和设置单元格的值。 希望这可以帮助您开始使用 SXSSFWorkbook 来创建和操作大型的Excel文件!如果您有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值