2015-09-16 43 views
1

我正在嘗試開發一段代碼來將數據從Excel文件導入/導出到Java中。我完成了導入和導出到已定義的模板中(例如:Employee類,我知道Excel表在第一列中有「id」,在第二列中有「name」等等)。 我遇到的麻煩是添加列和行,以使TableView具有與導入的Excel文件相同的信息,而不管行數/列數。JavaFX將行和列動態添加到TableView

當我從Excel文件導入數據時,我將它發送到'ArrayList參數'。所以如果Excel文件有:

Id |名稱

1 | John

2 |瑪麗

當我列出了ArrayList的「參數」我得到:「ID名稱01約翰02瑪麗」

我知道我是從多少列有(因爲所有細胞=行數*列數):

columnSize = parameter.size()/importedExcel.RowNumber() 

我設法根據一般的Excel文件動態添加列。

public class ExcelObject { 
private int rowNum; 
private ArrayList<String> parameters; 

public void readExcel(String filePath, int sheetInt) { 
    try { 

    FileInputStream file = new FileInputStream(new File(filePath)); 

    XSSFWorkbook workbook = new XSSFWorkbook(file); 

    XSSFSheet sheet = workbook.getSheetAt(sheetInt); 

    Iterator<Row> rowIterator = sheet.iterator(); 

    while (rowIterator.hasNext()) 
    { 
     Row row = rowIterator.next(); 
     this.incRowNum(); 

     Iterator<Cell> cellIterator = row.cellIterator(); 

     while (cellIterator.hasNext()) 
     { 
      Cell cell = cellIterator.next(); 

      switch (cell.getCellType()) { 
       case Cell.CELL_TYPE_STRING: 
         this.parameters.add(cell.getRichStringCellValue().getString()); 
         break; 

        case Cell.CELL_TYPE_NUMERIC: 
         if (DateUtil.isCellDateFormatted(cell)) { 
          this.parameters.add(cell.getDateCellValue().toString()); 
         } else { 
          this.parameters.add(Double.toString(cell.getNumericCellValue())); 
         } 
         break; 

        case Cell.CELL_TYPE_BOOLEAN: 
         this.parameters.add("" +cell.getBooleanCellValue()); 
         break; 

        case Cell.CELL_TYPE_FORMULA: 
         this.parameters.add(cell.getCellFormula()); 
         break; 

        default: 
         System.out.println("ERROR"); 
       } 
      } 
     } 
     file.close(); 

    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

public class vfUIController implements Initializable { 
private ExcelReader read; 

@FXML 
private TableView table = new TableView(); 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    List<String> columns = new ArrayList<String>(); 

    ExcelObject obj = new ExcelObject(); 

    obj.readExcel("file.xlsx", 2); 

    for (int i = 0; i< obj.getColumnNum; i++) { 
     columns.add(obj.getParametersValue(i)); 
     System.out.println("ADDED COLUMN:" +i); 
    } 

    ArrayList<TableColumn> columns = new ArrayList<TableColumn>(); 

    for (int i = 0 ; i < obj.getColNum() ; i++) { 
     columns.add(new TableColumn(obj.getParameters().get(i))); 
    } 

    table.getColumns().addAll(columns); 

    //missing code to add rows from 'ArrayList<String> parameters' at obj.getParameterValue(int arrayListPosition) 

} 

但我似乎無法使用table.setItems()或其他方法添加任何行。我總是空白行。 我不知道如果我沒有正確使用setCellValueFactory或因爲我用來將單元格數據導入ArrayList的整個方法不智能。

總之我想將任何Excel文件信息導入到JAVA的TableView中。

感謝您的幫助。 Simon

+0

你說你不知道你是否正確使用'setCellValueFactory',但我沒有看到你調用它。你可以發佈該代碼嗎? –

+0

我根本沒有在實際的代碼中使用它。我無法找到插入有或沒有setCellValueFactory的行的方法 –

+0

如果沒有'cellValueFactory',表列將不會顯示任何數據。您需要在每列上設置一個「cellValueFactory」。 –

回答

0

在您的代碼中,您只在表視圖中添加了空列。 爲了填充您的表與數據。 你必須設置表的數據是這樣的:

private TableView<your Object type> table = new TableView<>(); 
List<your Object type> list=new ArrayList<>(); 

填充你列出,然後:

ObservableList<your Object type> fxlist=FXCollections.observableList(list); 


table.getItems().addAll(fxlist); 

數據對象類型必須是代表每行數據的類。 您的列表必須由您的exsl數據填寫。