0

私のドメイン モデル

package sample

class Person {

String lastName
String firstName
Date dateOfBirth
int numberOfChildren
static constraints = {
}
} 

私のコントローラー

package sample

/*imported libraries.*/

import jxl.DateCell
import jxl.LabelCell
import jxl.NumberCell
import jxl.Sheet
import jxl.Workbook

class PersonController {
private final static int COLUMN_LAST_NAME = 0
private final static int COLUMN_FIRST_NAME = 1
private final static int COLUMN_DATE_OF_BIRTH = 2
private final static int COLUMN_NUMBER_OF_CHILDREN = 3

 def index() {
    redirect(action: "list", params: params)
}

def list(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    [personInstanceList: Person.list(params), personInstanceTotal: Person.count()]
}

def upload() { }


    def doUpload() {
    def file = request.getFile('file')
    Workbook workbook = Workbook.getWorkbook(file.getInputStream());
    Sheet sheet = workbook.getSheet(0);

    // skip first row (row 0) by starting from 1
    for (int row = 1; row < sheet.getRows(); row++) {
        LabelCell lastName = sheet.getCell(COLUMN_LAST_NAME, row)
        LabelCell firstName = sheet.getCell(COLUMN_FIRST_NAME, row)
        DateCell dateOfBirth = sheet.getCell(COLUMN_DATE_OF_BIRTH, row)
        NumberCell numberOfChildren = sheet.getCell(COLUMN_NUMBER_OF_CHILDREN, row)

        new Person(lastName:lastName.string , firstName:firstName.string ,
                dateOfBirth:dateOfBirth.date, numberOfChildren:numberOfChildren.value).save()

    }
    redirect (action:'list')
}


} 

grails データベースの .xls ファイルからデータをロードしたいのですが、データをロードしている xls ファイルが保存されず、次のエラーが発生します。クラス「jxl.biff.EmptyCell」のオブジェクト「jxl.biff.EmptyCell@47821b4b」をクラス「jxl.DateCell」にキャストできません。

4

1 に答える 1

0

場合によってdateOfBirthは、価値がないように見えます。そのような場合、空の値は日付に変換できません。can not cast class 'jxl.biff.EmptyCell' to class 'jxl.DateCell'これがスローされる理由です。

セルが空の場合は、必ず に設定dateOfBirthしてください。フィールドに制約がある場合、自動的に. nulldataOfBirthdateOfBirthexception

空は、クラスconstraints内のすべての属性が必要であることを意味します。Person明らかに、Excel シートに空のフィールドがあり、プロセス全体が停止します。空のフィールドを持つ行を無視して、適切な行を処理したい場合は、次のいずれかまたは両方を実行できます。

各フィールドが空かどうかを確認し、continue を呼び出して次の行を処理します。これは私のお勧めです。

および/または

try/catch でループ内をラップします。

    for (int row = 1; row < sheet.getRows(); row++) {
        try{
                LabelCell lastName = sheet.getCell(COLUMN_LAST_NAME, row)
                LabelCell firstName = sheet.getCell(COLUMN_FIRST_NAME, row)
                DateCell dateOfBirth = sheet.getCell(COLUMN_DATE_OF_BIRTH, row)
                NumberCell numberOfChildren = sheet.getCell(COLUMN_NUMBER_OF_CHILDREN, row)
new Person(lastName:lastName.string , firstName:firstName.string ,
                        dateOfBirth:dateOfBirth.date, numberOfChildren:numberOfChildren.value).save(failOnError: true)
        }catch(e){
          // log the error and the row number so that you know which row failed
        }

    }

どのフィールドが検証に失敗したかをよりよく理解するには、適切なフィールド検証エラー メッセージを記述します。

于 2016-02-21T15:02:50.200 に答える