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

poi方式解析Excel文件:

 

支持:EXCEL97,2000,2003,EXCEL2007

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

 

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

 

 

写一个工具类ExcelUtil,用于解析Excel文件,该工具可以解析0307版本的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方法:HSSFWordbookread方法类似,在这就不详细描述了

 

 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;

    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡壶好茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值