Java 在使用poi读取excel文件之前,先保存其内容

Java 在使用poi读取excel文件之前,先保存其内容,java,excel,user-interface,apache-poi,Java,Excel,User Interface,Apache Poi,我正在制作一个应用程序,创建了2个新的电子表格文件。用户可以将数据输入excel文件,并让程序读取。然而,问题是,在数据输入并按excel中的保存图标保存后,程序只是看不到这些数据,就好像没有输入数据一样。我需要的是用poi编程保存它。有什么建议吗 代码如下: 我的gui类: public class GUI extends JFrame{ private Panel buttonHolder; private Button crossReference; private Button gen

我正在制作一个应用程序,创建了2个新的电子表格文件。用户可以将数据输入excel文件,并让程序读取。然而,问题是,在数据输入并按excel中的保存图标保存后,程序只是看不到这些数据,就好像没有输入数据一样。我需要的是用poi编程保存它。有什么建议吗

代码如下:

我的gui类:

public class GUI extends JFrame{

private Panel buttonHolder;
private Button crossReference;
private Button generateHPD;
private CrossReference ref = null;
private XSSFWorkbook log;
private XSSFWorkbook sheet;
private XSSFSheet logSheet;
private XSSFSheet sSheet;

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

    logSheet =  createExcelSheet ("D:/Log.xlsx", "Log");
    sSheet =    createExcelSheet("D:/Spreadsheet.xlsx", "Spreadsheet");

    crossReference.addActionListener(new crossReferenceButtonListener());
    generateHPD.addActionListener(new generateHPDButtonListener());
}



public XSSFSheet getLogSheet() {
    return logSheet;
}



public XSSFSheet getsSheet() {
    return sSheet;
}



private XSSFSheet createExcelSheet (String path, String fileName) throws Exception{
    try{
    FileOutputStream out = new FileOutputStream (path);
    XSSFWorkbook wb = new XSSFWorkbook ();
    XSSFSheet sheet = wb.createSheet(fileName);
    wb.write(out);

    Process p = Runtime.getRuntime().exec(
            "rundll32 url.dll, FileProtocolHandler " + path);

    return sheet;
    }
    catch (Exception e){
        throw e;
    }
}

private class crossReferenceButtonListener implements ActionListener {
    public void actionPerformed (ActionEvent event){

        try { 
            XSSFSheet sSheet = getsSheet();
            XSSFSheet logSheet = getLogSheet();

            ref = new CrossReference();
            //ref = new CrossReference (log.getSheetAt(0), sheet.getSheetAt(0));
            ref.CrossReferenceCont(logSheet, sSheet);


            ref.CrossRef();
            JOptionPane.showMessageDialog(null, "Cross Reference was successful!");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
交叉参考点法

public void CrossReferenceCont(XSSFSheet wsLog, XSSFSheet wsSheet)
        throws Exception {

    log = new PropertyList(wsLog);
    sheet = new PropertyList(wsSheet);

    logArray = log.getPropertyList();
    sheetArray = log.getPropertyList();
}
属性列表方法:

public PropertyList(XSSFSheet ws) throws Exception{

    try{
        //File excel = new File (excelFilePath);
        //FileInputStream fis = new FileInputStream (excel);
    //  XSSFWorkbook wb = new XSSFWorkbook(fis);


        int rowNum = ws.getLastRowNum();
        System.out.println ("Number of rows is " + rowNum);
        propertyList = new ArrayList <Property>(rowNum);

        for (int i = 0; i <= rowNum; i++){
            property  = new Property (ws, i);

            propertyList.add(new Property(property));

        }

不知道我是否理解正确。这能解决你的问题吗


i创建一个getFilePath,而不是getSheet。然后使用该路径获取工作表

File file = new File(filePath);
Workbook wb = WorkbookFactory.create(FileUtils.openInputStream(file));
Sheet templateSheet = templateWorkbook.getSheetAt(0);

这只会有助于避免过度。但实际的问题是,我需要java能够读取我输入的行。java创建一个新的空excel文件,其中没有任何内容。用户将数据输入到文件中,保存并按下交叉引用按钮,但即使输入了数据,java也看不到文件中的任何数据,因此问题是如何让java看到这些数据。我如何正确地保存它???在交叉引用后,您是否正在向流中写入内容?wb.writeout的类型;不,当我创建工作簿时,它会在代码中查看,写完书后,我会输入内容,但程序看不到内容。如果使用程序保存数据,则必须重新编写。如果您是手动执行此操作,则需要使用文件路径再次读取输入流。您能在此处帮助我编写代码吗。。。我试图在保存workBookname.writeout后使用它进行写入,但如果您有一个文件对象,那么它将无法工作!如中所述,使用文件的内存比通过InputStream的内存低
File file = new File(filePath);
Workbook wb = WorkbookFactory.create(FileUtils.openInputStream(file));
Sheet templateSheet = templateWorkbook.getSheetAt(0);