在java中使用POI jar读取xlsx文件时获取异常

时间:2016-02-01 10:50:49

标签: java jar apache-poi xlsx

我无法使用java读取xlsx文件,在我创建对象XSSFWorkbook(fis)的行中获取Exception;

HashMap<Short, String> keyMap = new HashMap<Short, String>();
HashMap<String, String> valueMap = null;
ArrayList<HashMap<String, String>> rowList = new ArrayList<HashMap<String, String>>();
try {
    FileInputStream fis = new FileInputStream(fileName);
    String fileExtn = getFileExtension(fileName);

    Workbook xssfWorkBook ;
    HSSFWorkbook hssfWorkBook ;
    Sheet sheet=null;
    if (fileExtn.equalsIgnoreCase("xlsx"))
    {
        log.debug("Before creating WorkBook");
        xssfWorkBook = new XSSFWorkbook(fis);
        log.debug("xssfWorkBook object created");
        sheet = xssfWorkBook.getSheetAt(0);
    }else  if (fileExtn.equalsIgnoreCase("xls"))
    {
        hssfWorkBook = new HSSFWorkbook(fis);
        sheet = (Sheet) hssfWorkBook.getSheetAt(0);
    }
    Iterator<Row> rows = sheet.rowIterator();
    int rowCount = 0;
    while (rows.hasNext()) {
        if (rowCount == 0) {
            Row row = rows.next();
            Iterator<Cell> cells = row.cellIterator();
            short cellCounter = 1;
            while (cells.hasNext()) {
                Cell cell = cells.next();
                String cellValue = getCellValueAsString(cell);
                keyMap.put(cellCounter, cellValue);
                cellCounter++;
            }
        } else {
            valueMap = new HashMap<String, String>();
            Row row = rows.next();
            Iterator<Cell> cells = row.cellIterator();
            short cellCounter = 1;
            while (cells.hasNext()) {
                Cell cell = cells.next();
                String cellValue = getCellValueAsString(cell);
                valueMap.put(keyMap.get(cellCounter), cellValue);
                cellCounter++;
            }
            rowList.add(valueMap);
        }
        rowCount++;
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
    log.error("FileNotFoundException" + e);
    throw new Exception("FileNotFoundException while reading Excel file, Message <" + e.getMessage() + ">");
} catch (IOException e) {
    e.printStackTrace();
    log.error("IOException" +e);
    throw new Exception("IOException while reading Excel file, Message <" + e.getMessage() + ">");
}catch(Exception e){
    e.printStackTrace();
    throw new Exception("Exception while reading Excel file, Message <" + e.getMessage() + ">");
}

以stackTrace为例获取以下异常:

  

java.lang.NullPointerException at   org.apache.poi.openxml4j.opc.OPCPackage.getPart(OPCPackage.java:562)   在   org.apache.poi.POIXMLDocumentPart。(POIXMLDocumentPart.java:63)   在org.apache.poi.POIXMLDocument。(POIXMLDocument.java:58)at   org.apache.poi.xssf.usermodel.XSSFWorkbook。(XSSFWorkbook.java:186)   在   com.covad.portlet.mars.util.ExcelReader.readExcel(ExcelReader.java:72)

2 个答案:

答案 0 :(得分:5)

在确保将文件另存为之前,我遇到了此问题 ExcelWorkbook( .xlsx),如果您将文件另存为,则可能会出现此问题 严格打开XML SpreadSheet( .xlsx),它们都具有相同的扩展名,但内部结构可能不同,POI似乎不支持它;要解决文件上的问题,请将其再次保存为ExcelWorkbook(*。xlsx )。 我希望这可以解决你的问题。

答案 1 :(得分:0)

是的,上面的程序需要几个罐子作为poi-3.7.jar,poi-ooxml-3.7-20101029.jar,poi-ooxml-schemas-3.7-20101029.jar,xmlbeans-2.3.0.jar和dom4j- 1.6.1.jar。

另外,我正在尝试的输入文件有一些问题。我创建了新的空白文件并复制了我需要的所有数据,并尝试阅读相同的内容。它奏效了。

谢谢大家的时间和帮助。