1

Open XML SDK 2.0 for Microsoft Office を使用して Windows で作成された Mac osx 環境で Apache POI 3.8 を使用してファイルを読み取ろうとすると、xlsx ファイルを読み込めないため、ヌル ポインター例外が発生します。以下はスタックトレースです。ファイルを開いて表示できます。

mac os env で作成したファイルに対しても同じコードが機能します。処理する前にファイルを開いて保存しても、問題はありません。注意:保存後はファイルサイズが大きくなります。.net で生成され、mac osx 環境で処理されるファイルに問題がありますか。

エラーを下回っている理由の手がかり。

Caused by: java.lang.NullPointerException
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:253)
        at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:183)
        at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:73) 

クラスは以下のようになり、ユーティリティ メソッドを使用して、クラス全体をコピーしませんでした。しかし、これwb = new XSSFWorkbook(bis)はワークブックの作成中に発生します。WorkbookFactory.create(bis)の代わりにいくつかのオプションを試しXSSFWorkbookましたが、エラーは同じままです。問題は主にファイルの内容にあります。

public class XLSXReader {

    private BufferedInputStream bis;
    private boolean hasNext = true;
    int skipLines;

    private boolean linesSkiped;

    //   The default line to start reading.
    public static final int DEFAULT_SKIP_LINES = 0;

    private XSSFWorkbook wb =null;
    private XSSFSheet sheet=null;
    private int noOfCols;

    public XLSXReader(InputStream is){
        bis = new BufferedInputStream(is);
        this.noOfCols=0; 
        try {
            wb = new XSSFWorkbook(bis); 
            sheet = wb.getSheetAt(0);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

// with basic utility methods ....
}
4

1 に答える 1

0

私は、あなたがclass path問題を見逃していると思います。以下のようにしてみてください。propertiesディレクトリが にあることを確認してくださいclass path。doucments ファイルをこれらのフォルダーに入れます。

public class WorkBookReader {
    public static void main(String[] args) {
        try {
            InputStream inp = new FileInputStream("properties/workbook.xls");
            Workbook wb = WorkbookFactory.create(inp);
            Sheet sheet = wb.getSheetAt(0);
            Row row = sheet.getRow(2);
            Cell cell = row.getCell(3);
            if (cell == null)
                cell = row.createCell(5);
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue("Hello!");

            // Write the output to a file
            FileOutputStream fileOut = new FileOutputStream("properties/workbook.xls");
            wb.write(fileOut);
            fileOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
    }
}
于 2012-09-20T11:12:25.670 に答える