1

我正在尝试在 mac osx 环境中使用 Apache POI 3.8 读取文件,该文件是在 Windows 中使用 Open XML SDK 2.0 for Microsoft Office 创建的,由于无法加载 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. 将您的文档文件放在这些文件夹中。

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 回答