3

サーバーに Excel ファイルをアップロードしています 参照 : JSP/サーブレットを使用してサーバーにファイルをアップロードする方法は?

これがエラーを引き起こす私のコードです

public static ArrayList<MOPBDMMapping> readExcel(InputStream fileInputStream)
    {

        ArrayList<MOPBDMMapping> mappings = new ArrayList<MOPBDMMapping>();
        try{
        HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
        HSSFSheet worksheet = workbook.getSheetAt(0);
        HSSFRow row1 = worksheet.getRow(0);

        int noOfRows = worksheet.getLastRowNum();

        for(int i = 1 ; i <= noOfRows ; i++){
            MOPBDMMapping mapping = new MOPBDMMapping();

            HSSFCell cell1 = row1.getCell(0);
            mapping.setMappingID(cell1.getStringCellValue());   

            HSSFCell cell2 = row1.getCell(1);
            mapping.setMopID(cell2.getStringCellValue());

            HSSFCell cell3 = row1.getCell(2);
            mapping.setMopName(cell3.getStringCellValue());

            HSSFCell cell4 = row1.getCell(3);
            mapping.setBdmID(cell4.getStringCellValue());

            HSSFCell cell5 = row1.getCell(4);
            mapping.setBdmName(cell5.getStringCellValue());

            HSSFCell cell6 = row1.getCell(5);
            mapping.setBranch(cell6.getStringCellValue());

            HSSFCell cell7 = row1.getCell(6);
            mapping.setStartDate(cell7.getDateCellValue());   //Error Line

            HSSFCell cell8 = row1.getCell(7);
            mapping.setEndDate(cell8.getDateCellValue());

            HSSFCell cell9 = row1.getCell(8);
            mapping.setActive(cell9.getStringCellValue());

            mappings.add(mapping);
        }
        System.out.println(mappings.size());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
        return mappings;
    }
}

これはスローされた例外です

java.lang.IllegalStateException: Cannot get a numeric value from a text cell
        org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:643)
        org.apache.poi.hssf.usermodel.HSSFCell.getNumericCellValue(HSSFCell.java:668)
        org.apache.poi.hssf.usermodel.HSSFCell.getDateCellValue(HSSFCell.java:689)
        com.tcs.rspm.mops.business.ExcelReader.readExcel(ExcelReader.java:52)
        com.tcs.rspm.mop.upload.ExcelUploadController.doPost(ExcelUploadController.java:42)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

これが私のサーブレットコードです

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("In controller..");
        try {
            List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
            for (FileItem item : items) {
                if (item.isFormField()) {
                    // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                    String fieldname = item.getFieldName();
                    String fieldvalue = item.getString();
                    System.out.println( "Normal Field : " + fieldname + fieldvalue);
                    // ... (do your job here)
                } else {
                    // Process form file field (input type="file").
                    String fieldname = item.getFieldName();
                    String filename = FilenameUtils.getName(item.getName());
                    System.out.println("File field : " + fieldname + filename );
                    InputStream filecontent = item.getInputStream();
                    ExcelReader.readExcel(filecontent);

                }
            }
        } catch (FileUploadException e) {
            throw new ServletException("Cannot parse multipart request.", e);
        }
        System.out.println("Out controller..");
        // ...
    }

理由は何ですか?「08/12/13」はExcelシートのエントリですか?解決策はありますか?

4

3 に答える 3

3

doc getDateCellValue() によると

セルの値を日付として取得します。文字列の場合、例外をスローします。空白セルの場合、null を返します。戻り値: 日付としてのセルの値

したがって、cell.getCellType() を使用して、セルのタイプを確認できます。そして、セル値を文字列として取得し、このように SimpleDateFormat を使用して Date オブジェクトに解析できます

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/mm/yy");
        Date date = dateFormat.parse(yourStringDateHere);

セルが日付としてフォーマットされている場合は、 http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFDateUtil.html を使用して、セルに日付値が含まれているかどうかを確認し、それから日付を取得できます

if(HSSFDateUtil.isCellDateFormatted(cell)){
            Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
        } 

また、セルが日付としてフォーマットされていない場合 (ここではそうです)、それがフォーマットであり、有効な日付であることがわかっている場合は、最初のメソッドを使用して日付を取得できます。

于 2013-10-01T12:05:03.813 に答える
0

Excel は日付を LONG (数値) として格納します。あなたが望むのは、SimpleDateFormatSTRING 日付を解析することです。

SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yy");
Date d = sdf.parse(cellValueAsString);
于 2013-10-01T12:04:39.030 に答える
0

Excelのセルは日付形式に設定されていないため、値が日付として書式設定されていても、Excelはそれを文字列として扱います。セルを日付として設定するか、文字列として読み取って日付に解析する必要があります。

于 2013-10-01T12:05:42.783 に答える