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>对象 * * @param in,fileName * @return * @throws IOException */ public static List> getListByExcel(InputStream in, String fileName) throws Exception { List> 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>(); // 直接获取第一个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 dataRow = null; // 首行为定义标题的行,数据从第2行开始 for (int i = 1; i < rows; i++) { dataRow = new ArrayList(); // 获取行 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 li = new ArrayList(); for (int y = row * .getFirstCellNum(); y <= countCellNum; y++) { cell = row.getCell(y); * li.add(this.getCellValue(cell)); * * } list.add(li); } */ work.close(); return list; } /** * 描述:获取IO流中的数据,组装成List>>对象,多个sheet * * @param in,fileName * @return * @throws IOException */ public static List>> getMulitListByExcel(InputStream in, String fileName) throws Exception { List> list = null; // 创建Excel工作薄 Workbook work = getWorkbook(in, fileName); if (null == work) { throw new Exception("创建Excel工作薄为空!"); } List>> returnList = new ArrayList>>(); for (Sheet sheet : work) { Row row = null; Cell cell = null; list = new ArrayList>(); if (sheet == null) { continue; } // 取得Excel的总列数,总行数 int columns = 0; Row firstRow = sheet.getRow((short) 0); if (firstRow != null) { columns = firstRow.getPhysicalNumberOfCells(); } int rows = sheet.getPhysicalNumberOfRows(); List dataRow = null; // 首行为定义标题的行,数据从第2行开始 for (int i = 1; i < rows; i++) { dataRow = new ArrayList(); // 获取行 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<>()); } } work.close(); returnList.add(list); } return returnList; } /** * 描述:根据文件后缀,自适应上传文件的版本 * * @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; } } }