2015-07-28 8 views
5

Ich versuche, ein Java-Programm zu schreiben, das täglich ausgeführt wird (mit einem Taskplaner) und eine Spalte an eine Excel-Tabelle bei jeder Ausführung anhängen wird. Das Problem, das ich habe, ist, dass es nur die Datei neu schreibt, nicht daran anfügt. Ich bin mit Apache POI, hier ist der entsprechende Code:Aktualisieren der vorhandenen Excel-Datei in Java Apache POI

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(); 
    } 
} 

Antwort

10

Ich glaube, Sie schaffen die neuen Zeilen und Zellen wieder und wieder und verursachen das erneute Schreiben von Excel.

Im Wesentlichen müssen Sie die Zeilen und Zellen erhalten, anstatt sie in Ihrem Programm zu erstellen.

HSSFRow row1 = worksheet.createRow(0); 

Möglicherweise müssen Sie die Zeile statt der Schaffung um es zu bekommen.

HSSFRow row1 = worksheet.getRow(0); 

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

Dieses kleine Beispiel aktualisiert die zweite Zelle der zweiten Reihe:

//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(); 
+0

Garry, ich das versucht, aber ohne Erfolg. – Seth

+1

@Seth Sind Sie sicher, Sie haben alle Vorkommen von createRow mit getRow aktualisiert? – Garry

+1

@Seth .. Sie müssen auch von createCell zu getCell wechseln – Garry