POI解析Excel表格 .xls 和 .xlsx 通用的解决方案

前段时间,看在其他的网站上给出Excel文档的导入与导出操作,感觉很酷的样子,所以就学习了一下如何使用POI进行Excel的操作,现在对之前的学习过程进行一个总结。

一、现在普遍使用的Excel文档有xls以及xlsx这两种Excel文档,其中xls格式的Excel文档又分为5.0/95工作簿以及97-2003工作簿这两种。需要注意的是,由于5.0/95工作簿的版本太低,现在的POI文档不再支持这种类型的Excel文档的读取工作,当试图读取这种类型的Excel文档的时候,POI会抛出一个异常(OldExcelFormatException)。我现在使用的POI是3.14版本。

二、Workbook的创建

1、由于Excel中存在xls以及xlsx这两种格式,所以创建方式也有所不同。其中对于xls格式的文档,需要使用HSSFWorkbook来创建工作簿对象,而对于xlsx格式的Excel文档,则需要使用XSSFWrokbook来创建工作簿。有一点需要注意的是,HSSFWorkbook与XSSFWorkbook这两个类其实都是Workbook接口的一个实现类。好了,下面就是创建工作簿对象的代码:

//创建一个不存在的excel文件
    private static Workbook createWorkbookIfNotExist(String fileName) throws Exception {
        Workbook wb = null;
        
        if(fileName.endsWith(".xls")) {
            wb = new HSSFWorkbook();
        } else if(fileName.endsWith(".xlsx")) {
            wb = new XSSFWorkbook();
        } else {
            throw new Exception("文件类型错误!");
        }
        
        try{
            OutputStream output = new FileOutputStream(fileName);
            wb.write(output);
        }catch(FileNotFoundException e) {
            System.out.println("文件创建失败,失败原因为:" + e.getMessage());
            throw new FileNotFoundException();
        }
        System.out.println(fileName + "文件创建成功!");
        
        return wb;
    }
    
    //创建一个新的或者已存在的Excel文档的Workbook
    public static Workbook createWorkbook(String fileName) throws Exception {
        InputStream input = null;
        Workbook wb = null;
        
        try{
            input = new FileInputStream(fileName);
            wb = WorkbookFactory.create(input);
        } catch(FileNotFoundException e) {
            System.out.println("要打开的文件不存在,正试图创建该文件,请稍后……!");
            wb = createWorkbookIfNotExist(fileName);
        } catch(OldExcelFormatException e) {
            System.out.println("文件打开失败,原因:要打开的Excel文件版本过低!");
            throw new OldExcelFormatException("文件版本过低");
        } finally {
            if(input != null) {
                input.close();
            }
        }
        
        return wb;
    }
2、创建Sheet的时候,同样的也存在HSSFSheet以及XSSHSheet这两种类型。同样的HSSFSheet以及XSSFSheet这两个类也是Sheet接口的实现类。如果直接使用实现类进行创建Sheet的话,那么,对于不同的格式,需要使用不同的实现方式,尽管实现的方式都一致。由于Java的多态关系,在这里,我使用Sheet接口进行处理。代码:
//创建sheet
    public static Sheet createSheet(Workbook wb , String sheetName) {
        Sheet sheet = wb.getSheet(sheetName);
        
        if(sheet == null) {
            System.out.println("表单" + sheetName + "不存在,试图创建该sheet,请稍后……");
            sheet = wb.createSheet(sheetName);
            System.out.println("名为" + sheetName +"的sheet创建成功!");
        }
        
        return sheet;
    }
3、对于Row的创建,也是一样,也是使用Row这个接口进行实现。代码:
//创建行row
    public static Row createRow(Sheet sheet , int rowNum) {
        Row row = sheet.getRow(rowNum);
        
        if(row == null) {
            System.out.println("行号为:" + rowNum + "的行不存在,正试图创建该行,请稍后……");
            row = sheet.createRow(rowNum);
            System.out.println("行号为:" + rowNum + "的行创建成功!");
        }
        
        return row;
    }

4、对于Cell也是一样,同样使用Cell接口进行编程。代码:
//创建单元格cell
    public static Cell createCell(Row row , int cellNum) {
        Cell cell = row.getCell(cellNum);
        
        if(cell == null) {
            System.out.println("该单元格不存在,正在试图创建该单元格,请稍后……");
            cell = row.createCell(cellNum);
            System.out.println("该单元格创建成功!");
        }
        
        return cell;
    }
以上几个操作就是Workbook、Sheet、Row以及Cell的创建工作。另外,当对Excel文档操作完成之后,需要使用Workbook的write方法保存一下,然后上述的改动才会保存在你创建的Excel文档中。代码:
wb03.write(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\03styleExcel.xls"));
wb07.write(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\07styleExcel.xlsx"));

好了,这篇博文到这里就结束了。如果文章中有什么错误或不足的地方,希望各位大侠多多指点。后面的博文,会陆续介绍如何往Excel文档中写入不同格式的数据,以及边框、图片、合并单元格、隐藏与显示行等操作。

本人的总结:可以根据上传的Excel文件的后缀名,判断创建HSSFWorkbook还是XSSFWorkbook,然后后面的用Sheet、Row、Cell,这样写一个方法就可以通用了。

转载与https://www.cnblogs.com/jiang2016/p/5728102.html

侵删



猜你喜欢

转载自blog.csdn.net/qq_39548297/article/details/79993250
今日推荐