Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 程序停止尝试读取Excel工作簿(Apache POI)_Java_Excel_Apache Poi - Fatal编程技术网

Java 程序停止尝试读取Excel工作簿(Apache POI)

Java 程序停止尝试读取Excel工作簿(Apache POI),java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试读取Excel工作簿(.xlsx),但在初始化工作簿时程序只是停止。我不确定发生了什么,因为它没有给出任何错误 当我说暂停时,我的意思是程序只是暂停。它还在运行,但我觉得它卡住了,不确定 import java.io.File; import java.io.FileInputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; impo

我正在尝试读取Excel工作簿(
.xlsx
),但在初始化
工作簿时程序只是停止。我不确定发生了什么,因为它没有给出任何错误

当我说暂停时,我的意思是程序只是暂停。它还在运行,但我觉得它卡住了,不确定

import java.io.File;
import java.io.FileInputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelReader 
{
    private String excelFilePath;
    private FileInputStream inputStream;
    private Workbook workbook;
    private Sheet sheet;

    // Constructors
    public ExcelReader() {
        try {           
            // Get path to excel workbook and put in stream
            excelFilePath = "/home/flow/project/mydata.xlsx";
            inputStream = new FileInputStream(new File(excelFilePath));

            // Get type of workbook  (Excel 2003 or Excel 2007+)
            workbook = getWorkbook();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Get type of workbook (Excel 2003 or Excel 2007+)
    private Workbook getWorkbook() {    
        Workbook work = null;

        try {
            if(excelFilePath.endsWith("xlsx"))  {
                System.out.println("In firstIf");               // Prints this
                work = new XSSFWorkbook(inputStream);           // Gets stuck here
                System.out.println("After XSSF");               // Never prints this
            }
            else if(excelFilePath.endsWith("xls"))  {
                work = new HSSFWorkbook(inputStream);
            }
            else
                throw new IllegalArgumentException("The specified file is not an Excel file");

        } catch (Exception e) {
            e.printStackTrace();
        }

        return work;
    }
}

我做错了什么?为什么程序永远都不能转到下一行?

我不明白为什么程序一直停止,所以我降级到3.9版,让代码正常工作。 多亏了,我能够通过去掉整个
getWorkbook()
方法和
FileInputStream
类来减少内存的使用

workbook=getWorkbook()
更改为:

workbook = WorkbookFactory.create(new File(excelFilePath));
它将创建相应的
XSSF工作簿
HSSF工作簿


来源:

我也注意到了暂停,我的意思是程序只是在XSSFWorkbook初始化的行上暂停。我发现类路径中缺少几个jar文件。在我的例子中,以下JAR不在类路径中:

curvesapi-1.03.jar
xmlbeans-2.6.0.jar
奇怪的是,Java运行时没有抛出类not found异常。相反,Java运行时挂在XSSF工作簿构造函数上

POI分发中的所有JAR都应添加到类路径中

poi-3.14-20160307.jar
poi-excelant-3.14-20160307.jar
poi-ooxml-3.14-20160307.jar
poi-ooxml-schemas-3.14-20160307.jar
poi-scratchpad-3.14-20160307.jar
commons-codec-1.10.jar
commons-logging-1.2.jar
junit-4.12.jar
log4j-1.2.17.jar
curvesapi-1.03.jar
xmlbeans-2.6.0.jar

您是否尝试等待,如果是,您等待了多长时间?请尝试生成线程转储(请参见示例)并发布输出。还请注意,问题可能是一些其他程序“锁定”了文件,如文档中明确说明的。使用InputStream速度较慢,占用更多内存!另外,您的整个
getWorkbook
方法如果简单地用一个调用替换会好得多stacktrace不会显示任何与POI相关的代码正在运行,因此事实上,代码以某种方式终止,您要么吞并了异常(printSTackTrace()可能不是记录异常的最佳选项!)或者它最终成功地完成了。您可能需要调试或添加更多日志输出才能找到答案!什么让你认为它没有呢?我假设,因为上面的代码在3.9中运行良好,所以3.14和Java1.6出现了一些问题。我不知道詹金斯是什么,但我会编辑我的答案,更多地说明我是如何做到的。我尝试了许多测试用例和日志输出,但无法在3.14中使用。最有可能的情况是,您的类路径上有一个损坏的或旧的依赖项,较新版本的POI对它更敏感。Jenkins是一个持续集成服务器,它运行所有的单元测试,我认为这可能与我的类路径有关,所以我启动了一个新的空项目,仍然得到了相同的结果。