java - 程序执行 POI、JAVA 时从 Excel 电子表格读取插入的数据

标签 java excel user-interface apache-poi

我正在创建一个应用程序,它将 Excel 文件读入程序并对其进行操作。在此之前,一切都运行良好。但是当我开始为我的应用程序实现 GUI 时,它就不再工作了。

这是代码:

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

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());
}

在原始代码中,您创建按钮,然后添加操作监听器:

crossReference.addActionListener(new crossReferenceButtonListener());

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

通过在添加 crossReferenceButtonListener 之前调用 createExcelSheet 方法,您将确保 logsheetcrossReferenceButtonListener 尝试使用“em”时已创建。

关于java - 程序执行 POI、JAVA 时从 Excel 电子表格读取插入的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18405673/

相关文章:

java - 是否可以将内存文件放入 Camel 管道中?

java.util.regex 匹配表达式之前的任何内容

java - Oozie-将jar文件复制到Cloudera上的lib文件夹时被截断

Python QPushButton 设置图标 : put icon on button

python - 在 python 中,如何从 Gtk.entry 输入框中获取值并将其传递给变量?

android - ScrollView 不会完全滚动

java - 从 Java 启动且代码为 `Runtime.getRuntime().exec` 的进程无法访问文件系统位置

excel - 如何将分配为字符串的答案转换回 VBA 中的长变量?

excel - 如何在工作表名称更改时使宏起作用

sql - 在 Excel 中将 SQL 结果限制为 2 个小数位