poi导入文件

package com.foriseland.fas.member.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
/**
 * Excel组件
 * 
 * @author zxy
 * @version 1.0
 * @since 1.0
 */ 
public abstract class ImportExcelUtil { 
 
    /**
     * Excel 2003
     */ 
    private final static String XLS = "xls"; 
    /**
     * Excel 2007
     */ 
    private final static String XLSX = "xlsx"; 
    /**
     * 分隔符
     */ 
    private final static String SEPARATOR = "|"; 
 
    /**
     * 由Excel文件的Sheet导出至List
     * 
     * @param file
     * @param sheetNum
     * @return
     */ 
    public static List<String> exportListFromExcel(File file, int sheetNum) 
            throws IOException { 
        return exportListFromExcel(new FileInputStream(file), 
                FilenameUtils.getExtension(file.getName()), sheetNum); 
    } 
 
    /**
     * 由Excel流的Sheet导出至List
     * 
     * @param is
     * @param extensionName
     * @param sheetNum
     * @return
     * @throws IOException
     */ 
    public static List<String> exportListFromExcel(InputStream is, 
            String extensionName, int sheetNum) throws IOException { 
 
        Workbook workbook = null; 
 
        if (extensionName.toLowerCase().equals(XLS)) { 
            workbook = new HSSFWorkbook(is); 
        } else if (extensionName.toLowerCase().equals(XLSX)) { 
            workbook = new XSSFWorkbook(is); 
        } 
 
        return exportListFromExcel(workbook, sheetNum); 
    } 
 
