1

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

    }
}

CrossReferenceCont メソッド

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

        }

そして最後にプロパティメソッド:ここでプログラムがクラッシュします

public Property(XSSFSheet sheet, int row) throws FileNotFoundException {

    Cell cell = sheet.getRow(row).getCell(0); //crashes here, nullPointer

    int type = cell.getCellType();

    //setting the address-------------------------------------------------
    if (type == Cell.CELL_TYPE_STRING) {
        address = cell.getStringCellValue();
    } else if (type == Cell.CELL_TYPE_NUMERIC) {
        int addressTemp = (int) cell.getNumericCellValue();
        address = String.valueOf(addressTemp);
    }
4

2 に答える 2

0

正しく理解できたかどうかわかりません。これで問題は解決しますか

i < 行番号

于 2013-08-25T01:33:53.477 に答える
0

getSheet() の代わりに、getFilePath() を作成します。次に、そのパスを使用してワークシートを取得します。

File file = new File(filePath);
Workbook wb = WorkbookFactory.create(FileUtils.openInputStream(file));
Sheet templateSheet = templateWorkbook.getSheetAt(0);
于 2013-08-25T03:21:55.603 に答える