[POI] Erreur "Unexpected missing row when some rows already present"
Bonjour à tous,
Je me suis rendu compte que j'ai développé sur Poi pour rien... enfin a vous de me dire....
J'ai un bug qui apparemment n'est pas résolu avec la version 3.7 et 3.8beta5 à ce jour.
En effet, j'ai ce message d'erreur-ci:
Code:
1 2 3 4 5 6 7 8 9 10
|
Exception in thread "main" java.lang.RuntimeException: Unexpected missing row when some rows already present
at org.apache.poi.hssf.usermodel.HSSFSheet.setPropertiesFromSheet(HSSFSheet.java:168)
at org.apache.poi.hssf.usermodel.HSSFSheet.<init>(HSSFSheet.java:115)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:299)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:250)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:194)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:329)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:310)
at Extraction.main(Extraction.java:93) |
Lorsque j'execute ce programme (l'erreur provient de la ligne en gras):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class TrouveeDateDsFichier {
public static void main(String[] args) {
try {
HSSFWorkbook wbd;
InputStream istr;
HSSFSheet sheetd;
HSSFRow rowd;
HSSFCell celld;
String date_extract="25/01/2012";
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date datextract;
Calendar calendar = Calendar.getInstance();
int semaine = 0;
//faire une vérification pour savoir:
//si la date du fichier n'est pas trouvée sur
istr = new FileInputStream("C:/Donnees/Aide_Manager/date_extract1.xls");
//ce fichier permettra de récupérer les dates pour savoir si un extract à déjà été utilisé.
wbd = new HSSFWorkbook(istr); sheetd = wbd.getSheetAt(0);
rowd = null;
celld = null;
boolean date_stockee_trouvee = false;
int dernLigneTrouvee = 0;
for (Iterator r = sheetd.rowIterator(); r.hasNext();){
rowd = (HSSFRow) r.next();
celld = rowd.getCell(0);
//System.out.println("lalalalalala");
if(celld != null ){
if(celld.getCellType()==0){
System.out.println("c'est un nombre: "+celld.getNumericCellValue());
}else{
System.out.println("c'est une chaine: "+celld.getStringCellValue());
if(celld.getStringCellValue().equals(date_extract)){// si on trouve que la date_extract est = à la date trouvée dans le fichier
System.out.println("DATE TROUVEE Ds le fichier !");
System.out.println("CETTE EXTRACT A DEJA ETE UTILISEE !!");
System.out.println("MERCI D'UTILISER UN AUTRE EXTRACT CONCERNANT UNE AUTRE DATE !");
date_stockee_trouvee=true;
}
}
dernLigneTrouvee = rowd.getCell(0).getRowIndex();
}
}
dernLigneTrouvee++;
System.out.println("dernLigneTrouvee: "+dernLigneTrouvee);
//si la date n'est pas trouvée dans le fichier
System.out.println("date_stockee_trouvee: "+date_stockee_trouvee);
if(date_stockee_trouvee==false){
//retrouver la dernière ligne du fichier pour y ecrire la date
System.out.println("retrouver la dernière ligne du fichier: "+dernLigneTrouvee);
//pour crée la date ds le fichier
//et pour la retrouver et eviter de rajouter la validation d'un extract comportant la même date
rowd.setRowNum(dernLigneTrouvee);
sheetd.createRow(0);
celld = rowd.createCell(0);
celld.setCellValue(date_extract);
System.out.println("La nouvelle date_extract '"+date_extract+"' a été stocké dans le fichier.");
//pour ecrire dans le même fichier
FileOutputStream fileOutd = new FileOutputStream("C:/Donnees/Aide_Manager/date_extract1.xls");
wbd.write(fileOutd);
fileOutd.close();
// Date actuelle
datextract = formatter.parse(date_extract);
calendar.setTime(datextract);
semaine = calendar.get(Calendar.WEEK_OF_YEAR);//récupérer la semaine dans l'année pour faire la comparaison avec les onglet du fichier de destination
//System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));
}
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} |
le bug est référencé ici:
https://issues.apache.org/bugzilla/s...g.cgi?id=49312
et puis, j'ai constaté ce post qui date de 2006:
http://www.developpez.net/forums/d25...poi-vs-jexcel/
Trés intéressant aussi car il indique que JexcelApi consomme moins mémoire que poi.
Si quelqu'un a une idée sur ce bug, j'attend vos post.
Sinon je pense que je vais tout refaire avec JExcel.