web-dev-qa-db-fra.com

Lecture des valeurs de date à partir d'une cellule Excel à l'aide de l'API POI HSSF

J'utilise l'API POI HSSF pour mes manipulations Excel en Java. J'ai une valeur de date "01/08/2009" dans l'une de mes cellules Excel et pendant que j'essaie de lire cette valeur à l'aide de l'API HSSF, le type de cellule est Numeric et renvoie la valeur "Double" de ma date. Voir l'exemple de code ci-dessous:

cell = row.getCell(); // date in the cell '8/1/2009'
switch (cell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:
    cellValue = cell.getRichStringCellValue().getString();
    break;
case HSSFCell.CELL_TYPE_NUMERIC:
    cellValue = new Double(cell.getNumericCellValue()).toString();
    break;
default:
}

Cell.getCellType () renvoie NUMERIC_TYPE et ce code convertit donc la date en double! :(

Y a-t-il un moyen de lire la date telle qu'elle est dans POI HSSF!?

30
Veera

Vous pouvez jeter un oeil à:

HSSFDateUtil.isCellDateFormatted()

Voir l’API Horrible Spreadsheet Format de POI pour plus de détails sur HSSFDateUtil:

http://poi.Apache.org/apidocs/org/Apache/poi/hssf/usermodel/HSSFDateUtil.html

Cela fournit également des méthodes d'assistance pour renvoyer Excel getExcelDate() et les dates Java getJavaDate(). Vous devez cependant vous méfier des formats de date différents ...

37
Jon

Si vous souhaitez référencer la date dans le même format que dans le fichier Excel, vous devez utiliser CellDateFormatter. Exemple de code:

CellValue cValue = formulaEv.evaluate(cell);
double dv = cValue.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
    Date date = HSSFDateUtil.getJavaDate(dv);

    String dateFmt = cell.getCellStyle().getDataFormatString();
    /* strValue = new SimpleDateFormat(dateFmt).format(date); - won't work as 
    Java fmt differs from Excel fmt. If Excel date format is mm/dd/yyyy, Java 
    will always be 00 for date since "m" is minutes of the hour.*/

    strValue = new CellDateFormatter(dateFmt).format(date); 
    // takes care of idiosyncrasies of Excel
}
21
Sayantam

Excel traite les dates et les heures comme des chiffres ... Jon l'a dit mieux, donc je ne lui ferai pas l'écho ici ... 

Cependant, vous trouverez un exemple de code pour ce que vous avez mis dans la question à l'adresse http://poi.Apache.org/spreadsheet/quick-guide.html#CellContents

6
Stobor

Si vous utilisez le POI 3.5, vous pouvez utiliser les éléments suivants

méthode cell.getDateCellValue (). Cela fonctionnera également pour Excel 2007.

6
Naveen

Depuis POI 3.15 beta3, certaines fonctions sont deprecated. Vous pouvez vérifier le format des données et les récupérer en tant que Java Date.

SimpleDateFormat format = new SimpleDateFormat("");
String cellValue;
if(cell != null && cell.getCellTypeEnum() != CellType.STRING &&
    cell.getCellTypeEnum() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)){

    cellValue = format.format(cell.getDateCellValue());
}
0
Michał Piątkowski