[JAVA] Vermeiden Sie Zip-Bomb-Fehler beim Lesen großer Dateien mit POI

Umsetzung des Problems

    OPCPackage p = null;
	try {
		p = OPCPackage.open(file, PackageAccess.READ);
		log.info("Read File:[" + file + "]");
		XSSFStringsTable strings = new XSSFStringsTable(p);
		XSSFReader xssfReader = new XSSFReader(p);
		StylesTable styles = xssfReader.getStylesTable();
		XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
		List<CommonRecord> resultList = new ArrayList<CommonRecord>();

		List<String> targetSheetList = ConfigUtil.getTargetSheet(key);
		while (iter.hasNext()) {
			InputStream stream = iter.next();
			String sheetName = iter.getSheetName();
			if (targetSheetList.isEmpty()
					|| !targetSheetList.isEmpty() && targetSheetList.contains(sheetName.trim())) {
				log.info("Read Sheet:[" + sheetName + "]");
				resultList.addAll(processSheet(styles, strings, stream, key, file));
			}
			stream.close();
		}
		return resultList;

StylesTable styles = xssfReader.getStylesTable (); Der folgende Fehler tritt auf.

java.lang.ClassCastException: org.apache.poi.xssf.usermodel.XSSFWorkbook cannot be cast to org.apache.poi.xssf.streaming.SXSSFWorkbook

Vermeiden Sie Fehler, indem Sie ZipSecureFile.setMinInflateRatio () aufrufen.

Umsetzung nach Sanierung

    OPCPackage p = null;
	try {
		p = OPCPackage.open(file, PackageAccess.READ);
		log.info("Read File:[" + file + "]");
		XSSFStringsTable strings = new XSSFStringsTable(p);
		XSSFReader xssfReader = new XSSFReader(p);
		StylesTable styles = xssfReader.getStylesTable();
		XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
		List<CommonRecord> resultList = new ArrayList<CommonRecord>();

		List<String> targetSheetList = ConfigUtil.getTargetSheet(key);
		while (iter.hasNext()) {
			InputStream stream = iter.next();
			String sheetName = iter.getSheetName();
			if (targetSheetList.isEmpty()
					|| !targetSheetList.isEmpty() && targetSheetList.contains(sheetName.trim())) {
				log.info("Read Sheet:[" + sheetName + "]");
				resultList.addAll(processSheet(styles, strings, stream, key, file));
			}
			stream.close();
		}
		return resultList;

Recommended Posts

Vermeiden Sie Zip-Bomb-Fehler beim Lesen großer Dateien mit POI
Ich möchte OutOfMemory bei der Ausgabe großer Dateien mit POI vermeiden
Konvertieren Sie große XLSX-Dateien mit Apache POI in CSV
Um Fehler beim Starten von miChecker zu vermeiden
Laden Sie große Dateien mit Apache JMeter herunter
[Java] Lesen und Schreiben von Dateien mit OpenCSV