POI – Comment définir la valeur de cellule sur Date et appliquer le format de date Excel par défaut?

J’ai utilisé Apache POI pendant un certain temps pour lire des fichiers Excel 2003 existants par programmation. Maintenant, j’ai une nouvelle exigence pour créer des fichiers entiers .xls en mémoire (toujours en utilisant Apache POI), puis les écrire dans un fichier à la fin. Le seul problème qui se pose est le traitement des cellules avec des dates.

Considérez le code suivant:

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

Lorsque j’écris le classeur contenant cette cellule dans un fichier et que je l’ouvre avec Excel, la cellule s’affiche sous la forme d’un nombre. Oui, je me rends compte qu’Excel stocke ses «dates» comme nombre de jours depuis le 1er janvier 1900 et c’est ce que représente le nombre dans la cellule.

QUESTION: Quels appels API puis-je utiliser dans POI pour lui dire que je veux un format de date par défaut appliqué à ma cellule de date?

Idéalement, je souhaite que la cellule de feuille de calcul soit affichée avec le même format de date par défaut qu’Excel lui aurait atsortingbué si un utilisateur avait ouvert manuellement la feuille de calcul dans Excel et tapé une valeur de cellule reconnue par Excel comme étant une date.

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

Pour définir le type de Excel par défaut Date (par défaut, locale / -> c’est-à-dire que xlsx sera différent lorsqu’il est ouvert par une personne allemande ou britannique et marqué d’un astérisque si vous le choisissez dans le sélecteur de format Excel), vous devez:

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

Je l’ai fait avec xlsx et ça a bien fonctionné.

Cet exemple concerne le travail avec les types de fichiers .xlsx. Cet exemple provient d’une page .jsp utilisée pour créer une feuille de calcul .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); 

J’écris ma réponse ici, car cela pourrait être utile à d’autres lecteurs, qui pourraient avoir des exigences légèrement différentes de celles du questionneur.

Je prépare un modèle .xlsx; toutes les cellules qui seront renseignées avec des dates sont déjà formatées comme des cellules de date (à l’aide d’Excel).

J’ouvre le modèle .xlsx en utilisant Apache POI, puis écris la date dans la cellule et ça marche.

Dans l’exemple ci-dessous, la cellule A1 est déjà formatée dans Excel avec le format [$-409]mmm yyyy et le code Java est utilisé uniquement pour remplir la cellule.

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

Lorsque Excel est ouvert, la date est correctement formatée.

Cet exemple de code peut être utilisé pour modifier le format de date. Ici, je veux changer de AAAA-MM-JJ à JJ-MM-AAAA. Ici pos est la position de la colonne.

 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( Ssortingng[] args ) { Ssortingng input="D:\\somefolder\\somefile.xlsx"; Ssortingng 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.getSsortingngCellValue()); } 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(); }} 

Pour connaître la chaîne de format utilisée par Excel sans avoir à la deviner: créez un fichier Excel, écrivez une date dans la cellule A1 et formatez-la comme vous le souhaitez. Ensuite, exécutez les lignes suivantes:

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

Ensuite, copiez-collez la chaîne résultante, supprimez les barres obliques inverses (par exemple, d/m/yy\ h\.mm;@ devient d/m/yy h.mm;@ ) et utilisez-la dans http: //poi.apache .org / spreadsheet / quick-guide.html # Code 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);