Alan
2021-02-19 7e172d1de04d55caafd86489fa81c06c142adab2
febs-server/febs-server-hr/src/main/java/cc/mrbird/febs/server/hr/util/PoiImportExcel.java
New file
@@ -0,0 +1,190 @@
package cc.mrbird.febs.server.hr.util;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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;
public class PoiImportExcel {
   private final static String excel2003L = ".xls"; // 2003- 版本的excel
   private final static String excel2007U = ".xlsx"; // 2007+ 版本的excel
   /**
    * 描述:获取IO流中的数据,组装成List<List<Object>>对象
    *
    * @param in,fileName
    * @return
    * @throws IOException
    */
   public static List<List<Object>> getListByExcel(InputStream in, String fileName) throws Exception {
      List<List<Object>> list = null;
      // 创建Excel工作薄
      Workbook work = getWorkbook(in, fileName);
      if (null == work) {
         throw new Exception("创建Excel工作薄为空!");
      }
      Sheet sheet = null;
      Row row = null;
      Cell cell = null;
      list = new ArrayList<List<Object>>();
      // 直接获取第一个sheet
      sheet = work.getSheetAt(0);
      if (sheet == null) {
         return list;
      }
      // 取得Excel的总列数,总行数
      int columns = 0;
      Row firstRow = sheet.getRow((short) 0);
      if (firstRow != null) {
         columns = firstRow.getPhysicalNumberOfCells();
      }
      int rows = sheet.getPhysicalNumberOfRows();
      List<Object> dataRow = null;
      // 首行为定义标题的行,数据从第2行开始
      for (int i = 1; i < rows; i++) {
         dataRow = new ArrayList<Object>();
         // 获取行
         row = sheet.getRow(i);
         if (row != null) {
            // columns=row.getPhysicalNumberOfCells();//不在这里设置,通过firstRow来获取列数信息。
            for (int j = 0; j < columns; j++) {
               // 获取某行某列的某一个单元格
               cell = row.getCell(j);
               // 往dataRow存值
               dataRow.add(getCellValue(cell));
            }
            list.add(dataRow);
         } else {
            list.add(new ArrayList<>());
         }
      }
      // 遍历当前sheet中的所有行
      /*
       * int countCellNum = 0; for (int j = sheet.getFirstRowNum(); j <=
       * sheet.getLastRowNum(); j++) { row = sheet.getRow(j); if (row == null
       * || row.getFirstCellNum() == j) { if (row != null) countCellNum =
       * row.getLastCellNum(); continue; }
       *
       * // 遍历所有的列 List<Object> li = new ArrayList<Object>(); for (int y = row
       * .getFirstCellNum(); y <= countCellNum; y++) { cell = row.getCell(y);
       * li.add(this.getCellValue(cell));
       *
       * } list.add(li); }
       */
      work.close();
      return list;
   }
   /**
    * 描述:根据文件后缀,自适应上传文件的版本
    *
    * @param inStr,fileName
    * @return
    * @throws Exception
    */
   public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
      Workbook wb = null;
      String fileType = fileName.substring(fileName.lastIndexOf("."));
      if (excel2003L.equals(fileType)) {
         wb = new HSSFWorkbook(inStr); // 2003-
      } else if (excel2007U.equals(fileType)) {
         wb = new XSSFWorkbook(inStr); // 2007+
      } else {
         throw new Exception("解析的文件格式有误!");
      }
      return wb;
   }
   /**
    * 描述:对表格中数值进行格式化
    *
    * @param cell
    * @return
    */
   @SuppressWarnings("deprecation")
   public static Object getCellValue(Cell cell) {
      try {
         Object value = null;
         if (cell == null) {
            value = "";
            return value;
         }
         DecimalFormat df = new DecimalFormat("0"); // 格式化number String字符
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 日期格式化
         DecimalFormat df2 = new DecimalFormat("0.00"); // 格式化数字
         switch (cell.getCellType()) {
         case Cell.CELL_TYPE_STRING:
            value = cell.getRichStringCellValue().getString();
            break;
         case Cell.CELL_TYPE_NUMERIC:
            if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
               if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")
                     || cell.getCellStyle().getDataFormat() == 176) {
                  sdf = new SimpleDateFormat("HH:mm");
               }
               Date date = cell.getDateCellValue();
               value = sdf.format(date);
            } else if (cell.getCellStyle().getDataFormat() == 58) {
               // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
               SimpleDateFormat sdf2 = new SimpleDateFormat("MM-dd");
               double cellValue = cell.getNumericCellValue();
               Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(cellValue);
               value = sdf2.format(date);
            } else if (cell.getCellStyle().getDataFormat() == 183 || cell.getCellStyle().getDataFormat() == 177
                  || cell.getCellStyle().getDataFormat() == 181) {
               // 处理自定义日期格式:y年m月d日(通过判断单元格的格式id解决,id的值是183)
               SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
               Date date = cell.getDateCellValue();
               value = sdf2.format(date);
            } else {
               if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                  value = df.format(cell.getNumericCellValue());
               } else {
                  value = df2.format(cell.getNumericCellValue());
               }
            }
            break;
         case Cell.CELL_TYPE_BOOLEAN:
            value = cell.getBooleanCellValue();
            break;
         case Cell.CELL_TYPE_BLANK:
            value = "";
            break;
         default:
            value = cell.getStringCellValue();
            break;
         }
         return value;
      } catch (Exception e) {
         return null;
      }
   }
}