Java 创建工作簿ApachePOI的通用方法

Java 创建工作簿ApachePOI的通用方法,java,coding-style,apache-poi,Java,Coding Style,Apache Poi,我有一个使用ApachePOI库读取excel工作表的方法。为了使该方法通用,我需要在catch块中编写一些代码。方法如下: private List<String[]> readFile(String filePath) throws IOException{ List<String[]> sheetValues = new ArrayList<String[]>(); //Two types of fileInputStre

我有一个使用ApachePOI库读取excel工作表的方法。为了使该方法通用,我需要在catch块中编写一些代码。方法如下:

private List<String[]> readFile(String filePath) throws IOException{
        List<String[]> sheetValues = new ArrayList<String[]>();
        //Two types of fileInputStreams for both the types of workbook i am about to use
        //
        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
        FileInputStream fileInputStream2 = new FileInputStream(new File(filePath));
        LineItemFileReader fileReader = new LineItemFileReaderImpl();
        //If the file is in xls format i should use HSSFWorkbook
        //If the file is in xlsx format i should use XSSFWorkbook
        try {
        //If the file is in xlsx format then the below line will throw the
        //Exception and catch block code will be executed
            HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
            sheetValues = fileReader.ParseSheet(workbook.getSheetAt(1),evaluator);
        } catch (OfficeXmlFileException exception){
            XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream2);
            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
            sheetValues = fileReader.ParseSheet(workbook.getSheetAt(1),evaluator);
        } finally{
            fileInputStream.close();
            fileInputStream2.close();
        }
        return sheetValues;
    }
private List readFile(字符串文件路径)引发IOException{
List sheetValues=new ArrayList();
//对于我将要使用的两种工作簿类型,有两种类型的fileInputStreams
//
FileInputStream FileInputStream=newfileinputstream(新文件(filePath));
FileInputStream fileInputStream2=新的FileInputStream(新文件(文件路径));
LineItemFileReader fileReader=新的LineItemFileReaderImpl();
//如果文件是xls格式,我应该使用HSSF工作簿
//如果文件是xlsx格式,我应该使用XSSFWorkbook
试一试{
//如果文件是xlsx格式,那么下面的一行将抛出
//将执行异常和捕获块代码
HSSF工作簿=新的HSSF工作簿(fileInputStream);
FormulaEvaluator evaluator=工作簿.getCreationHelper().createFormulaEvaluator();
sheetValues=fileReader.ParseSheet(工作簿.getSheetAt(1),计算器);
}捕获(OfficeXmlFileException异常){
XSSF工作簿=新的XSSF工作簿(fileInputStream2);
FormulaEvaluator evaluator=工作簿.getCreationHelper().createFormulaEvaluator();
sheetValues=fileReader.ParseSheet(工作簿.getSheetAt(1),计算器);
}最后{
fileInputStream.close();
fileInputStream2.close();
}
返回值;
}

所以这里发生的事情是,我不知道我被提供了什么类型的文件。我根据上面给出的try/catch块来决定。那么,有没有通用的方法来决定使用哪个工作簿呢?由于上面的代码在catch块中写入了流控制逻辑,这是一种不好的做法。

使用
WorkbookFactory。创建(…)
以打开
工作簿。它将在内部创建适当的子类:

Workbook workbook = WorkbookFactory.create(new File(filePath));
// ...
workbook.close();

这完全取决于错误条件是什么,以及方法的工作是什么。看看这个:拥有try-catch块并不一定是坏事!我不明白这一点。发布一些代码来说明你的问题@isnot2bad发布了代码!查看编辑!您不能简单地检查文件扩展名吗?用户是否可能将其命名为xls文件,但文件格式为xlsx?