JavaFX向TableView动态添加行和列

JavaFX向TableView动态添加行和列,java,excel,javafx,tableview,Java,Excel,Javafx,Tableview,我试图开发一段代码,将Excel文件中的数据导入/导出到Java中。我已经完成了导入和导出到已定义模板中(例如:Class Employee,我知道Excel工作表在第1列中有“id”,在第2列中有“name”,依此类推)。 我遇到的问题是添加列和行,以便使TableView具有与导入的Excel文件相同的信息,而不管行/列的数量如何 从Excel文件导入数据时,会将其发送到“ArrayList参数”。因此,如果Excel文件具有: Id |名称 1 |约翰 2 |玛丽 当我列出ArrayLis

我试图开发一段代码,将Excel文件中的数据导入/导出到Java中。我已经完成了导入和导出到已定义模板中(例如:Class Employee,我知道Excel工作表在第1列中有“id”,在第2列中有“name”,依此类推)。 我遇到的问题是添加列和行,以便使TableView具有与导入的Excel文件相同的信息,而不管行/列的数量如何

从Excel文件导入数据时,会将其发送到“ArrayList参数”。因此,如果Excel文件具有:

Id |名称

1 |约翰

2 |玛丽

当我列出ArrayList“parameter”时,我会得到:“Id Name 01 John 02 Mary”

我知道我有多少列(因为所有单元格=行数*列数):

我已经设法根据通用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)

}
公共类对象{
私有int rowNum;
私有ArrayList参数;
public void readExcel(字符串文件路径,int sheetInt){
试一试{
FileInputStream file=newfileinputstream(新文件(filePath));
XSSF工作簿=新XSSF工作簿(文件);
XSSFSheet sheet=workbook.getSheetAt(sheetInt);
迭代器rowIterator=sheet.Iterator();
while(roweiterator.hasNext())
{
行=行迭代器。下一步();
this.incRowNum();
迭代器cellIterator=row.cellIterator();
while(cellIterator.hasNext())
{
Cell=cellIterator.next();
开关(cell.getCellType()){
case Cell.Cell\u类型\u字符串:
添加(cell.getRichStringCellValue().getString());
打破
case Cell.Cell\u类型\u数值:
if(DateUtil.isCellDateFormatted(单元格)){
添加(cell.getDateCellValue().toString());
}否则{
add(Double.toString(cell.getNumericCellValue());
}
打破
case Cell.Cell\u类型\u布尔值:
this.parameters.add(“+cell.getBooleanCellValue());
打破
case Cell.Cell_类型_公式:
this.parameters.add(cell.getCellFormula());
打破
违约:
System.out.println(“错误”);
}
}
}
file.close();
}
捕获(例外e)
{
e、 printStackTrace();
}
}
公共类vfler实现可初始化{
私人阅读;
@FXML
private TableView table=new TableView();
@凌驾
公共void初始化(URL、ResourceBundle rb){
列表列=新的ArrayList();
ExcelObject obj=新的ExcelObject();
obj.readExcel(“file.xlsx”,2);
for(int i=0;i
但是我似乎无法使用
table.setItems()
或其他方法添加任何行。我总是得到空白行。 我不确定是否因为未正确使用
setCellValueFactory
而失败,或者因为我用于将单元格数据导入ArrayList的整个方法不智能

总之,我想将任何Excel文件信息导入到JAVA的TableView中

谢谢你的帮助。
Simon

在代码中,您只向表视图添加了空列。 以便用数据填充表。 您必须像这样设置表数据:

 private TableView<your Object type> table = new TableView<>();
List<your Object type> list=new ArrayList<>();
private TableView table=new TableView();
列表=新的ArrayList();
填写您的列表,然后:

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


table.getItems().addAll(fxlist);
observeListFXList=FXCollections.observeList(列表);
table.getItems().addAll(fxlist);
数据对象类型必须是表示每行数据的类。
您的列表必须由exsl数据填充。

在代码中,您只向表视图添加了空列。 以便用数据填充表。 您必须像这样设置表数据:

 private TableView<your Object type> table = new TableView<>();
List<your Object type> list=new ArrayList<>();
private TableView table=new TableView();
列表=新的ArrayList();
填写您的列表,然后:

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


table.getItems().addAll(fxlist);
observeListFXList=FXCollections.observeList(列表);
table.getItems().addAll(fxlist);
数据对象类型必须是表示每行数据的类。
您的列表必须由exsl数据填写。

您说您不知道是否正确使用了
setCellValueFactory
,但我看不出您这样称呼。您能发布该代码吗?我根本没有在实际代码中使用它。我找不到一种方法来插入包含或不包含setCellValueFactory的行而不包含
cellValueFactory
表列将没有任何数据可显示。您需要在每列上设置一个
cellValueFactory
。但是,如果数据都收集在“ArrayList参数”中,如何设置cellValueFactory。我无法“附加”变量“parameter”的一列,或者我将Excel文件中的所有信息都放在一列中。只需从数组列表中获取相应的元素,将其包装在
ReadOnlyStringWrapper
中,然后从工厂返回。类似的示例:您说您不知道是否正确使用
setCellValueFactory
,但我不知道“我看不出你在这么叫。你能发布那段代码吗?我根本没有在实际代码中使用它。我找不到插入行的方法,不管有没有setCellValueFactory,如果没有
cellValueFactory
表列将没有任何数据可显示。你需要设置
cellValueFactory