1

I want to import an Excel file that contains large data in a TableView and filter the data and show the filtering in the TableView then export a new Excel file.

I started by importing the Excel file, for that I'm using Apache but I have a problem in a workbook that returns Java.lang.reflect.InvocationTargetException error:

Controller Class:

public class Controller implements Initializable {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    //-------------TABLE COLUMN------------
    @FXML // fx:id="firstNameCol"
    private TableColumn<Data, String> nb1;

    @FXML // fx:id="lastNameCol"
    private TableColumn<Data, String> account;

    @FXML // fx:id="netIDCol"
    private TableColumn<Data, String> nb2;

    @FXML // fx:id="ageCol"
    private TableColumn<Data, Number> nb3;

    @FXML // fx:id="gpaCol"
    private TableColumn<Data, Number> idClient;

    @FXML // fx:id="majorCol"
    private TableColumn<Data, String> amount;

    @FXML // fx:id="uinCol"
    private TableColumn<Data, String> name;

    @FXML // fx:id="genderCol"
    private TableColumn<Data, String> gender;

    @FXML // fx:id="genderCol"
    private TableColumn<Data, String> typeAccount;

    //-----------------TEXT FIELD---------
    @FXML // fx:id="nameField"
    private TextField nameField;

    @FXML // fx:id="clientIDField"
    private TextField clientIDField;

    @FXML // fx:id="impIDField"
    private TextField impIDField;

    //----------Combo Box---------------
    ObservableList<String> accountBoxData = FXCollections.observableArrayList("1", "2", "3", "4", "5");

    @FXML // fx:id="accountBox"
    private ComboBox<String> accountBox = new ComboBox<>();


    @FXML
    private TableView<Data> dataTableView;
    //--------------- BUTTON--------------
    @FXML // fx:id="clearBtn"
    private Button clearBtn;

    @FXML // fx:id="filterBtn"
    private Button filterBtn;
    //-----------------MENU BAR-------------
    @FXML
    private MenuBar fileMenu;
    //-----------------Observable Data List-------------


    @Override
    public void initialize(URL location, ResourceBundle resources) {
        accountBox.setItems(accountBoxData);
    }



    public void load(ActionEvent event) throws IOException {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Open file");
        File file = fileChooser.showOpenDialog(accountBox.getScene().getWindow());
        System.out.println(file.getPath());
        FileInputStream fileIn = new FileInputStream(file.getPath());
        Workbook workbook = WorkbookFactory.create(fileIn);
        Sheet sheet = workbook.getSheetAt(0);


        for (int rowIndex = 0; rowIndex < sheet.getLastRowNum(); rowIndex++) {
            Row row = sheet.getRow(rowIndex);

            Data data = new Data();


            if (row.getCell(0) != null) {
                data.setAccount(row.getCell(0).getStringCellValue());
            }

            if (row.getCell(1) != null) {
                data.setIdClient(row.getCell(1).getStringCellValue());
            }
            if (row.getCell(2) != null) {
                data.setAmount(row.getCell(2).getStringCellValue());
            }
            if (row.getCell(3) != null) {
                data.setName(row.getCell(3).getStringCellValue());
            }
            if (row.getCell(4) != null) {
                data.setGender(row.getCell(4).getStringCellValue());
            }

            fillTable(data);
        }
    }


    private void fillTable(Data data) {
        dataTableView.getColumns().clear();
        ObservableList<Data> observableDataList = FXCollections.observableArrayList();
        observableDataList.add(data);
        dataTableView.setItems(observableDataList);

    }

Data Class:

public class Data {
    private StringProperty account;
    public void setAccount(String value) { accountProperty().set(value); }
    public String getAccount() { return accountProperty().get(); }
    public StringProperty accountProperty() {
        if (account == null)  account= new SimpleStringProperty(this,"account","");
        return account;
    }

    private StringProperty idClient;
    public void setIdClient(String idClient) { this.idClient.set(idClient);    }
    public String getIdClient() { return idClient.get(); }
    public StringProperty idClientProperty() {
        if(idClient==null) idClient= new SimpleStringProperty(this,"idClient","");
        return idClient;
    }

    private StringProperty amount;
    public void setAmount(String amount) {        this.amount.set(amount);    }
    public String getAmount() {        return amount.get();    }
    public StringProperty amountProperty() {
        if(amount==null) amount= new SimpleStringProperty(this,"amount","");
        return amount;
    }

    private StringProperty name;
    public void setName(String name) {        this.name.set(name);    }
    public String getName() {        return name.get();    }
    public StringProperty nameProperty() {
        if(name==null) name = new SimpleStringProperty(this,"name","");
        return name;
    }

    private StringProperty gender;
    public void setGender(String gender) { this.gender.set(gender);}
    public String getGender() { return gender.get();}
    public StringProperty genderProperty() {
        if(name==null) gender= new SimpleStringProperty(this,"gender","");
        return gender;
    }

    private StringProperty typeAccount;
    public void setTypeAccount(String typeAccount) { this.typeAccount.set(typeAccount); }
    public String getTypeAccount() { return typeAccount.get();}
    public StringProperty typeAccountProperty() {
        if(typeAccount==null) typeAccount= new SimpleStringProperty(this,"typeAccount","");
        return typeAccount;
    }

    @Override
    public String toString() {
        return "Data{" +
                ", account=" + account +
                ", idClient=" + idClient +
                ", amount=" + amount +
                ", name=" + name +
                ", gender=" + gender +
                ", typeAccount=" + typeAccount +
                '}';
    }
}

ERROR

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.control.MenuItem.fire(MenuItem.java:462)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 43 more
Caused by: java.io.IOException: Java heap space
    at org.apache.poi.ss.usermodel.WorkbookFactory.createWorkbook(WorkbookFactory.java:353)
    at org.apache.poi.ss.usermodel.WorkbookFactory.createXSSFWorkbook(WorkbookFactory.java:316)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:234)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:200)
    at sample.Controller.load(Controller.java:110)
    ... 53 more
Caused by: java.lang.OutOfMemoryError: Java heap space
    at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260)
    at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2997)
    at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3164)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:380)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2787)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3422)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1272)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1259)
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:226)
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:218)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.parseSheet(XSSFWorkbook.java:448)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:413)
    at org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:184)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:282)
    at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:88)
    at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:135)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.poi.ss.usermodel.WorkbookFactory.createWorkbook(WorkbookFactory.java:341)

fabian
  • 80,457
  • 12
  • 86
  • 114
  • 2
    `Caused by: java.lang.OutOfMemoryError: Java heap space` How big is the file? – SedJ601 Nov 26 '19 at 05:01
  • 1
    You could use the streaming api to avoid this kind of error, if you run into it even allowing for a large heap space, but I'm unfamiliar with that one: https://stackoverflow.com/questions/33786219/apache-poi-streaming-sxssf-for-reading – fabian Nov 26 '19 at 06:45
  • @Sedrick 3000 row and 12 column – Asmaa MOHAMEDI Nov 26 '19 at 22:13

0 Answers0