首页 > 解决方案 > 如何从 xlsx 加载数据 - javafx

问题描述

有人可以帮助我创建代码吗?我从 Java 开始,下一步我想在 xlsx 文件中创建数据。计划:当我打开应用程序时,来自 xlsx 的数据将自动导入到表中。当我向表中添加新行时,此行将被添加到 xlsx 文件中。

控制器:

package sample.Controllers;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import sample.Utils.StopLista;
import java.net.URL;
import java.util.ResourceBundle;


public class StopController implements Initializable {




    @FXML
    private TableView<StopLista> tableView;
    @FXML
    private TableColumn<StopLista, String> dateColumn;
    @FXML
    private TableColumn<StopLista, String> orderColumn;
    @FXML
    private TableColumn<StopLista, String> modelColumn;
    @FXML
    private TableColumn<StopLista, String> changeColumn;
    @FXML
    private TableColumn<StopLista, String> timeColumn;
    @FXML
    private TableColumn<StopLista, String> personColumn;
    @FXML
    private TableColumn<StopLista, String> commentsColumn;


    @FXML
    TextField dateText;
    @FXML
    TextField orderText;
    @FXML
    TextField modelText;
    @FXML
    TextField changeText;
    @FXML
    TextField timeText;
    @FXML
    TextField personText;
    @FXML
    TextField commentsText;

    public StopController() {
    }


    @Override
    public void initialize(URL location, ResourceBundle resources) {
        dateColumn.setCellValueFactory(new PropertyValueFactory<StopLista, String>("data"));
        orderColumn.setCellValueFactory(new PropertyValueFactory<StopLista, String>("zlecenie"));
        modelColumn.setCellValueFactory(new PropertyValueFactory<StopLista, String>("model"));
        changeColumn.setCellValueFactory(new PropertyValueFactory<StopLista, String>("zmiana"));
        timeColumn.setCellValueFactory(new PropertyValueFactory<StopLista, String>("czas"));
        personColumn.setCellValueFactory(new PropertyValueFactory<StopLista, String>("osoba"));
        commentsColumn.setCellValueFactory(new PropertyValueFactory<StopLista, String>("uwagi"));
        tableView.setItems(addList());



        tableView.setEditable(true);
        dateColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        orderColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        modelColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        changeColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        timeColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        personColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        commentsColumn.setCellFactory(TextFieldTableCell.forTableColumn());


    }

    public void addRowToTable() {
        StopLista nowyRekord = new StopLista(dateText.getText(), orderText.getText(), modelText.getText(),
                changeText.getText(), timeText.getText(), personText.getText(), commentsText.getText());
        tableView.getItems().add(nowyRekord);


        dateText.clear();
        orderText.clear();
        modelText.clear();
        changeText.clear();
        timeText.clear();
        personText.clear();
        commentsText.clear();
    }

    public void delateRowTable() {
        ObservableList<StopLista> wybranyRekord, wszystkieRekordy;
        try {
            wszystkieRekordy = tableView.getItems();
            if (wszystkieRekordy.size() != 0) {
                wybranyRekord = tableView.getSelectionModel().getSelectedItems();
                wybranyRekord.forEach(wszystkieRekordy::remove);
            }
        } catch (Exception e) {
            //tabela jest pusta - nic się nie dzieje
        }

    }

    public ObservableList<StopLista> addList() {
        ObservableList<StopLista> orderList = FXCollections.observableArrayList();





        return orderList;
    }

    public void editData(TableColumn.CellEditEvent cellEditEvent){
        StopLista zmDaty = tableView.getSelectionModel().getSelectedItem();
        zmDaty.setData(cellEditEvent.getNewValue().toString());


    }

    public void editOrder(TableColumn.CellEditEvent cellEditEvent){
        StopLista zmZlecenia = tableView.getSelectionModel().getSelectedItem();
        zmZlecenia.setZlecenie(cellEditEvent.getNewValue().toString());


    }

    public void editModel(TableColumn.CellEditEvent cellEditEvent){
        StopLista zmModelu = tableView.getSelectionModel().getSelectedItem();
        zmModelu.setModel(cellEditEvent.getNewValue().toString());


    }

