workbookfactory.create速度慢
时间: 2025-01-13 21:07:47 浏览: 59
WorkbookFactory.create() 方法在处理大型Excel文件时可能会变得非常慢。这是因为该方法需要加载整个Excel文件到内存中,如果文件很大,就会消耗大量的内存和处理时间。以下是一些优化建议,可以帮助你提高WorkbookFactory.create()的速度:
1. **使用SAX解析器**:
相比于DOM解析器,SAX解析器是事件驱动的,可以逐行读取Excel文件,而不是一次性加载整个文件。这可以显著减少内存使用和提高速度。
```java
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
try (InputStream inp = new FileInputStream("largeExcelFile.xlsx")) {
XSSFReader reader = new XSSFReader(OPCPackage.open(inp));
SharedStringsTable sst = reader.getSharedStringsTable();
XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setContentHandler(new XSSFSheetXMLHandler(reader.getStylesTable(), sst, new SheetHandler(), false));
parser.parse(new InputSource(reader.getSheetsData().next()));
}
```
2. **分批处理**:
如果你只需要处理部分数据,可以考虑分批读取和处理数据,而不是一次性加载整个文件。
```java
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.ss.usermodel.WorkbookFactory;
try (Workbook workbook = WorkbookFactory.create(new File("largeExcelFile.xlsx"))) {
Sheet sheet = workbook.getSheetAt(0);
for (int i = 0; i < sheet.getLastRowNum(); i += 1000) {
Row row = sheet.getRow(i);
// 处理每一行数据
}
}
```
3. **使用Apache POI的SXSSF**:
SXSSF是Apache POI提供的一个用于处理大型Excel文件的类,它通过在内存中只保留有限的数据来提高性能。
```java
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.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
SXSSFWorkbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet();
try (Workbook readWorkbook = WorkbookFactory.create(new File("largeExcelFile.xlsx"))) {
Sheet readSheet = readWorkbook.getSheetAt(0);
for (Row row : readSheet) {
// 处理每一行数据
sheet.createRow(row.getRowNum()).createCell(0).setCellValue(row.getCell(0).getStringCellValue());
}
}
```
阅读全文
相关推荐



