使用POI读取.xlsx文件时出现错误" Zip文件已关闭"

时间:2015-05-24 12:34:51

标签: java excel zip apache-poi

public Sheet readExcel() throws Exception{
    //File fi=new File(new File(System.getProperty("user.dir"))+"\\src\\testdata2.xls");
    File fi=new File("C:\\Users\\admin\\workspace\\HMS\\src\\testdata\\testdata1.xlsx");

    Workbook wb = new XSSFWorkbook(fi);
    Sheet  Sheet = wb.getSheetAt(0);

    int rowCount = Sheet.getLastRowNum()-Sheet.getFirstRowNum();

    for (int i = 1; i < rowCount+1; i++) {
        Row row = Sheet.getRow(i);

        if(row.getCell(0).toString().length()==0){

            System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+

            row.getCell(3).toString()+"----"+ row.getCell(4).toString());
        }
    }    
    return Sheet;   
}

通过运行上面的代码我得到这样的错误........

  

线程中的异常&#34; main&#34; java.lang.IllegalStateException:Zip文件   关闭了       在org.apache.poi.openxml4j.util.ZipFileZipEntrySource.getEntries(ZipFileZipEntrySource.java:45)       在org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:186)       在org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:684)       在org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:254)       在org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:201)       在org.apache.poi.xssf.usermodel.XSSFWorkbook。(XSSFWorkbook.java:294)       在ExcelReader.readExcel(ExcelReader.java:16)       在ExcelReader.main(ExcelReader.java:30)

任何人都可以帮我找出究竟是什么问题。

我用Google搜索但无法获得解决方案!

3 个答案:

答案 0 :(得分:10)

要读取xslx文件,请使用创建FileInputStream类的对象

    //Create a object of File class to open xlsx file

    File file = new File("path/filename.xlsx");

    //Create an object of FileInputStream class to read excel file

    FileInputStream inputStream = new FileInputStream(file);

    //create object of XSSFWorkbook class

    Workbook wb = new XSSFWorkbook(inputStream);

希望这能帮助你...

答案 1 :(得分:0)

尝试缩短文件名和文件路径。看起来字符可以在&#34;之间存在多长时间。和&#34;。它对我有用!

答案 2 :(得分:0)

创建 XSSFWorkbook 对象时,您不一定需要传递 FileInputStream ,您也可以传递一个绝对路径+文件名作为一个字符串,它可以很长(对我来说有101个字符,108个字符与双斜线,可能会更长)。我刚刚在Windows 7下编写了一个小型本地应用程序,其唯一参数是一个属性文件,其中包含(以及其他属性)我想要处理的.xlsx文件的绝对路径+文件名(示例属性格式:datasetFile=C:\\Users\\jlm\\Documents\\Test Cases\\AAAS\\TestCase2JsonGenerator\\AAAS_g1.xlsx) 。我只是将 datasetFile 属性作为参数传递给 XSSFWorkbook 构造函数(示例代码行:wb = new XSSFWorkbook(tags.get("datasetFile"));)。它工作得很好,但不要忘记任何双斜线,否则你会得到“Zip文件已关闭”异常(大约2个小时丢失)。