Poi方式解析Excel文件(支持Excel2007)

来源:互联网 发布:python sha256 编辑:程序博客网 时间:2024/05/18 00:20

poi方式解析Excel文件:

 

支持:EXCEL97,2000,2003,和EXCEL2007。

注意:据说97和2000和03版本的Excel文件底层存储结构是一样的。所以我们可以用如下包的HSSFWordbook类来解析并将excel文件封装成对象。EXCEL2007底层结构据说改成xml了,所以其解析封装Excel文件不能用上述HSSFWordbook类,改用XSSFWordbook类来封装07版本的Excel文件,其余方法基本类似。

 

上述几种版本可共用如下文件包:

 

 

写一个工具类ExcelUtil,用于解析Excel文件,该工具可以解析03和07版本的Excel文件,

 

基本代码结构如下:

If(07以下版本Excel文件) {

         FileInputStream fis=new FileInputStream(fileName);

    POIFSFileSystem fs = new POIFSFileSystem(fis);

    HSSFWorkbook wordbook = new HSSFWorkbook(fs);

    //调用解析HSSFWordbook类的方法,解析并封装该文件

    Return readHSSFWordbook(wordbook);

 

}else if(07版本) {

         XSSFWorkbook wordbook=null;

    wordbook = new XSSFWorkbook(fileURL);

//调用解析XSSFWordbook类的方法,解析并封装该文件

    Return readXSSFWordbook(wordbook);

}

注意:由于我项目需要导入的文件数据量不多,所以我调用上述read方法时是一次将整个文件解析并存放在一个集合中,然后再对这些数据进行后续操作。如果各位大拿有大数据量的文件要解析导入最好分批次解析导入,否则很可能发生内存溢出的情况。

 

 

如下是我项目里用到的read方法:HSSFWordbook的read方法类似,在这就不详细描述了

 

 private static ArrayList<String[]> readXSSFAllRows(XSSFWorkbook wordbook) {

       ArrayList<String[]> rowList = new ArrayList<String[]>();

       try { 

           XSSFSheet sheet = null;

           XSSFRow row = null;

           XSSFCell cell = null;

           sheet = wordbook.getSheetAt(0);

           int rowNum = 0;

       for (Iterator<?> rows = sheet.iterator(); rows.hasNext(); rowNum++) {

              row = (XSSFRow) rows.next();

              int col = 0;

              int lastCellNum = (int) row.getLastCellNum();

              String[] aCells = new String[lastCellNum];

 

              while (col < lastCellNum) {

                  try {

                     cell = row.getCell(col);

                     aCells[col] = ExcelUtils.readXSSFAllCell(cell);

                  } catch (Exception ex) {

                     ex.printStackTrace();

                  }

                  col++;

              }

              boolean notBlankLine = false;

              for (int k = 0; k < aCells.length; k++) {

                  if (aCells[k] != null && aCells[k].length() > 0) {

                     notBlankLine = true;

                     break;

                  }

              }

              if (notBlankLine) {

                  rowList.add(aCells);

              }

           }

 

       } catch (Exception ex) {

           ex.printStackTrace();

       }

       return rowList;

    }


转载于:http://blog.csdn.net/liuyuan_java/article/details/5034136

0 0
原创粉丝点击