    /**
     * 由指定的Sheet导出至List
     * 
     * @param workbook
     * @param sheetNum
     * @return
     * @throws IOException
     */ 
    private static List<String> exportListFromExcel(Workbook workbook, 
            int sheetNum) { 
 
        Sheet sheet = workbook.getSheetAt(sheetNum); 
 
        // 解析公式结果 
        FormulaEvaluator evaluator = workbook.getCreationHelper() 
                .createFormulaEvaluator(); 
 
        List<String> list = new ArrayList<String>(); 
 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
       
        int minRowIx = sheet.getFirstRowNum(); 
        int maxRowIx = sheet.getLastRowNum(); 
        for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) { 
            Row row = sheet.getRow(rowIx); 
            StringBuilder sb = new StringBuilder(); 
 
            short minColIx = row.getFirstCellNum(); 
            short maxColIx = row.getLastCellNum(); 
            for (short colIx = minColIx; colIx <= maxColIx; colIx++) { 
                Cell cell = row.getCell(new Integer(colIx)); 
                CellValue cellValue = evaluator.evaluate(cell); 
                if (cellValue == null) { 
                 sb.append(SEPARATOR); 
                    continue; 
                } 
                System.out.println(cellValue.getCellType());
                // 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了 
                // 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html 
                switch (cellValue.getCellType()) { 
                case Cell.CELL_TYPE_BOOLEAN: 
                    sb.append(SEPARATOR + cellValue.getBooleanValue()); 
                    break; 
                case Cell.CELL_TYPE_NUMERIC: 
                    // 这里的日期类型会被转换为数字类型,需要判别后区分处理 
                    if (DateUtil.isCellDateFormatted(cell)) { 
                        sb.append(SEPARATOR + sdf.format(cell.getDateCellValue())); 
                    } else { 
                        sb.append(SEPARATOR + cellValue.getNumberValue()); 
                    } 
                    break; 
                case Cell.CELL_TYPE_STRING: 
                    sb.append(SEPARATOR + cellValue.getStringValue()); 
                    break; 
                case Cell.CELL_TYPE_FORMULA: 
                    break; 
                case Cell.CELL_TYPE_BLANK: 
//                 sb.append(SEPARATOR); 
                    break; 
                case Cell.CELL_TYPE_ERROR: 
                    break; 
                default: 
                    break; 
                } 
            } 
            sb.deleteCharAt(sb.length()-1);
            list.add(sb.toString()); 
        } 
        return list; 
    } 
   
   
    /**
     * 由Excel文件的Sheet导出至List (特殊:自定义起始行)
     * 
     * @param file
     * @param sheetNum
     * @return
     */ 
    public static List<String> exportListFromExcelCustom(File file, int sheetNum,int startNum) 
            throws IOException { 
        return exportListFromExcelCustom(new FileInputStream(file), 
                FilenameUtils.getExtension(file.getName()), sheetNum,startNum); 
    } 
 
    /**
     * 由Excel流的Sheet导出至List (特殊:自定义起始行)
     * 
     * @param is
     * @param extensionName
     * @param sheetNum
     * @return
     * @throws IOException
     */ 
    public static List<String> exportListFromExcelCustom(InputStream is, 
            String extensionName, int sheetNum,int startNum) throws IOException { 
        Workbook workbook = null; 
        if (extensionName.toLowerCase().equals(XLS)) { 
            workbook = new HSSFWorkbook(is); 
        } else if (extensionName.toLowerCase().equals(XLSX)) { 
            workbook = new XSSFWorkbook(is); 
        } 
 
        return exportListFromExcelCustom(workbook, sheetNum, startNum); 
    } 
 
    /**
     * 由指定的Sheet导出至List (特殊:自定义起始行)
     * 
     * @param workbook
     * @param sheetNum
     * @return
     * @throws IOException
     */ 
    private static List<String> exportListFromExcelCustom(Workbook workbook, 
            int sheetNum, int startNum) { 
 
        Sheet sheet = workbook.getSheetAt(sheetNum); 
   
        // 解析公式结果 
        FormulaEvaluator evaluator = workbook.getCreationHelper() 
                .createFormulaEvaluator(); 
 
        List<String> list = new ArrayList<String>(); 
 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
       
//        int minRowIx = sheet.getFirstRowNum();         
        int minRowIx = startNum;
//        int PhysicalNumberOfRows = sheet.getPhysicalNumberOfRows();
        int maxRowIx = sheet.getLastRowNum(); 
        for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) {       
            Row row = sheet.getRow(rowIx); 
            if ((row == null) || isBlankRow(row)) {
                continue;
            }
            StringBuilder sb = new StringBuilder();  
           
            short minColIx = row.getFirstCellNum(); 
            short maxColIx = row.getLastCellNum(); 
            for (short colIx = minColIx; colIx <= maxColIx; colIx++) { 
                Cell cell = row.getCell(new Integer(colIx)); 
                CellValue cellValue = evaluator.evaluate(cell); 
                if (cellValue == null) { 
                 sb.append(SEPARATOR); 
                    continue; 
                } 
//                 System.out.println(cellValue.getCellType());
                // 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了 
                // 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html 
                switch (cellValue.getCellType()) { 
                case Cell.CELL_TYPE_BOOLEAN: 
                    sb.append(SEPARATOR + cellValue.getBooleanValue()); 
                    break; 
                case Cell.CELL_TYPE_NUMERIC: 
                    // 这里的日期类型会被转换为数字类型,需要判别后区分处理 
                    if (DateUtil.isCellDateFormatted(cell)) { 
                        sb.append(SEPARATOR + sdf.format(cell.getDateCellValue())); 
                    } else {
                     DecimalFormat df = new DecimalFormat("0");
                     String value = df.format(cellValue.getNumberValue());
                        sb.append(SEPARATOR + value);
                    } 
                    break; 
                case Cell.CELL_TYPE_STRING: 
                    sb.append(SEPARATOR + cellValue.getStringValue()); 
                    break; 
                case Cell.CELL_TYPE_FORMULA: 
                    break; 
                case Cell.CELL_TYPE_BLANK: 
//                 sb.append(SEPARATOR); 
                    break; 
                case Cell.CELL_TYPE_ERROR: 
                    break; 
                default: 
                    break; 
                } 
            }
            sb.deleteCharAt(sb.length()-1);
            list.add(sb.toString());
        }          
        return list; 
    } 
   
    /**
     * 由Excel文件的Sheet导出至List (特殊:自定义起始行)
     * 
     * @param file
     * @param sheetNum
     * @return
     */ 
    public static List<String> exportListFromExcelZQ(File file, int sheetNum,int startNum) 
            throws IOException { 
        return exportListFromExcelZQ(new FileInputStream(file), 
                FilenameUtils.getExtension(file.getName()), sheetNum,startNum); 
    } 
   
    /**
     * 由Excel流的Sheet导出至List (特殊:自定义起始行)
     * 
     * @param is
     * @param extensionName
     * @param sheetNum
     * @return
     * @throws IOException
     */ 
    public static List<String> exportListFromExcelZQ(InputStream is, 
            String extensionName, int sheetNum,int startNum) throws IOException { 
        Workbook workbook = null; 
        if (extensionName.toLowerCase().equals(XLS)) { 
            workbook = new HSSFWorkbook(is); 
        } else if (extensionName.toLowerCase().equals(XLSX)) { 
            workbook = new XSSFWorkbook(is); 
        } 
 
        return exportListFromExcelZQ(workbook, sheetNum, startNum); 
    } 
   
    /**
     * 由指定的Sheet导出至List (特殊:自定义起始行)
     * 
     * @param workbook
     * @param sheetNum
     * @return
     * @throws IOException
     */ 
    private static List<String> exportListFromExcelZQ(Workbook workbook, 
            int sheetNum, int startNum) { 
 
        Sheet sheet = workbook.getSheetAt(sheetNum); 
   
        // 解析公式结果 
        FormulaEvaluator evaluator = workbook.getCreationHelper() 
                .createFormulaEvaluator(); 
 
        List<String> list = new ArrayList<String>(); 
 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
       
//        int minRowIx = sheet.getFirstRowNum();         
        int minRowIx = startNum;
//        int PhysicalNumberOfRows = sheet.getPhysicalNumberOfRows();
        int maxRowIx = sheet.getLastRowNum(); 
        for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) {       
            Row row = sheet.getRow(rowIx); 
            if ((row == null) || isBlankRow(row)) {
                continue;
            }
            StringBuilder sb = new StringBuilder();  
           
            short minColIx = row.getFirstCellNum(); 
            short maxColIx = row.getLastCellNum(); 
            for (short colIx = minColIx; colIx <= maxColIx; colIx++) { 
                Cell cell = row.getCell(new Integer(colIx)); 
                CellValue cellValue = evaluator.evaluate(cell); 
                if (cellValue == null) { 
                 sb.append(SEPARATOR); 
                    continue; 
                } 
//                 System.out.println(cellValue.getCellType());
                // 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了 
                // 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html 
                switch (cellValue.getCellType()) { 
                case Cell.CELL_TYPE_BOOLEAN: 
                    sb.append(SEPARATOR + cellValue.getBooleanValue()); 
                    break; 
                case Cell.CELL_TYPE_NUMERIC: 
                    // 这里的日期类型会被转换为数字类型,需要判别后区分处理 
                    if (DateUtil.isCellDateFormatted(cell)) { 
                        sb.append(SEPARATOR + sdf.format(cell.getDateCellValue())); 
                    } else {
                     DecimalFormat df = new DecimalFormat("0");
                     String value = df.format(cellValue.getNumberValue());
                     if (cellValue.getNumberValue() > Double.parseDouble(value)){
                         value = String.valueOf(cellValue.getNumberValue());
                     }
                        sb.append(SEPARATOR + value);
                    } 
                    break; 
                case Cell.CELL_TYPE_STRING: 
                    sb.append(SEPARATOR + cellValue.getStringValue()); 
                    break; 
                case Cell.CELL_TYPE_FORMULA: 
                    break; 
                case Cell.CELL_TYPE_BLANK: 
//                 sb.append(SEPARATOR); 
                    break; 
                case Cell.CELL_TYPE_ERROR: 
                    break; 
                default: 
                    break; 
                } 
            }
            sb.deleteCharAt(sb.length()-1);
            list.add(sb.toString());
        }          
        return list; 
    } 
   
    /**
     * 根据不同的标识找到合适自己的文件导入上传
     * @param file   文件路劲
     * @param sheetNum  excel的第几个tab
     * @param startNum  开始行数
     * @param sign   用户自定义标识根据不同的需要满足自己的需求
     * @return
     * @throws IOException
     */
    public static List<String> exportListFromExcelNew(File file, int sheetNum, int startNum, String sign) throws IOException{
     
      String extensionName = FilenameUtils.getExtension(file.getName());
      InputStream is =  new FileInputStream(file);
      Workbook workbook = null; 
         if (extensionName.toLowerCase().equals(XLS)) { 
             workbook = new HSSFWorkbook(is); 
         } else if (extensionName.toLowerCase().equals(XLSX)) { 
             workbook = new XSSFWorkbook(is); 
         } 
          Sheet sheet = workbook.getSheetAt(sheetNum); 
          // 解析公式结果 
          FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
   
          List<String> list = new ArrayList<String>(); 
   
          SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
         
          int minRowIx = startNum;
          int maxRowIx = sheet.getLastRowNum(); 
          for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) {       
              Row row = sheet.getRow(rowIx); 
              if ((row == null) || isBlankRow(row)) {
                  continue;
              }
              StringBuilder sb = new StringBuilder();  
             
              short minColIx = row.getFirstCellNum(); 
              short maxColIx = row.getLastCellNum(); 
              for (short colIx = minColIx; colIx <= maxColIx; colIx++) { 
                  Cell cell = row.getCell(new Integer(colIx)); 
                  CellValue cellValue = evaluator.evaluate(cell);
                  if (cellValue == null) { 
                   sb.append(SEPARATOR); 
                      continue; 
                  } 
                  // 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了 
                  // 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html 
                  switch (cellValue.getCellType()) { 
                  case Cell.CELL_TYPE_BOOLEAN: 
                      sb.append(SEPARATOR + cellValue.getBooleanValue()); 
                      break; 
                  case Cell.CELL_TYPE_NUMERIC: 
                      // 这里的日期类型会被转换为数字类型,需要判别后区分处理 
                      if (DateUtil.isCellDateFormatted(cell)) { 
                          sb.append(SEPARATOR + sdf.format(cell.getDateCellValue())); 
                      } else {
                  if ("contractUpload".equals(sign)) {
                   Row row0 = sheet.getRow(0);
                   Cell cell0 = row0.getCell(new Integer(colIx)); 
                   if(String.valueOf(cell0).contains("合同")){
                    sb.append(SEPARATOR + cellValue.getNumberValue());
                   }else {
                    DecimalFormat df = new DecimalFormat("0");
                          String value = df.format(cellValue.getNumberValue());
                          sb.append(SEPARATOR + value);
       }
      }else {
       DecimalFormat df = new DecimalFormat("0");
                      String value = df.format(cellValue.getNumberValue());
                      sb.append(SEPARATOR + value);
      }
                      } 
                      break; 
                  case Cell.CELL_TYPE_STRING: 
                      sb.append(SEPARATOR + cellValue.getStringValue()); 
                      break; 
                  case Cell.CELL_TYPE_FORMULA: 
                      break; 
                  case Cell.CELL_TYPE_BLANK: 
                      break; 
                  case Cell.CELL_TYPE_ERROR: 
                      break; 
                  default: 
                      break; 
                  } 
              }
              sb.deleteCharAt(sb.length()-1);
              list.add(sb.toString());
          }          
          return list;
 }
   
   
   
   
    /**
     * 判断excel中是否存在有空格的无效数据
     * @param row
     * @return
     */
    public static boolean isBlankRow(Row row){
        if(row == null) {
         return true;
        }
        boolean result = true;
        for(int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++){
            Cell cell = row.getCell(i, Row.RETURN_BLANK_AS_NULL);
            String value = "";
            if(cell != null){
                switch (cell.getCellType()) {
                case Cell.CELL_TYPE_STRING:
                    value = cell.getStringCellValue();
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    value = String.valueOf((int) cell.getNumericCellValue());
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    value = String.valueOf(cell.getBooleanCellValue());
                    break;
                case Cell.CELL_TYPE_FORMULA:
                    value = String.valueOf(cell.getCellFormula());
                    break;
                //case Cell.CELL_TYPE_BLANK:
                //    break;
                default:
                    break;
                }
                
                if(!value.trim().equals("")){
                    result = false;
                    break;
                }
            }
        }      
        return result;
    }
   
    public static void main(String[] args) {
     String path = "D:/2016_02_29_15_19_20.xls"; 
        List<String> list = null; 
        try { 
            list = exportListFromExcel(new File(path), 0);
            for(int i=0;i<list.size();i++){
             System.out.println(list.get(i));
            }
        } catch (IOException e) {
         e.printStackTrace();
        } 
 }
   
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值