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