    public void editChange(TableColumn.CellEditEvent cellEditEvent){
        StopLista zmZmiany = tableView.getSelectionModel().getSelectedItem();
        zmZmiany.setZmiana(cellEditEvent.getNewValue().toString());


    }

    public void editTime(TableColumn.CellEditEvent cellEditEvent){
        StopLista zmCzasu = tableView.getSelectionModel().getSelectedItem();
        zmCzasu.setCzas(cellEditEvent.getNewValue().toString());


    }

    public void editPerson(TableColumn.CellEditEvent cellEditEvent){
        StopLista zmOsoby = tableView.getSelectionModel().getSelectedItem();
        zmOsoby.setOsoba(cellEditEvent.getNewValue().toString());


    }

    public void editComments(TableColumn.CellEditEvent cellEditEvent){
        StopLista zmUwag = tableView.getSelectionModel().getSelectedItem();
        zmUwag.setUwagi(cellEditEvent.getNewValue().toString());


    }





}

getter 设置器和控制器

package sample.Utils;

import javafx.beans.property.SimpleStringProperty;

public class StopLista {

    private SimpleStringProperty data, zlecenie, model, zmiana, czas, osoba, uwagi;

    public StopLista(String data, String zlecenie, String model,
                     String zmiana, String czas, String osoba,
                     String uwagi) {
        this.data = new SimpleStringProperty(data);
        this.zlecenie = new SimpleStringProperty(zlecenie);
        this.model = new SimpleStringProperty(model);
        this.zmiana = new SimpleStringProperty(zmiana);
        this.czas = new SimpleStringProperty(czas);
        this.osoba = new SimpleStringProperty(osoba);
        this.uwagi = new SimpleStringProperty(uwagi);
    }

    public String getData() {
        return data.get();
    }

    public SimpleStringProperty dataProperty() {
        return data;
    }

    public void setData(String data) {
        this.data.set(data);
    }

    public String getZlecenie() {
        return zlecenie.get();
    }

    public SimpleStringProperty zlecenieProperty() {
        return zlecenie;
    }

    public void setZlecenie(String zlecenie) {
        this.zlecenie.set(zlecenie);
    }

    public String getModel() {
        return model.get();
    }

    public SimpleStringProperty modelProperty() {
        return model;
    }

    public void setModel(String model) {
        this.model.set(model);
    }

    public String getZmiana() {
        return zmiana.get();
    }

    public SimpleStringProperty zmianaProperty() {
        return zmiana;
    }

    public void setZmiana(String zmiana) {
        this.zmiana.set(zmiana);
    }

    public String getCzas() {
        return czas.get();
    }

    public SimpleStringProperty czasProperty() {
        return czas;
    }

    public void setCzas(String czas) {
        this.czas.set(czas);
    }

    public String getOsoba() {
        return osoba.get();
    }

    public SimpleStringProperty osobaProperty() {
        return osoba;
    }

    public void setOsoba(String osoba) {
        this.osoba.set(osoba);
    }

    public String getUwagi() {
        return uwagi.get();
    }

    public SimpleStringProperty uwagiProperty() {
        return uwagi;
    }

    public void setUwagi(String uwagi) {
        this.uwagi.set(uwagi);
    }
}

有人可以帮助我或展示如何做到这一点吗?

标签: javafxapache-poitableviewxlsx

解决方案


我创建了一个演示应用程序,它使用一个按钮打开一个允许输入新人员的弹出窗口。它还有一个演示如何在没有弹出窗口的情况下进行操作。对于删除,我只展示一种方式。只有在表格中选择了一行时,您才能使用删除按钮从表格中删除人员。我还喜欢在所选行上使用上下文菜单从表中删除。我没有在这里展示。

主要的

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

/**
 * JavaFX App
 */
