2009-05-14 9 views
30

J'utilise l'API POI HSSF pour mes manipulations Excel en Java. J'ai une valeur de date "01/08/2009" dans une de mes cellules Excel et pendant que j'essaye de lire cette valeur en utilisant l'API HSSF, il détecte le type de cellule comme Numeric et retourne la valeur 'Double' de ma date. Voir l'exemple de code ci-dessous:Lecture de valeurs de date à partir d'une cellule Excel à l'aide de l'API POI HSSF

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() retourne NUMERIC_TYPE et donc ce code convertit la date en double! :(

Est-il possible de lire la date comme dans POI HSSF

Répondre

37

Vous pouvez jeter un oeil à:?

HSSFDateUtil.isCellDateFormatted() 

Voir l'API Horrible format de feuille de calcul POI pour plus de détails sur HSSFDateUtil:

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

qui fournit également des méthodes d'aide pour le retour Excel getExcelDate() et Java dates getJavaDate(). Vous devez être un peu méfiant des différents formats de date mais ...

+8

Je souhaite les développeurs de POI commentera leur code source ... Jon

+2

appel DateUtil.isCellDateFormatted() sera un pas en avant dans la façon de libérer votre code de HSSFs et XSSFs. En utilisant des parents globaux au lieu des enfants HSSF/XSSF dépendants de XLS/XLSX, vous pouvez rendre votre code beaucoup plus universel. –

6

Si vous en utilisant le 3,5 POI vous pouvez utiliser la méthode

de cell.getDateCellValue() suivant. Cela fonctionnera aussi pour Excel 2007.

20

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 
} 
+0

De cette façon, vous obtenez des valeurs de colonnes brutes qui ont un sens ... – Makky

0

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()); 
} 
Questions connexes