POI – Come si imposta il valore della cella su Data e si applica il formato della data Excel predefinito?

Ho usato Apache POI per qualche tempo per leggere i file Excel 2003 esistenti a livello di codice. Ora ho un nuovo requisito per creare interi file .xls in memoria (utilizzando ancora POI Apache) e poi scriverli su un file alla fine. L’unico problema che mi ostacola è la gestione delle celle con le date.

Considera il seguente codice:

Date myDate = new Date(); HSSFCell myCell; // code that assigns a cell from an HSSFSheet to 'myCell' would go here... myCell.setCellValue(myDate); 

Quando scrivo la cartella di lavoro contenente questa cella in un file e la apro con Excel, la cella viene visualizzata come un numero. Sì, mi rendo conto che Excel memorizza le sue “date” come il numero di giorni dal 1 ° gennaio 1900 e questo è ciò che rappresenta il numero nella cella.

DOMANDA: Quali chiamate API posso utilizzare nel POI per dirgli che voglio applicare un formato data predefinito alla mia cella data?

Idealmente, desidero che la cella del foglio di calcolo sia visualizzata con lo stesso formato di data predefinito che Excel avrebbe assegnato se un utente avesse aperto manualmente il foglio di calcolo in Excel e inserito un valore di cella riconosciuto da Excel come data.

http://poi.apache.org/spreadsheet/quick-guide.html#CreateDateCells

 CellStyle cellStyle = wb.createCellStyle(); CreationHelper createHelper = wb.getCreationHelper(); cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("m/d/yy h:mm")); cell = row.createCell(1); cell.setCellValue(new Date()); cell.setCellStyle(cellStyle); 

Per impostare su default il tipo di Excel Data (di default a livello di sistema operativo locale / -> cioè xlsx apparirà diverso se aperto da una persona tedesca o britannica / e contrassegnato con un asterisco se lo selezioni nel selettore di formato cella di Excel) dovresti:

  CellStyle cellStyle = xssfWorkbook.createCellStyle(); cellStyle.setDataFormat((short)14); cell.setCellStyle(cellStyle); 

L’ho fatto con xlsx e ha funzionato bene.

Questo esempio è per lavorare con i tipi di file .xlsx. Questo esempio proviene da una pagina .jsp utilizzata per creare un foglio di calcolo .xslx.

 import org.apache.poi.xssf.usermodel.*; //import needed XSSFWorkbook wb = new XSSFWorkbook (); // Create workbook XSSFSheet sheet = wb.createSheet(); // Create spreadsheet in workbook XSSFRow row = sheet.createRow(rowIndex); // Create the row in the spreadsheet //1. Create the date cell style XSSFCreationHelper createHelper = wb.getCreationHelper(); XSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("MMMM dd, yyyy")); //2. Apply the Date cell style to a cell //This example sets the first cell in the row using the date cell style cell = row.createCell(0); cell.setCellValue(new Date()); cell.setCellStyle(cellStyle); 

Sto scrivendo la mia risposta qui perché potrebbe essere d’aiuto ad altri lettori, che potrebbero avere un requisito leggermente diverso rispetto all’interrogante qui.

Preparo un modello .xlsx; tutte le celle che verranno popolate con le date, sono già formattate come celle della data (utilizzando Excel).

Apro il modello .xlsx usando Apache POI e poi scrivo la data nella cella, e funziona.

Nell’esempio seguente, la cella A1 è già formattata da Excel con il formato [$-409]mmm yyyy e il codice Java viene utilizzato solo per popolare la cella.

 FileInputStream inputStream = new FileInputStream(new File("Path to .xlsx template")); Workbook wb = new XSSFWorkbook(inputStream); Date date1=new Date(); Sheet xlsMainTable = (Sheet) wb.getSheetAt(0); Row myRow= CellUtil.getRow(0, xlsMainTable); CellUtil.getCell(myRow, 0).setCellValue(date1); 

Quando Excel è aperto, la data è formattata correttamente.

Questo esempio di codice può essere utilizzato per modificare il formato della data. Qui voglio passare da aaaa-MM-gg a gg-MM-aaaa. Qui pos è la posizione della colonna.

 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; class Test{ public static void main( String[] args ) { String input="D:\\somefolder\\somefile.xlsx"; String output="D:\\somefolder\\someoutfile.xlsx" FileInputStream file = new FileInputStream(new File(input)); XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet sheet = workbook.getSheetAt(0); Iterator iterator = sheet.iterator(); Cell cell = null; Row row=null; row=iterator.next(); int pos=5; // 5th column is date. while(iterator.hasNext()) { row=iterator.next(); cell=row.getCell(pos-1); //CellStyle cellStyle = wb.createCellStyle(); XSSFCellStyle cellStyle = (XSSFCellStyle)cell.getCellStyle(); CreationHelper createHelper = wb.getCreationHelper(); cellStyle.setDataFormat( createHelper.createDataFormat().getFormat("dd-MM-yyyy")); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d=null; try { d= sdf.parse(cell.getStringCellValue()); } catch (ParseException e) { // TODO Auto-generated catch block d=null; e.printStackTrace(); continue; } cell.setCellValue(d); cell.setCellStyle(cellStyle); } file.close(); FileOutputStream outFile =new FileOutputStream(new File(output)); workbook.write(outFile); workbook.close(); outFile.close(); }} 

Per conoscere la stringa di formato utilizzata da Excel senza doverlo indovinare: creare un file excel, scrivere una data nella cella A1 e formattarla come si desidera. Quindi eseguire le seguenti righe:

 FileInputStream fileIn = new FileInputStream("test.xlsx"); Workbook workbook = WorkbookFactory.create(fileIn); CellStyle cellStyle = workbook.getSheetAt(0).getRow(0).getCell(0).getCellStyle(); String styleString = cellStyle.getDataFormatString(); System.out.println(styleString); 

Quindi copia e incolla la stringa risultante, rimuovi i backslash (ad esempio d/m/yy\ h\.mm;@ diventa d/m/yy h.mm;@ ) e usalo in http: //poi.apache .org / spreadsheet / quick-guide.html # Codice CreateDateCells :

 CellStyle cellStyle = wb.createCellStyle(); CreationHelper createHelper = wb.getCreationHelper(); cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("d/m/yy h.mm;@")); cell = row.createCell(1); cell.setCellValue(new Date()); cell.setCellStyle(cellStyle);