public class App extends Application {
    @Override
    public void start(Stage stage) {
        try {
            Parent root = FXMLLoader.load(App.class.getResource("primary.fxml"));
            Scene scene = new Scene(root);
            stage.setResizable(false);
            stage.setTitle("FXML Welcome");
            stage.setScene(scene);
            stage.show();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

控制器

import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class PrimaryController implements Initializable{

    @FXML TableView<Person> tvPerson;
    @FXML TableColumn<Person, String> tcFirstName, tcLastName;
    @FXML Button btnAddNewPerson2;
    @FXML TextField tfFirstName, tfLastName;

    ObservableList<Person> obsPerson = FXCollections.observableArrayList();

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        tcFirstName.setCellValueFactory(new PropertyValueFactory("firstName"));
        tcLastName.setCellValueFactory(new PropertyValueFactory("lastName"));

        List<Person> persons = new ArrayList();
        persons.add(new Person("John", "Doe"));
        persons.add(new Person("Jane", "Doe"));

        obsPerson.addAll(persons);
        tvPerson.setItems(obsPerson);

        //Bind button to the textfields text properties
        btnAddNewPerson2.disableProperty().bind(
            Bindings.isEmpty(tcFirstName.textProperty())
                .or(Bindings.isEmpty(tfLastName.textProperty()))
        );

        btnAddNewPerson2.setOnAction((actionEvent) -> {
            obsPerson.add(new Person(tfFirstName.getText(), tfLastName.getText()));
        });
    }



    @FXML
    private void handleBtnAddNewPerson(ActionEvent event){
        Stage stage = new Stage();

        //Create Nodes to be used in popup
        TextField ltfFirstName = new TextField();
        ltfFirstName.setPromptText("Enter First Name");
        TextField ltfLastName = new TextField();
        ltfLastName.setPromptText("Enter Last Name");
        Button lbtnAddNewPerson = new Button("Add");
        lbtnAddNewPerson.setOnAction((t) -> {
            //Handle updating Excel file and tableview here!
            obsPerson.add(new Person(ltfFirstName.getText(), ltfLastName.getText()));
        });
        lbtnAddNewPerson.requestFocus();//Give this button focus

        //Bind add button to textfield text property
        lbtnAddNewPerson.disableProperty().bind(
            Bindings.isEmpty(ltfFirstName.textProperty())
                .or(Bindings.isEmpty(ltfLastName.textProperty()))
        );
        //Use to cancel
        Button lbtnCancel = new Button("Cancel");
        lbtnCancel.setOnAction((t) -> {
            stage.close();
        });

        VBox root = new VBox(ltfFirstName, ltfLastName, lbtnAddNewPerson, lbtnCancel);
        Scene scene = new Scene(root);

        stage.setResizable(false);
        stage.setTitle("Add New Person");
        stage.setScene(scene);
        stage.initOwner(((Stage)((Button)event.getSource()).getScene().getWindow()));
        stage.showAndWait();
    }

    @FXML
    private void handleBtnDeletePerson(ActionEvent event) {
        if(tvPerson.getSelectionModel().getSelectedItem() != null)
        {
            obsPerson.remove(tvPerson.getSelectionModel().getSelectedItem());
        }
        else{
            Alert alert = new Alert(AlertType.INFORMATION);
            alert.setTitle("Information Dialog");
            alert.setHeaderText("Look, an Information Dialog");
            alert.setContentText("You need to select a Person to delete!");

            alert.showAndWait();
        }
    }
}

FXML

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<VBox alignment="CENTER" prefHeight="396.0" prefWidth="619.0" spacing="20.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sed.test.mavenfxmltestingground.PrimaryController">
   <children>
      <TableView fx:id="tvPerson" prefHeight="200.0" prefWidth="200.0">
        <columns>
          <TableColumn fx:id="tcFirstName" prefWidth="290.0" text="First Name" />
          <TableColumn fx:id="tcLastName" prefWidth="287.0" text="Last Name" />
        </columns>
      </TableView>
      <Button fx:id="btnAddNewPerson" onAction="#handleBtnAddNewPerson" text="Add New Person" />
      <Button fx:id="btnDeletePerson" mnemonicParsing="false" onAction="#handleBtnDeletePerson" text="Delete Person" />
      <HBox alignment="CENTER" spacing="10.0">
         <children>
            <TextField fx:id="tfFirstName" prefWidth="200.0" />
            <TextField fx:id="tfLastName" prefWidth="200.0" />
            <Button fx:id="btnAddNewPerson2" mnemonicParsing="false" text="Add New Person" />
         </children>
      </HBox>
   </children>
   <padding>
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
   </padding>
</VBox>

推荐阅读