web-dev-qa-db-fra.com

Apache POI getRow () renvoie la valeur null et échec de .createRow

J'ai le problème suivant avec Apache POI v3.12: Je dois utiliser un fichier XLSX avec 49 lignes [0..48] comme modèle, remplir ses cellules avec des données et l'écrire dans un fichier différent. afin que je puisse réutiliser le modèle à nouveau. Ce que je fais est approximativement ceci:

XSSFWorkbook wbk_template = new XSSFWorkbook(new FileInputStream    (f_wbk_template));
SXSSFWorkbook wbk = new SXSSFWorkbook(wbk_template, 50, true);

Sheet sheet = wbk.getSheet(STR_SHEET_NAME);

/ plus tard/

Row row = sheet.getRow(rownum);
if (null == row) {
    row = sheet.createRow(rownum);
}

Lors du débogage, il s’avère que getRow () renvoie null, mais la tentative de création de .createRow () échoue avec:

Java.lang.IllegalArgumentException: Attempting to write a row[2] in the range [0,48] that is already written to disk.
    at org.Apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.Java:122)
...

est-ce que j'ai râté quelque chose? Pour autant que j'ai lu dans la documentation et les forums Apache, j'ai besoin de createRow () si getRow () renvoie null. La feuille ne contient aucune ligne selon .getPhysicalRows (), .getFirstRowNum () et .getLastRowNum ()

Merci.

12
Plamen Vasilev

Consultez la documentation du constructeur SXSSFWorkbook qui prend XSSFWorkbook comme paramètre. Vous ne pouvez pas remplacer ou accéder aux premières lignes du fichier de modèle. Vous essayez d'écraser une ligne existante et l'API ne le prend pas en charge. Votre message d'exception reflète cela. 

https://poi.Apache.org/apidocs/org/Apache/poi/xssf/streaming/SXSSFWorkbook.html#SXSSFWorkbook(org.Apache.poi.xssf.usermodel.XSSFWorkbook)

Pour votre cas d'utilisation, vous pouvez essayer http://jxls.sourceforge.net

9
IceMan

Si vous souhaitez lire ou modifier une ligne existante, commencez par le faire avec le type xssf, puis créez la base de fichier sxssf sur le fichier xssf.
Le code est quelque chose comme ci-dessous ... 

XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(file));

//do the read and edit operation with xssf......
......
......

SXSSFWorkbook sXSSFbook = new SXSSFWorkbook(xssfWorkbook); 

//do the write operation with sxssf......
......
......
0
jacky