所以我想从excel文件构建TableView。
这个Excel文件没有定义的列数,所以如果我加载第一个excel文件,它可以有5列,第二个可以有7个等等...
我的问题是我不知道如何在TableView中创建这个“动态”列数。
TableColumn [] tc = new TableColumn[r.getPhysicalNumberOfCells()];
for(int i=0;i< r.getPhysicalNumberOfCells();i++){
tc[i] = new TableColumn(r.getCell(i).toString());
tc[i].setCellValueFactory(
new PropertyValueFactory<String,String>(??????)
);
excelTable.getColumns().add(tc[i]);
}
因此,以下内容创建列并设置其名称。但现在我想从excel加载数据行到表。令人不安的部分是“??????”是。由于我不知道我的列的名称是什么,所以我无法使用属性创建类。
整个代码:
public class ExcelController {
final static Logger logger = LoggerFactory.getLogger(ExcelMethods.class);
private ExcelMethods ex;
@FXML
TableView excelTable;
@FXML
Pane rootPane;
public void initialize() {
logger.info("Excel controller initalized");
ex = new ExcelMethods();
}
/**
* select and load excel file into program
* loading excel file into system is
* happening here
*/
public void loadExcelSheet() {
logger.info("loadExcelSheet function selected");
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open Excel File");
File excel = fileChooser.showOpenDialog(rootPane.getScene().getWindow());
if (excel != null) {
logger.info("File loaded successfully");
Path path = Paths.get(excel.getPath());
ex.loadWorkbook(path);
loadTableData();
} else
logger.info("User did not select any file to load");
}
public void saveExcelSheet() {
logger.info("saveExcelSheet function selected");
DirectoryChooser dirChooser = new DirectoryChooser();
dirChooser.setTitle("Save Excel File");
File excel = dirChooser.showDialog(rootPane.getScene().getWindow());
if (excel != null) {
logger.info("File selected successfully");
Path path = Paths.get(excel.getPath());
ex.saveExcel(ex.wb, path);
} else
logger.info("User did not select any file to save into");
}
/**
* loads table from loaded excel file
*/
public void loadTableData() {
List<String> columns = new ArrayList<String>();
ObservableList<ObservableList<String>> excelData = FXCollections.observableArrayList();
logger.info("Populating table ...");
excelTable.setEditable(true);
excelTable.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
Sheet sh = ex.selectSheet(ex.wb);
Row r = ex.getRow(sh, 0);
//laod columsn into List
for(int i=0;i<r.getPhysicalNumberOfCells();i++){
columns.add(r.getCell(i).toString());
}
for(int i=0;i<r.getPhysicalNumberOfCells();i++){
final int finalIdx = i;
TableColumn<ObservableList<String>, String> column = new TableColumn<>(columns.get(i));
column.setCellValueFactory(
param -> new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)));
excelTable.getColumns().add(column);
}
r = ex.getRow(sh, 1);
for(int i=0;i<15;i++){
ObservableList<String> row = FXCollections.observableArrayList();
row.add(r.getCell(i).toString());
excelData.add(row);
}
excelTable.setItems(excelData);
}
}