Changeset 634


Ignore:
Timestamp:
Jul 1, 2010, 3:03:03 PM (6 years ago)
Author:
tabma
Message:
  • improved Excel cell type detection again, decimal values in an integer cell are parsed correctly with the test dataset
File:
1 edited

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(",","."));
Note: See TracChangeset for help on using the changeset viewer.