2017-12-08 10 views
0

私はschoolprojectのtestdateを開く必要があります。このテスト日は、数字、文字、日付、時刻を含むExcel(xlsx)ファイルです。しかし、下のコードではExcelファイルが読み込まれますが、私は42538.01.153481443E9のような奇妙な数字を取得します。後日。進された後、ExcelでApoche POIを使用してjavaでexcel(xlsx)ファイルを読む(奇妙な数字を取得する)

public class Page4_Controller implements Initializable { 

    @FXML 
    private Button button1; 

    public void Button1Action(ActionEvent event) throws IOException { 
     //Initialize excel file 
     FileChooser fc = new FileChooser(); 
     fc.getExtensionFilters().addAll(
       new ExtensionFilter("Excel Files", "*.xlsx")); 
     File selectedFile = fc.showOpenDialog(null); 

     // Read file 
     readXLSXFile(selectedFile.getAbsolutePath()); 
    } 

    public static void readXLSXFile(String excelFilePath) throws IOException { 
     FileInputStream fys = new FileInputStream(new File(excelFilePath)); 

     //Create workbook instance that refers to .xlsx file 
     XSSFWorkbook wb = new XSSFWorkbook(fys); 

     //Create a sheet object to retrive the sheet 
     XSSFSheet sheet = wb.getSheetAt(0); 

     //That is for evalueate the cell type 
     FormulaEvaluator forlulaEvaluator = wb.getCreationHelper().createFormulaEvaluator(); 
     DataFormatter df = new DataFormatter(); 

     //Default data for database (comes later) 
     //String airport = sheet.getRow(1).getCell(1).getStringCellValue(); 
     //Date date = sheet.getRow(2).getCell(1).getDateCellValue(); 

     for (Row row : sheet) { 
      for (Cell cell : row) { 
       switch (forlulaEvaluator.evaluateInCell(cell).getCellType()) { 
        //If cell is a numeric format 
        case Cell.CELL_TYPE_NUMERIC: 
         System.out.print(cell.getNumericCellValue() + "\t"); 
         System.out.print(df.formatCellValue(cell) + "\t"); 
         break; 
        //If cell is a string format 
        case Cell.CELL_TYPE_STRING: 
         System.out.print(cell.getRichStringCellValue() + "\t"); 
         break; 
       } 

      } 
      System.out.println(); 
     } 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
    } 

} 
+1

42538.0は、日付(2016-06-17 00:00)とすることができます。セルタイプがDATEであるかどうかを確認し、それに応じて処理する必要があります。 – Stefan

+0

日付は次のように書かれています:Date Found:17-Jun-2016、セルタイプはdateです。 –

答えて

0

日付は小数点の前の部分は、1900年1月1日からの日数である「シリアル番号」、および一部として表されその日の分数なので、正午は0.5です。したがって、番号自体を取得する場合は、変換を手動で行う必要があります。

POIはあなたのために変換を行うことができます。例については、How to read Excel cell having Date with Apache POI?を参照してください。

+0

私の英語はそれほど良くなく、私はプログラミングに慣れていません。私のコードで変更して投稿できますか?本当に感謝されるだろう:) –

+1

いいえ。投稿したリンクは、それを行う方法の素晴らしい例です。 編集:コードはここでフォーマットされません。リンク先の記事の回答を参照してください。 – SurfMan

+0

あなたが投稿したリンクは自分のコードとは関係ありません。特定の行のためのsaisですが、それは私が望むものではありません..... –

0

これで私はJavaで読まなければならないExcelファイル enter image description here

2

日付は二重の値と文字列としてセルの書式設定された値を返しますDataFormatter.formatCellValue(電池セル)として、Excelで内部的に保存されています細胞の種類にかかわらず。したがって、df.formatCellValue(cell)を呼び出すと、セルのdouble値を文字列として返します。日付としてコードをセルの値を印刷するために

はこれです:

switch (cell.getCellType()) { 
    // ... 
    case CellType.NUMERIC: 
     // Check if a cell contains a date. Since dates are stored internally in Excel as double values we infer it is a date if it is formatted as such. 
     if (DateUtil.isCellDateFormatted(cell)) { 
      // Get the value of the cell as a date. Returns a java.util.Date. 
      System.out.println(cell.getDateCellValue()); 
     } else { 
      System.out.println(cell.getNumericCellValue()); 
     } 
    // ... 
} 

出典:

だけの時間を含む

Excelのセルは、その日付の部分は、12月31日1899年に固定されているEDITあなたは、細胞は、時間または日付であるかどうかを確認するために、この情報を使用することができます。それは1899年であれば、年を抽出それは時間セルです。

SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); 
SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy"); 
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 

switch (cell.getCellType()) { 

    case CellType.NUMERIC: 
    if (DateUtil.isCellDateFormatted(cell)) { 
     Date dateCellValue = cell.getDateCellValue(); 
     String year = yearFormat.format(dateCellValue); 
     if (year.equals("1899")) 
      System.out.println(timeFormat.format(dateCellValue)); 
     else 
      System.out.println(dateFormat.format(dateCellValue)); 
    } else { 
     System.out.println(cell.getNumericCellValue()); 
    } 

} 
+0

私はあなたのコードでこれを取得しています:日付:9月10日土00:00:00 CEST 2016年、これは私が欲しいものです:日付:10-sep-2016 \tしかし、私はこれを取得しています:日付:42623.0 \t 10-sep-2016の上に私のコードを入れてください。 –

+0

あなたは正しい日付を取得しています。必要なだけフォーマットする必要があります。あなたはSimpleDateFormatを使うことができますsdf = new SimpleDateFormat( "dd-MM-yyyy"); System.out.println(sdf.format(cell.getDateCellValue())); – Luke

+0

ありがとう、私はそれが読んでいるように、日付を読んで働いたが、今はそれも日付のように例19:25のTIMEを読み取ります。だからそれは19:25でなければならないが、それは私に3199年12月1899を与える。 –

関連する問題