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;
 }

 

posted @ 2013-04-25 18:05  七星6609  阅读(2396)  评论(2编辑  收藏  举报