2012-11-19 18 views
6

Sto cercando di creare un foglio di lavoro Excel utilizzando l'API POI in Java. In quel foglio di lavoro Excel voglio avere una cella con TIME da solo. Impostando questo possiamo includere la cella nella sommatoria di quella colonna particularia come facciamo nelle colonne numeriche. Per questo abbiamo bisogno di formattare la cella come Tempo >> 13:30:55. (Il formato interno è 'h: mm: ss; @'). E dobbiamo rimuovere la parte della data dalla cella.Impostazione dell'ora in Excel utilizzando il POI

Quando leggo la cella il valore della cella utilizzando il POI, viene restituito come 'Dom Dec 31 01:00:00 IST 1899' (Quando imposto il valore come 1:00), l'indice di formato cella è 166 e la stringa di formato della cella è 'h: mm: ss; @'.

Dopo aver impostato i formati e lo stile letti dall'eccel e dal valore di cella come 1800-December-31 e con il valore di ora, il nuovo excel mostra cella come '######' (errore) e il valore della cella è impostato come '-1'. Di seguito è riportato il codice che ho usato. Mi sono perso qualcosa? È possibile impostare il valore come richiesto.

InputStream is = new BufferedInputStream(new FileInputStream("<FileName>")); 
    XSSFWorkbook wb = new XSSFWorkbook(is); 
    is.close(); 

    XSSFSheet sheet = wb.getSheetAt(0); 
    XSSFRow row = sheet.getRow(2); 

    XSSFCell cell = row.getCell(18); 
    System.out.println("ExcelFileReader main cell.getDateCellValue() : '" + cell.getDateCellValue() + "'"); 
    System.out.println("ExcelFileReader main cell.getCellStyle().getDataFormat() : '" + cell.getCellStyle().getDataFormat() + "'"); 
    System.out.println("ExcelFileReader main cell.getCellStyle().getDataFormat() : '" + cell.getCellStyle().getDataFormatString() + "'"); 

    XSSFRow row1 = sheet.createRow(21); 
    XSSFCell cell1 = row1.createCell(2); 

    cell1.setCellStyle(cell.getCellStyle()); 
    cell1.setCellValue(cell.getDateCellValue()); 

    Calendar dummy = Calendar.getInstance(); 
    dummy.setLenient(false); 
    dummy.set(Calendar.YEAR, 1899); 
    dummy.set(Calendar.MONTH, Calendar.DECEMBER); 
    dummy.set(Calendar.DATE, 31); 

    dummy.set(Calendar.HOUR, 00); 
    dummy.set(Calendar.MINUTE, 00); 
    dummy.set(Calendar.SECOND, 00); 
    dummy.set(Calendar.MILLISECOND, 00); 

    Calendar cc = Calendar.getInstance(); 
    XSSFRow row2 = sheet.createRow(25); 
    XSSFCell cell2 = row2.createCell(2); 

    dummy.set(Calendar.HOUR, cc.get(Calendar.HOUR)); 
    dummy.set(Calendar.MINUTE, cc.get(Calendar.MINUTE)); 
    dummy.set(Calendar.SECOND, cc.get(Calendar.SECOND)); 
    dummy.set(Calendar.MILLISECOND, cc.get(Calendar.MILLISECOND)); 

    System.out.println("ExcelFileReader main dummy : '" + dummy.getTime() + "'"); 
    cell2.setCellValue(dummy.getTime()); 

    CellStyle style = wb.createCellStyle(); 
    DataFormat df = wb.createDataFormat(); 
    style.setDataFormat(df.getFormat("[h]:mm:ss;@")); 
    cell2.setCellStyle(style); 

    FileOutputStream fos = new FileOutputStream(new File("<New Excel file>")); 
    wb.write(fos); 
    fos.close(); 
    System.out.println("ExcelFileReader DONE"); 

Quanto segue è l'output del programma.

ExcelFileReader main cell.getDateCellValue() : 'Sun Dec 31 00:15:00 IST 1899' 
    ExcelFileReader main cell.getCellStyle().getDataFormat() : '166' 
    ExcelFileReader main cell.getCellStyle().getDataFormat() : 'h:mm:ss;@' 
    ExcelFileReader main dummy : 'Sun Dec 31 11:32:24 IST 1899' 
    ExcelFileReader DONE 
+0

###### possono essere visualizzati se la colonna tempo non è abbastanza ampia –

risposta

3

date e ore in Excel sono normalmente memorizzati come numeri in virgola mobile, come giorni interi e frazionari dal 1900 o 1904. Si può vedere questo digitando 0,5 in una cella di Excel e la formattazione come un tempo - che sarà mostra come 12:00:00, o imposta un valore di 1.5 e verrà visualizzato come una data in 1900/1904 come una data, 12:00:00 come un orario, o 36:00:00 se un tempo che consente > 24 ore (è un codice di formato diverso)

Ciò che si vorrà fare è accendere una copia di Excel, digitare il valore temporale che si desidera visualizzare e calcolare la stringa di formato che lo rende visibile come vuoi tu. Quindi, prendere nota di quel codice di formato e assegnarlo a PDI come formato dati per la cella. Ora, usa qualcosa come DateUtil in POI per creare il tuo oggetto Date e impostalo sulla cella come valore. Con la stringa di formato corretta, Excel mostrerà solo la parte dell'ora e non la data

+0

Grazie Gagravarr. – user1834844

3

Ho usato il seguente codice per generare la cella del tempo, in Excel utilizzando POI. E sono in grado di utilizzare la cella in

 XSSFRow row2 = sheet.createRow(25); 
     XSSFCell cell1 = row2.createCell(4); 
     XSSFCell cell2 = row2.createCell(5); 

     CellStyle style = wb.createCellStyle(); 
     DataFormat df = wb.createDataFormat(); 
     style.setDataFormat(df.getFormat("[h]:mm:ss;@")); 

     cell1.setCellFormula("TIME(0,15,00)"); // 00:15:00 
     cell1.setCellType(Cell.CELL_TYPE_FORMULA); 
     cell1.setCellStyle(style); 
     evaluator.evaluateFormulaCell(cell1); 

     cell2.setCellFormula("TIME(0,30,00)"); //00:30:00 
     cell2.setCellType(Cell.CELL_TYPE_FORMULA); 
     evaluator.evaluateFormulaCell(cell2); 
     cell2.setCellStyle(style); 
Problemi correlati