【问题标题】:Read Excel and show it on tableview. Populate TableView using 2D array or List of List阅读 Excel 并将其显示在 tableview 上。使用 2D 数组或 List 的 List 填充 TableView
【发布时间】:2019-06-05 14:31:25
【问题描述】:

我的目标是读取 excel(我可以通过 Apache POI)并在 TableView (JavaFX) 上显示 excel。我可以在TableView 上显示列名,但无法在这些列中填充数据

对于我发现的许多可用资源,一个通用示例创建了一个单独的类(其中初始化了变量,写入了 getter 和 setter)并通过构造函数将值提供给 TableView。但就我而言,我无法对这些变量进行硬编码。当我知道TableView 的列数未知时,我试图填充TableView。这是我迄今为止尝试过的。

package sample;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.scene.control.TableView;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class Controller {

    @FXML public TableView tableView;

    public void quitMethod(ActionEvent actionEvent) {
        System.out.println("quit button was pressed");
        System.exit(0);
    }

    public void browseMethod(ActionEvent actionEvent) throws IOException {
        Stage stage = new Stage();

        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Select File");
        fileChooser.setInitialDirectory(new File("C:/"));
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("xls files", "*.xls"),
                new FileChooser.ExtensionFilter("xlsx files", "*.xlsx")
        );
        File file = fileChooser.showOpenDialog(stage);
        String path = file.getPath();
        ArrayList<ArrayList> excel = ReadExcel.main1(path);

        for (int i=0; i<excel.get(0).size();i++) {
            TableColumn<Controller, String> firstcol = new TableColumn<>    (excel.get(0).get(i).toString());
            tableView.getColumns().add(firstcol);
            ObservableList<ArrayList<Controller>> data = FXCollections.observableArrayList(excel.get(i));
            tableView.setItems(data);
        }

    }

}

请有人指导我如何在列中显示数据。 here is what output looks like

【问题讨论】:

  • 创建代表表格数据的模型/对象,然后按照表格视图教程进行操作。
  • 感谢@Sedrick 的回复。我无法执行您的建议。请提供有关如何实现它的进一步见解。再次感谢您。
  • 这是你可以做的其他事情 -> stackoverflow.com/questions/47885549/…

标签: java javafx


【解决方案1】:

我创建了一个演示,解释如何在列数未知时填充TableView。代码中的注释。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication124 extends Application
{
    @Override
    public void start(Stage primaryStage)
    {        
        ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();        
        final List<List<String>> excelData = readExcelFile("fileName.xlsx");//Get data from excel file
        //Add excel data to an observable list
        for(int i = 0; i < excelData.size(); i++)
        {
            data.add(FXCollections.observableArrayList(excelData.get(i)));
        }

        TableView<ObservableList<String>> tableView = new TableView();
        tableView.setItems(data);

        //Create the table columns, set the cell value factory and add the column to the tableview.
        for (int i = 0; i < excelData.get(0).size(); i++) {
            final int curCol = i;
            final TableColumn<ObservableList<String>, String> column = new TableColumn<>(
                    "Col " + (curCol + 1)
            );
            column.setCellValueFactory(
                    param -> new ReadOnlyObjectWrapper<>(param.getValue().get(curCol))
            );
            tableView.getColumns().add(column);
        }

        VBox vbox = new VBox(tableView);

        Scene scene = new Scene(vbox);

        primaryStage.setScene(scene);

        primaryStage.show();

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

    public static List<List<String>> readExcelFile(String fileName)
    {
        List<List<String>> excelContent = new ArrayList();
        int columnCounter = 0;
        int rowCounter = 0;

        try (InputStream inputStream = new FileInputStream(fileName)) {
            DataFormatter formatter = new DataFormatter();

            Workbook workbook = WorkbookFactory.create(inputStream);
            Sheet sheet = workbook.getSheetAt(0);

            for (Row row : sheet) {
                List<String> tempList = new ArrayList();

                for (Cell cell : row) {
                    String text = formatter.formatCellValue(cell);
                    System.out.print(++columnCounter + ": " + text + " - ");
                    System.out.println(text.length());
                    tempList.add(text.length() == 0 ? "" : text);
                }
                columnCounter = 0;
                excelContent.add(tempList);

                ++rowCounter;
                if (rowCounter == 5) {
                    break;
                }
            }
        }
        catch (IOException | EncryptedDocumentException ex) {
            System.out.println(ex.toString());
        }

        return excelContent;
    }
}

我将冒险出去并将这个答案归功于@jewelsea。 https://coderanch.com/t/663384/java/Populating-TableView-method

【讨论】:

  • 你好@Sedrick。感谢您的宝贵意见。我的excel格式不固定,所以事先不知道excel里面有什么字段或者多少字段。因此我不能硬编码列名。在那种情况下我该怎么办。再次感谢。
  • 当你说Here is what the output looks like 时,我假设你有固定的列。这个答案是无效的。您可以做的最好的事情是使用我在上面发布的第二个链接。该路线将允许您使用ListListString 填充TableView。 `List>
  • 谢谢@Sedrick。我会尝试code.makery.ch/library/javafx-tutorial/part2 链接。我将在进一步的更新中分享我的输出。谢了哥们。干杯...!!!!
  • 嗨@Sedrick。我正在阅读链接,该链接也有两个固定变量,即名字和姓氏。我现在该怎么办 ??。再次感谢队友。 :):)
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多