web-dev-qa-db-fra.com

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

J'utilise Apache POI depuis un certain temps pour lire par programmation les fichiers Excel 2003 existants. Il me faut maintenant créer de nouveaux fichiers .xls en mémoire (toujours avec Apache POI), puis les écrire dans un fichier à la fin. Le seul problème qui me pose problème est le traitement des cellules avec des dates.

Considérons 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 est affichée sous forme de nombre. Oui, je me rends bien compte qu'Excel stocke ses "dates" sous forme de nombre de jours depuis le 1 er janvier 1900 et correspond à ce que représente le nombre dans la cellule.

QUESTION: Quels appels d'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 la feuille de calcul soit affichée avec le même format de date par défaut que celui qu’elle lui aurait attribué si un utilisateur l’avait manuellement ouverte dans Excel et saisi une valeur de cellule que Excel a reconnue comme une date.

91
Jim Tough

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

Pour définir le type par défaut d'Excel Date (par défaut, les paramètres régionaux au niveau du système d'exploitation/-> c'est-à-dire que xlsx aura un aspect différent si elle est ouverte par une personne allemande ou britannique/et marquée d'un astérisque si vous le choisissez dans le sélecteur de format de cellule d'Excel):

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

Je l'ai fait avec xlsx et cela a bien fonctionné.

22
BlondCode

Cet exemple concerne l'utilisation de 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);
11
Mr. Port St Joe

J'écris ma réponse ici parce que cela pourrait être utile aux autres lecteurs, qui pourraient avoir une exigence légèrement différente de celle de l'auteur de la question.

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

J'ouvre le modèle .xlsx en utilisant Apache POI, puis j'écris simplement la date dans la cellule et tout fonctionne.

Dans l'exemple ci-dessous, la cellule A1 est déjà formatée à partir d'Excel au 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 l’Excel est ouvert, la date est correctement formatée.

1
gordon613

Cet exemple de code peut être utilisé pour changer le format de date. Ici, je souhaite 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( 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<Row> 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();
}}
0
Gaurav Khare

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 à votre guise. Puis lancez les lignes suivantes:

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

Copiez ensuite 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-le dans le http://poi.Apache.org/spreadsheet/quick-guide.html#CreateDateCells code:

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