zoukankan      html  css  js  c++  java
  • Poi方式解析Excel文件(支持Excel2007)

    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;

        }

  • 相关阅读:
    js_阶乘
    python 最新方案-解决编码错误问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position
    RabbitMQ Python端发送消息给Java端 接受消息全数字问题
    【Hadoop】第六天 Hive
    【Hadoop 】第五天 Hadoop-HA 搭建
    Redis面试常问点
    python md5 salt 摘要算法
    【Hadoop】第四天 Shuffle MapReduce组件全貌
    【Hadoop】第三天 mapreduce的原理和编程
    【Hadoop 】第二天 hdfs的原理和使用操作、编程
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400067.html
Copyright © 2011-2022 走看看