在程序执行POI,JAVA时,从Excel电子表格中读取插入的数据

我正在创build一个将excel文件读入程序并对其进行操作的应用程序。 在此之前,一切正常。 但是当我盯着为我的应用程序实现GUI时,它不再工作。

这里是代码:

当程序启动时,它会创build一个带有button的GUI,并打开2个新的电子表格。 我在这些电子表格中input数据,然后按下调用crossReferenceButtonListener的button,但是无法获取数据。 下面的错误信息

public GUI () throws Exception{ this.setTitle("NYWM Cross Reference Application"); this.setSize(400,100); this.setVisible(true); this.setLocationRelativeTo(null); buttonHolder = new Panel (new BorderLayout()); this.add(buttonHolder); crossReference = new Button ("CrossReference"); generateHPD = new Button ("Generate HPD"); buttonHolder.add(crossReference, BorderLayout.NORTH); buttonHolder.add(generateHPD, BorderLayout.SOUTH); crossReference.addActionListener(new crossReferenceButtonListener()); generateHPD.addActionListener(new generateHPDButtonListener()); createExcelSheet (log,"C:/Log.xlsx", "Log"); createExcelSheet(sheet,"C:/Spreadsheet.xlsx", "Spreadsheet"); } private void createExcelSheet (XSSFWorkbook wb, String path, String fileName) throws Exception{ try{ FileOutputStream out = new FileOutputStream (path); wb = new XSSFWorkbook (); XSSFSheet sheet = wb.createSheet(fileName); wb.write(out); Process p = Runtime.getRuntime().exec( "rundll32 url.dll, FileProtocolHandler " + path); } catch (Exception e){ throw e; } } private class crossReferenceButtonListener implements ActionListener { public void actionPerformed (ActionEvent event){ try { ref = new CrossReference (log.getSheet("Log"), sheet.getSheet("Spreadsheet")); ref.CrossReference(); JOptionPane.showMessageDialog(null, "Cross Reference was successful!"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

错误信息:更具体地说,它在这一行失败

  ref = new CrossReference (log.getSheet("Log"), sheet.getSheet("Spreadsheet")); 

错误:

 at java.awt.EventDispatchThread.run(Unknown Source) java.lang.NullPointerException at nywm_crossReferenceApplication.GUI$crossReferenceButtonListener.actionPerformed(GUI.java:70) at java.awt.Button.processActionEvent(Unknown Source) at java.awt.Button.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) 

尝试以下操作:

 public GUI () throws Exception{ this.setTitle("NYWM Cross Reference Application"); this.setSize(400,100); this.setVisible(true); this.setLocationRelativeTo(null); buttonHolder = new Panel (new BorderLayout()); this.add(buttonHolder); crossReference = new Button ("CrossReference"); generateHPD = new Button ("Generate HPD"); buttonHolder.add(crossReference, BorderLayout.NORTH); buttonHolder.add(generateHPD, BorderLayout.SOUTH); // NOTE the order below has been flipped!!!! createExcelSheet (log,"C:/Log.xlsx", "Log"); createExcelSheet(sheet,"C:/Spreadsheet.xlsx", "Spreadsheet"); crossReference.addActionListener(new crossReferenceButtonListener()); generateHPD.addActionListener(new generateHPDButtonListener()); } 

在您的原始代码中,您将创build该button,然后添加动作侦听器:

 crossReference.addActionListener(new crossReferenceButtonListener()); 

但是,只有在添加了crossReferenceButtonListener之后,才能调用createExcelSheet ,这是Workbook实际被实例化的地方。 而crossReferenceButtonListener想要使用Workbook上的字段,但它们是空的,因此你的NullPointerException

通过在添加crossReferenceButtonListener之前调用createExcelSheet方法,您将确保在crossReferenceButtonListener尝试使用em时创buildlogsheet

Java没有引用引用语义。 您正在将两个variableslog和工作sheet传递给createExcelSheet方法,显然期望它们在该方法中被初始化,但这不起作用。 方法调用后它们仍然为null

 createExcelSheet (log,"C:/Log.xlsx", "Log"); createExcelSheet(sheet,"C:/Spreadsheet.xlsx", "Spreadsheet"); 

您必须重写该方法才能返回创build的XSSFWorkbook并将呼叫更改为

 log = createExcelSheet ("C:/Log.xlsx", "Log"); sheet = createExcelSheet("C:/Spreadsheet.xlsx", "Spreadsheet");