Changeset 634

Show
Ignore:
Timestamp:
01-07-10 15:03:03 (4 years ago)
Author:
tabma
Message:

- improved Excel cell type detection again, decimal values in an integer cell are parsed correctly with the test dataset

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/services/dbnp/importer/ImporterService.groovy

    r632 r634  
    6161            def index   =   c.getColumnIndex() 
    6262            def datamatrix_celltype = sheet.getRow(datamatrix_start).getCell(index).getCellType() 
     63            def datamatrix_celldata = df.formatCellValue(sheet.getRow(datamatrix_start).getCell(index)) 
    6364            def headercell = sheet.getRow(sheet.getFirstRowNum()).getCell(index) 
    6465            def tft = TemplateFieldType.STRING //default templatefield type 
    65              
     66 
    6667            // Check for every celltype, currently redundant code, but possibly this will be  
    6768            // a piece of custom code for every cell type like specific formatting 
     
    7071                    case HSSFCell.CELL_TYPE_STRING: 
    7172                            //parse cell value as double 
    72                             def parsable = true 
     73                            def doubleBoolean = true 
    7374                            def fieldtype = TemplateFieldType.STRING 
    7475 
    7576                            // is this string perhaps a double? 
    76                             try { 
    77                                 formatValue(c.getStringCellValue(), TemplateFieldType.DOUBLE) 
    78                             } catch (NumberFormatException nfe) { parsable = false } 
    79                             finally { 
    80                                 if (parsable) fieldtype = TemplateFieldType.DOUBLE 
     77                            try {                                
     78                                formatValue(datamatrix_celldata, TemplateFieldType.DOUBLE) 
     79                            } catch (NumberFormatException nfe) { doubleBoolean = false } 
     80                            finally {                            
     81                                if (doubleBoolean) fieldtype = TemplateFieldType.DOUBLE 
    8182                            } 
    8283 
     
    8889 
    8990                            break 
    90                     case HSSFCell.CELL_TYPE_NUMERIC:                     
    91                             if (HSSFDateUtil.isCellDateFormatted(c)) { 
    92                                 header[index] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), 
    93                                                                                 templatefieldtype:TemplateFieldType.DATE, 
    94                                                                                 index:index, 
    95                                                                                 entity:theEntity, 
    96                                                                                 property:property) 
     91                    case HSSFCell.CELL_TYPE_NUMERIC: 
     92                            def fieldtype = TemplateFieldType.INTEGER 
     93                            def doubleBoolean = true 
     94                            def integerBoolean = true 
     95 
     96                            // is this cell really an integer? 
     97                            try {                                
     98                                Integer.valueOf(datamatrix_celldata) 
     99                            } catch (NumberFormatException nfe) { integerBoolean = false } 
     100                            finally {                            
     101                                if (integerBoolean) fieldtype = TemplateFieldType.INTEGER 
    97102                            } 
    98                             else 
    99                                 header[index] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), 
    100                                                                                 templatefieldtype:TemplateFieldType.INTEGER, 
    101                                                                                 index:index, 
    102                                                                                 entity:theEntity, 
    103                                                                                 property:property); 
     103 
     104                            // it's not an integer, perhaps a double? 
     105                            if (!integerBoolean) 
     106                                try { 
     107                                    formatValue(datamatrix_celldata, TemplateFieldType.DOUBLE) 
     108                                } catch (NumberFormatException nfe) { doubleBoolean = false } 
     109                                finally { 
     110                                    if (doubleBoolean) fieldtype = TemplateFieldType.DOUBLE 
     111                                } 
     112 
     113                            if (HSSFDateUtil.isCellDateFormatted(c)) fieldtype = TemplateFieldType.DATE 
     114                             
     115                            header[index] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), 
     116                                                                            templatefieldtype:fieldtype, 
     117                                                                            index:index, 
     118                                                                            entity:theEntity, 
     119                                                                            property:property); 
    104120                            break 
    105121                    case HSSFCell.CELL_TYPE_BLANK: 
     
    333349                case TemplateFieldType.STRING       :   return value.trim() 
    334350                case TemplateFieldType.TEXT         :   return value.trim() 
    335                 case TemplateFieldType.INTEGER      :   return Integer.valueOf(value.replaceAll("[^0-9]","")) 
     351                case TemplateFieldType.INTEGER      :   return Integer.valueOf(value) 
    336352                case TemplateFieldType.FLOAT        :   return Float.valueOf(value.replace(",",".")); 
    337353                case TemplateFieldType.DOUBLE       :   return Double.valueOf(value.replace(",","."));