web-dev-qa-db-fra.com

Lire le fichier xlsx avec POI (SXSSFWorkbook)

J'essaie de faire mes premiers tests de lecture d'un gros fichier xlsx avec POI, mais pour faire un test simple avec un petit fichier, je n'arrive pas à montrer la valeur d'une cellule.

Quelqu'un peut me dire quelle est mon erreur. Toutes les suggestions sont les bienvenues. Merci.

Test.Java:

import Java.io.File;
import Java.io.FileInputStream;

import org.Apache.poi.openxml4j.opc.OPCPackage;
import org.Apache.poi.ss.usermodel.Sheet;
import org.Apache.poi.xssf.streaming.SXSSFWorkbook;
import org.Apache.poi.xssf.usermodel.XSSFWorkbook;

public class Test {

    public static void main(String[] args) throws Throwable {
        File file = new File("/tmp/test.xlsx");
        OPCPackage pkg = OPCPackage.open(new FileInputStream(file.getAbsolutePath()));
        XSSFWorkbook xssfwb = new XSSFWorkbook(pkg);

        SXSSFWorkbook wb = new SXSSFWorkbook(xssfwb, 100);
        Sheet sh = wb.getSheet("Hola");

        System.out.println("Name: "+sh.getSheetName()); // Line 19
        System.out.println("Val: "+sh.getRow(1).getCell(1).getStringCellValue()); // Line 20
    }
}

Résultat:

Name: Hola
Exception in thread "main" Java.lang.NullPointerException
    at Test.main(Test.Java:20)

test.xlsx:

enter image description here

10
alditis

Veuillez consulter: question similaire SXSSFWorkBook est en écriture uniquement, il ne prend pas en charge la lecture.

Pour une lecture faible de la mémoire des fichiers .xlsx, vous devriez consulter la documentation XSSF et SAX EventModel: Gagravarr

Si la mémoire n'est pas un problème, vous pouvez utiliser une feuille XSSFS à la place, par ex.

    File file = new File("D:/temp/test.xlsx");
    FileInputStream fis = new FileInputStream(file);
    XSSFWorkbook wb = new XSSFWorkbook(fis);

    XSSFSheet sh = wb.getSheet("Hola");
    System.out.println(sh.getLastRowNum());
    System.out.println("Name: "+sh.getSheetName()); 
    Row row = sh.getRow(1);

    System.out.println(row.getRowNum());

    System.out.println("Val: "+sh.getRow(1).getCell(1).getStringCellValue()); 
26
IDKFA