web-dev-qa-db-fra.com

Mise à jour du fichier Excel existant dans Java Apache POI

J'essaie d'écrire un programme Java qui s'exécutera quotidiennement (à l'aide d'un planificateur de tâches) et ajoutera une colonne à une feuille de calcul Excel à chaque exécution. Le problème que je rencontre est simplement réécrit le fichier, sans y ajouter. J'utilise Apache POI, voici le code correspondant:

 public static void toExcel(List<String> results, List<Integer> notActive)throws IOException{
    try {
        FileInputStream fIPS= new FileInputStream("test.xls"); //Read the spreadsheet that needs to be updated
        HSSFWorkbook wb;
        HSSFSheet worksheet;
        if(fIPS.available()>=512) {
            wb = new HSSFWorkbook(fIPS); //If there is already data in a workbook
            worksheet = wb.getSheetAt(0);
        }else{
            wb = new HSSFWorkbook();    //if the workbook was just created
            worksheet = wb.createSheet("Data");
        }
         //Access the worksheet, so that we can update / modify it
        HSSFRow row1 = worksheet.createRow(0);  //0 = row number
        int i=0;
        Cell c = row1.getCell(i);
        while (!(c == null || c.getCellType() == Cell.CELL_TYPE_BLANK)) {   //cell is empty
            i++;
            c=row1.getCell(i);
        }
        HSSFRow rowx;
        int x=0;
        for(String s : results) {
            rowx = worksheet.createRow(x);
            HSSFCell cellx = rowx.createCell(i);   //0 = column number
            cellx.setCellValue(s);
            x++;
        }
        fIPS.close(); //Close the InputStream
        FileOutputStream output_file =new FileOutputStream("test.xls");//Open FileOutputStream to write updates
        wb.write(output_file); //write changes
        output_file.close();  //close the stream

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
7
Seth

Je pense que vous créez encore et encore les nouvelles lignes et cellules et provoquez la réécriture d'Excel.

Essentiellement, vous devez obtenir les lignes et les cellules au lieu de les créer dans votre programme.

HSSFRow row1 = worksheet.createRow(0);

Vous devrez peut-être récupérer la ligne au lieu de la créer.

HSSFRow row1 = worksheet.getRow(0);

https://poi.Apache.org/apidocs/org/Apache/poi/ss/usermodel/Sheet.html#getRow (int)

Ce petit exemple met à jour la deuxième cellule de la deuxième ligne:

//Read the spreadsheet that needs to be updated
FileInputStream fsIP= new FileInputStream(new File("C:\\Excel.xls"));  
//Access the workbook                  
HSSFWorkbook wb = new HSSFWorkbook(fsIP);
//Access the worksheet, so that we can update / modify it. 
HSSFSheet worksheet = wb.getSheetAt(0); 
// declare a Cell object
Cell cell = null; 
// Access the second cell in second row to update the value
cell = worksheet.getRow(1).getCell(1);   
// Get current cell value value and overwrite the value
cell.setCellValue("OverRide existing value");
//Close the InputStream  
fsIP.close(); 
//Open FileOutputStream to write updates
FileOutputStream output_file =new FileOutputStream(new File("C:\\Excel.xls"));  
 //write changes
wb.write(output_file);
//close the stream
output_file.close();
17
Garry