• java中用poi处理Excel表格之读取(2003和2007通用方法)


    以前用的是 jxl.jar来处理Excel表格的,但是现在jxl.jar停止更新了,只能用其处理2003格式 Excel

    所以这次选择了aphace的poi,可以处理2003和2007,唯一不好的是这两个处理分开了,需单独写2003和2007的处理过程

    其中poi的一些类在这就不过多的介绍了,网上都有

    我将其写在一块了,贴出来供大家学习一下

    /**
      * 读取Excel文件内容
      * @param file
      * @return 以List<String[]>格式返回数据
      * @throws IOException
      */
     public static List<String[]> readExcel(File file) throws IOException{
      //取文件名
      String filename = file.getName();
      //取文件后缀
      String subfix = filename.lastIndexOf(".")==-1? "" : filename.substring(filename.lastIndexOf(".")+1);
      System.out.println(subfix);
      //获取读取的数据
      List<String[]> result = new ArrayList<String[]>();
      if(subfix.equals("xls")){
       result = readExcel2003(file);
      }else if(subfix.equals("xlsx")){
       result = readExcel2007(file);
       System.out.println(result);
      }else{
       throw new IOException("文件格式不正确");
      }
      return result;
     }
     
     
     /**
      * 读取2007文件内容
      * @param file
      * @return
      * @throws IOException
      */
     private static List<String[]> readExcel2007(File file) throws IOException {
      //存放获取的数据
      List<String[]> result = new ArrayList<String[]>();
      //创建一个输入流
      FileInputStream in= new FileInputStream(file);
      //创建一个Excel操作对象
      XSSFWorkbook workbook = new XSSFWorkbook(in);
      //行大小
      int rowSize = 0 ;
      //工作簿个数
      int sheets = workbook.getNumberOfSheets();
      //工作簿对象
      XSSFSheet sheet;
      //工作簿中的行
      XSSFRow row;
      //行中的单元格
      XSSFCell cell;
      //循环工作簿
      for(int st=0 ; st<sheets ; st++){
       //获得对应的工作簿
       sheet = workbook.getSheetAt(st);
       //工作簿中的行数
       int rowNum = sheet.getLastRowNum();
       //循环行
       for(int rowIndex = 1; rowIndex <=rowNum ; rowIndex++){
        row = sheet.getRow(rowIndex);
        if(row == null){
         continue;
        }
        //当前行列数
        int tempRowSize = row.getLastCellNum();
        //始终让rowSize为最大列数
        if(tempRowSize > rowSize){
         rowSize = tempRowSize;
        }
        //单元格数据暂存
        String[] values = new String[rowSize];
        //标识行中是否有数据
        boolean hasValue = false;
        //该行中列数
        int cols = row.getLastCellNum();
        for(int col = 0; col < cols; col++){
         //暂存党员个数据
         String value = "";
         //单元格
         cell = row.getCell(col);
         //如果为空继续下一个单元格
         if(cell == null){
          continue;
         }
         //获得对应单元格中对应格式 的数据
         value = getFormatValue2007(cell);
         System.out.print(value+"\t");
         values[col] = value;
         hasValue = true;
        }
        System.out.println();
        //如果有值加入到result
        if(hasValue){
         result.add(values);
        }
       }
      }
      return result;
     }
     
     /**
      * 返回2007对应单元格的格式化数据
      * @param cell 单元格
      * @return
      */
     public static String getFormatValue2007(XSSFCell cell){
      
      //暂存单元格内容
      String value = "";
      //匹配单元格内容
      switch (cell.getCellType()) {
       //数据格式类型
       case XSSFCell.CELL_TYPE_NUMERIC:
        //判断是否是日期类型
        if(HSSFDateUtil.isCellDateFormatted(cell)){
         Date date = cell.getDateCellValue();
         if(date!=null){
          //格式化日期
          value = new SimpleDateFormat("yyyy-mm-dd").format(date);
         }else{
          value = "";
         }
        }else{
         //格式化数据
         value =new  DecimalFormat("0").format(cell.getNumericCellValue());
        }
        break;
       //字符串类型
       case XSSFCell.CELL_TYPE_STRING:
        value = cell.getStringCellValue();
        break;
       //公式生成类型
       case XSSFCell.CELL_TYPE_FORMULA:
        //导入时如果为公式生成的数据则无值
        if(!cell.getStringCellValue().equals("")){
         value = cell.getStringCellValue();
        }else{
         value = cell.getNumericCellValue()+"";
        }
        break;
       //空白
       case XSSFCell.CELL_TYPE_BLANK:
        value = "";
        break;
       //布尔型
       case XSSFCell.CELL_TYPE_BOOLEAN:
        value = cell.getBooleanCellValue()+"";
        break;
       //错误格式
       case XSSFCell.CELL_TYPE_ERROR:
        value = "";
        break;
       default:
        value = cell.toString();
      }
      return value;
     }


     /**
      * Excel2003处理方法
      * @param file 所要处理的文件
      * @return
      * @throws IOException
      */
     private static List<String[]> readExcel2003(File file) throws IOException {
      //存放获取的数据
      List<String[]> result = new ArrayList<String[]>();
      //创建一个输入流
      FileInputStream in = new FileInputStream(file);
      //创建对Excel操作的对象
      HSSFWorkbook workbook = new HSSFWorkbook(in);
      //行大小
      int rowSize = 0;
      //工作簿的个数
      int sheets = workbook.getNumberOfSheets();
      //工作簿对象
      HSSFSheet sheet;
      //行
      HSSFRow row;
      //单元格
      HSSFCell cell;
      //对每个工作簿进行循环
      for(int i = 0 ;i < sheets ; i++){
       //获得工作簿
       sheet = workbook.getSheetAt(i);
       //工作簿中的行数
       int rowNum = sheet.getLastRowNum();
       for(int rowIndex = 1 ; rowIndex <= rowNum ; rowIndex++){
        row = sheet.getRow(rowIndex);
        if(row==null){
         continue;
        }
        //获取当前行的列数
        int tempRowSize = row.getLastCellNum();
        //总是最大列数
        if(tempRowSize > rowSize){
         rowSize = tempRowSize;
        }
        //获得单元格的内容暂存
        String[] values = new String[rowSize];
        //标识Excel中是否有数据
        boolean hasValue = false;
        //该行中列数
        int cols = row.getLastCellNum();
        //循环对列取值
        for(int col = 0 ;col < cols ; col++){
         //单元格暂存
         String value = "";
         //获得单元格
         cell = row.getCell(col);
         //如果为空继续下一个单元格
         if(cell == null){
          continue;
         }
         //获得对应单元格中的格式化数据
         value = getFormatValue2003(cell);
         System.out.print(value+"\t");
         values[col] = value;
         hasValue = true;
        }
        System.out.println();
        //有内容则加入到result中
        if(hasValue){
         result.add(values);
        }
       }
      }
      return result;
     }
     
     /**
      * 返回2003对应单元格的格式化数据
      * @param cell 单元格
      * @return
      */
     public static String getFormatValue2003(HSSFCell cell){
      
      //暂存单元格内容
      String value = "";
      //匹配单元格内容
      switch (cell.getCellType()) {
       //数据格式类型
       case XSSFCell.CELL_TYPE_NUMERIC:
        //判断是否是日期类型
        if(HSSFDateUtil.isCellDateFormatted(cell)){
         Date date = cell.getDateCellValue();
         if(date!=null){
          //格式化日期
          value = new SimpleDateFormat("yyyy-mm-dd").format(date);
         }else{
          value = "";
         }
        }else{
         //格式化数据
         value =new  DecimalFormat("0").format(cell.getNumericCellValue());
        }
        break;
       //字符串类型
       case XSSFCell.CELL_TYPE_STRING:
        value = cell.getStringCellValue();
        break;
       //公式生成类型
       case XSSFCell.CELL_TYPE_FORMULA:
        //导入时如果为公式生成的数据则无值
        if(!cell.getStringCellValue().equals("")){
         value = cell.getStringCellValue();
        }else{
         value = cell.getNumericCellValue()+"";
        }
        break;
       //空白
       case XSSFCell.CELL_TYPE_BLANK:
        value = "";
        break;
       //布尔型
       case XSSFCell.CELL_TYPE_BOOLEAN:
        value = cell.getBooleanCellValue()+"";
        break;
       //错误格式
       case XSSFCell.CELL_TYPE_ERROR:
        value = "";
        break;
       default:
        value = cell.toString();
      }
      return value;
     }

  • 相关阅读:
    Docker容器(分享十五)
    oracle数据库迁移主从复制ADG(分享十四)
    mysql数据库迁移主从复制(分享十三)
    rsync+inotify实现服务器之间文件实时同步(分享十三)
    mysql数据库迁移(分享十二)
    数据库迁移(分享十一续集)
    Codeforces 1185G2 Playlist for Polycarp (hard version) 背包,暴力
    Codeforces 747F Igor and Interesting Numbers DP 组合数
    Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火
    Codeforces 1140F 线段树 分治 并查集
  • 原文地址:https://www.cnblogs.com/qixing/p/3043102.html
Copyright © 2020-2023  润新知