Excel导入(POI)源码——模板导入+错误数据处理

Apache POI是种比较流行的API,它允许程序员使用Java程序创建修改和显示MS Office文件。这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Office文件的开源库。它包含类和方法对用户输入数据或文件到MS Office文档进行解码。Apache的Jakata项目的POI子项目,目前比较成熟的是HSSF接口,处理MSExcel对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

一.pom配置

<!-- 集中定义依赖版本号 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <poi.version>3.11</poi.version>
    </properties>

    <dependencies>
        <!-- Excel解析工具类 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>${poi.version}</version>
        </dependency>
    </dependencies>     

二.ExcelConstants.java静态常量

public class ExcelConstants {
    public static final String OFFICE_EXCEL_2003_POSTFIX = "xls"; // excel2003-2007文件后缀名
    public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx"; // excel2010文件后缀名
    public static final String EXCEL_DIR = "/excel"; // excel存储根目录
    public static final String EXCEL_USER_DIR = EXCEL_DIR + "/user"; // 用户的excel存储目录
    public static final String EXCEL_MODEL_DIR = EXCEL_DIR + "/model";// excel模板的存储目录
    public static final String EXCEL_USER_MODEL = "user_export_model.xlsx"; // 用户的excel模板名称
    public static final String INITIAL_PASSWORD = "000000"; // 用户导入时的初始密码
    public static final int START_SHEET = 0; // excel文件开始读取的sheet数
    public static final int START_ROW = 1; // excel文件开始读取的行数
    public static final String ERROR_MESSAGE = "errorMessage";// 导入时的错误信息
    public static final String ERROR_COUNT = "errorCount";// 失败条数
    public static final String SUCCESS_COUNT = "successCount";// 成功条数
    public static final String ERROR_POSTFIX = ".xlsx";// 错误信息文件后缀名
    public static final String ERROR_SEPARATOR = ";"; // 错误信息分隔符
    public static final String USER = "user"; // 导入user集合的key

    public static final String role_expert = "专家";  // 专家
    public static final String role_trainee = "学员"; // 学员
    public static final String gender_man = "男";  // 男
    public static final String gender_woman = "女"; // 女
}

三.ErrorMessage.java错误数据实体

public class ErrorMessage {
    // 错误信息所在工作表
    private Integer sheetNum;
    // 错误信息所在的具体行数
    private Integer rowNum;
    // 错误信息提示
    private String message;

    public Integer getSheetNum() {
        return sheetNum;
    }

    public void setSheetNum(Integer sheetNum) {
        this.sheetNum = sheetNum;
    }

    public Integer getRowNum() {
        return rowNum;
    }

    public void setRowNum(Integer rowNum) {
        this.rowNum = rowNum;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

四.ReadExcel.java 表格处理类

/**
 * 
 * <p>Title: ReadExcel</p> 
 * <p>Description: </p>
 * @author xy
 * @date 2018年6月27日 
 */
public class ReadExcel {

    /**
     * 选择处理Excel方式
     * 
     * <p>Title: readImportExcel</p> 
     * <p>Description: </br>获取导入的Excel表的后缀(xls或xlsx)
     *                 </br>然后根据不同的格式执行不同的处理Excel方法</p>  
     * @time 上午11:39:18 
     * @param path --->excel路径
     * @return
     */
    public Map<String, Object> readImportExcel(String path) {
        if (path == null || "".equals(path)) {
            return null;
        }
        String postfix = getPostfix(path);
        if (!"".equals(postfix)) {
            if (ExcelConstants.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)) {
                return analysisXls(path);
            } else if (ExcelConstants.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)) {
                return analysisXlsx(path);
            }
        }
        return null;
    }

    /**
     * <p>Title: getPostfix</p> 
     * <p>Description: 获取路径文件的后缀名</p>  
     * @time 下午5:12:26 
     * @param path --->excel路径
     * @return
     */
    public static String getPostfix(String path) {
        if (path == null || "".equals(path.trim())) {
            return "";
        }
        if (path.contains(".")) {
            return path.substring(path.lastIndexOf(".") + 1, path.length());
        }
        return "";
    }

    /**
     * 解析xls格式的Excel表格
     * 
     * <p>Title: analysisXls</p> 
     * <p>Description: 该方法是处理2003-2007表格的方法</p>  
     * @time 下午12:15:49 
     * @param path
     * @return
     */
    public Map<String, Object> analysisXls(String path) {
        List<User> users = null;
        List<ErrorMessage> errorMessages = null;
        try {
            InputStream input = new FileInputStream(path);
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(input);
            users = new ArrayList<User>();
            errorMessages = new ArrayList<ErrorMessage>();
            User user = null;
            ErrorMessage errorMessage = null;
            // 读取每个Sheet
            for (int numSheet = ExcelConstants.START_SHEET; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
                HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
                if (hssfSheet == null) {
                    continue;
                }
                // 第一行是标题 第二行开始读取
                for (int rowNum = ExcelConstants.START_ROW; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                    HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow != null) {
                        try {
                            /**将区域编号的cell中的内容当做字符串处理*/
                            hssfRow.getCell(0).setCellType(HSSFCell.CELL_TYPE_STRING);

                            /**定义变量接受相对应的Excel列的值*/
                            HSSFCell realName = hssfRow.getCell(0);
                            HSSFCell username = hssfRow.getCell(1);
                            HSSFCell password = hssfRow.getCell(2);
                            HSSFCell role = hssfRow.getCell(3);
                            HSSFCell gender = hssfRow.getCell(4);

                            /**创建用户对象保存对应的数据属性值(所要导入的数据对应的实体)*/
                            user = new User();
                            user.setSheetNum(numSheet);
                            user.setRowNum(rowNum);
                            user.setRealname(getCellValue(realName));
                            user.setUsername(getCellValue(username));
                            user.setMobile(getCellValue(username));
                            /** 密码不为空则设置初始密码为用户提供的密码 密码为空则设置为默认定义的初始密码*/
                            String passwords = getCellValue(password);
                            if (passwords != null && !"".equals(passwords)) {
                                user.setPassword(passwords);
                            } else {
                                user.setPassword(EntityTrainingSystemConstants.initPassword);
                            }
                            /** 根据角色设置不同的属性值*/
                            String rolename = getCellValue(role);
                            if (rolename.equals(ExcelConstants.role_expert)) {
                                user.setRoleId(EntityTrainingSystemConstants.EXPERT);
                            } else if (rolename.equals(ExcelConstants.role_trainee)) {
                                user.setRoleId(EntityTrainingSystemConstants.TRAINEE);
                            }
                            /** 根据性别设置不同的属性值*/
                            String genders = getCellValue(gender);
                            if (genders.equals(ExcelConstants.gender_man)) {
                                user.setGender(EntityTrainingSystemConstants.isMan);
                            } else if (genders.equals(ExcelConstants.gender_woman)) {
                                user.setGender(EntityTrainingSystemConstants.isWoman);
                            } else {
                                user.setGender(EntityTrainingSystemConstants.isMan);
                            }
                            users.add(user);
                        } catch (Exception e) {
                            e.printStackTrace();
                            errorMessage = new ErrorMessage();
                            errorMessage.setSheetNum(numSheet);
                            errorMessage.setRowNum(rowNum);
                            errorMessage.setMessage("数据读取出错,请按照模板格式进行改正!(请修改后删除此提示信息重新导入该行)");
                            errorMessages.add(errorMessage);
                            // 出现异常跳过这一行
                            continue;
                        }
                    }
                }
            }
            hssfWorkbook.close();
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put(ExcelConstants.USER, users);
        resultMap.put(ExcelConstants.ERROR_MESSAGE, errorMessages);
        return resultMap;
    }

    /**
     * 解析Xlsx格式的Excel表格
     * 
     * <p>Title: analysisXlsx</p> 
     * <p>Description: </br>该方法是处理Excel2010表格的方法</p>  
     * @time 下午5:24:39 
     * @param path
     * @return
     */
    public Map<String, Object> analysisXlsx(String path) {
        List<User> users = null;
        List<ErrorMessage> errorMessages = null;
        try {
            InputStream input = new FileInputStream(path);
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(input);
            users = new ArrayList<User>();
            errorMessages = new ArrayList<ErrorMessage>();
            User user = null;
            ErrorMessage errorMessage = null;
            // 读取每个sheet
            for (int numSheet = ExcelConstants.START_SHEET; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
                XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
                if (xssfSheet == null) {
                    continue;
                }
                // 除去第一行标题,从第二行开始读取
                for (int rowNum = ExcelConstants.START_ROW; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
                    XSSFRow xssfRow = xssfSheet.getRow(rowNum);
                    if (xssfRow != null) {
                        try {
                            /**将区域编号的cell中的内容当做字符串处理,防止将excel中的数字以科学记数法的方式读取*/
                            xssfRow.getCell(0).setCellType(XSSFCell.CELL_TYPE_STRING);
                            /**定义变量接受相对应的Excel列的值*/
                            XSSFCell realName = xssfRow.getCell(0);
                            XSSFCell username = xssfRow.getCell(1);
                            XSSFCell password = xssfRow.getCell(2);
                            XSSFCell role = xssfRow.getCell(3);
                            XSSFCell gender = xssfRow.getCell(4);

                            /**创建用户对象保存对应的数据属性值(所要导入的数据对应的实体)*/
                            user = new User();
                            user.setSheetNum(numSheet);
                            user.setRowNum(rowNum);
                            user.setRealname(getCellValue(realName));
                            user.setUsername(getCellValue(username));
                            user.setMobile(getCellValue(username));
                            user.setPassword(getCellValue(password));

                            String rolename = getCellValue(role);
                            if (rolename.equals(ExcelConstants.role_expert)) {
                                user.setRoleId(EntityTrainingSystemConstants.EXPERT);
                            } else if (rolename.equals(ExcelConstants.role_trainee)) {
                                user.setRoleId(EntityTrainingSystemConstants.TRAINEE);
                            }

                            String genders = getCellValue(gender);
                            if (genders.equals(ExcelConstants.gender_man)) {
                                user.setGender(EntityTrainingSystemConstants.isMan);
                            } else if (genders.equals(ExcelConstants.gender_woman)) {
                                user.setGender(EntityTrainingSystemConstants.isWoman);
                            } else {
                                user.setGender(EntityTrainingSystemConstants.isMan);
                            }
                            users.add(user);
                        } catch (Exception e) {
                            e.printStackTrace();
                            errorMessage = new ErrorMessage();
                            errorMessage.setSheetNum(numSheet);
                            errorMessage.setRowNum(rowNum);
                            errorMessage.setMessage("数据读取出错,请按照模板格式进行改正!(请修改后删除此提示信息重新导入该行)");
                            errorMessages.add(errorMessage);
                            // 出现异常跳过这一行
                            continue;
                        }
                    }
                }
            }
            xssfWorkbook.close();
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put(ExcelConstants.USER, users);
        resultMap.put(ExcelConstants.ERROR_MESSAGE, errorMessages);
        return resultMap;
    }

    /**
     * <p>Title: getCellValue</p> 
     * <p>Description: (Excel2003-2007)读取HSSFCell的值</p>  
     * @time 下午5:35:16 
     * @param hssfCell
     * @return
     */
    private String getCellValue(HSSFCell hssfCell) {
        Object result = null;
        if (hssfCell != null) {
            单元格类型:Numeric:0,String:1,Formula:2,Blank:3,Boolean:4,Error:5
            int cellType = hssfCell.getCellType();
            switch (cellType) {
            case HSSFCell.CELL_TYPE_STRING:
                result = hssfCell.getStringCellValue();
                break;
            case HSSFCell.CELL_TYPE_NUMERIC:
                result = hssfCell.getNumericCellValue();
                break;
            case HSSFCell.CELL_TYPE_FORMULA:
                result = hssfCell.getNumericCellValue();
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                result = hssfCell.getBooleanCellValue();
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                result = null;
                break;
            case HSSFCell.CELL_TYPE_ERROR:
                result = null;
                break;
            default:
                break;
            }
        }
        return result == null ? "" : String.valueOf(result);
    }

    /**
     * <p>Title: getCellValue</p> 
     * <p>Description: (Excel2010)读取XSSFCell的值</p>  
     * @time 下午5:35:03 
     * @param xssfCell
     * @return
     */
    private String getCellValue(XSSFCell xssfCell) {
        Object result = null;
        if (xssfCell != null) {
            单元格类型:Numeric:0,String:1,Formula:2,Blank:3,Boolean:4,Error:5
            int cellType = xssfCell.getCellType();
            switch (cellType) {
            case XSSFCell.CELL_TYPE_STRING:
                result = xssfCell.getStringCellValue();
                break;
            case XSSFCell.CELL_TYPE_NUMERIC:
                result = xssfCell.getNumericCellValue();
                break;
            case XSSFCell.CELL_TYPE_FORMULA:
                result = xssfCell.getNumericCellValue();
                break;
            case XSSFCell.CELL_TYPE_BOOLEAN:
                result = xssfCell.getBooleanCellValue();
                break;
            case XSSFCell.CELL_TYPE_BLANK:
                result = null;
                break;
            case XSSFCell.CELL_TYPE_ERROR:
                result = null;
                break;
            default:
                break;
            }
        }
        return result == null ? "" : String.valueOf(result);
    }   

五.ErrorMessageExcel.java 错误数据处理类

public class ErrorMessageExcel {

    /**
     * 获取路径文件的后缀名
     * 
     * <p>Title: getPostfix</p> 
     * <p>Description: </p>  
     * @time 下午5:47:54 
     * @param path
     * @return
     */
    public String getPostfix(String path) {
        if (path == null || "".equals(path.trim())) {
            return "";
        }
        if (path.contains(".")) {
            return path.substring(path.lastIndexOf(".") + 1, path.length());
        }
        return "";
    }

    /**
     * 产生带有错误信息的Excel文件
     * 
     * <p>Title: makeErrorExcel</p> 
     * <p>Description: </p>  
     * @time 下午5:47:44 
     * @param path
     * @param outPath
     * @param errorMessages
     */
    public void makeErrorExcel(String path, String outPath, List<ErrorMessage> errorMessages) {
        String postfix = getPostfix(path);
        if (!"".equals(postfix)) {
            if (ExcelConstants.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)) {
                makeXlsExcel(path, outPath, errorMessages);
            } else if (ExcelConstants.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)) {
                makeXlsxExcel(path, outPath, errorMessages);
            }
        }
    }

    /**
     * 产生带有错误信息的
     * Excel2003-2007
     * 
     * <p>Title: makeXlsExcel</p> 
     * <p>Description: </p>  
     * @time 下午5:47:30 
     * @param path
     * @param outPath
     * @param errorMessages
     */
    public void makeXlsExcel(String path, String outPath, List<ErrorMessage> errorMessages) {
        try {
            InputStream input = new FileInputStream(path);
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(input);
            for (int numSheet = ExcelConstants.START_SHEET; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
                HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
                if (hssfSheet == null) {
                    continue;
                }
                int lastRowNum = hssfSheet.getLastRowNum();
                // 除去第一行标题,从第二行开始读取
                for (int rowNum = lastRowNum; rowNum >= ExcelConstants.START_ROW; rowNum--) {
                    HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow != null) {
                        // 判断该行是否为存在错误的行
                        ErrorMessage errorMessage = validateErrorRow(numSheet, rowNum, errorMessages);
                        if (errorMessage != null) {
                            // 存在错误将错误信息写到最后一列
//                          Cell errorMessageCell = hssfRow.createCell((int) hssfRow.getLastCellNum());
                            Cell errorMessageCell = hssfRow.createCell(6);
                            errorMessageCell.setCellValue(errorMessage.getMessage());
                            // 创建字体对象
                            Font font = hssfWorkbook.createFont();
                            // 设置字体颜色
                            font.setColor(HSSFColor.RED.index);
                            // 创建样式对象
                            CellStyle style = hssfWorkbook.createCellStyle(); 
                            // 将字体放入样式中
                            style.setFont(font);
                            // 设置单元格样式
                            errorMessageCell.setCellStyle(style);
                        } else {
                            if (rowNum < lastRowNum) {
                                // 不存在错误删除该行内容
                                hssfSheet.shiftRows(rowNum + 1, lastRowNum, -1);
                            } else {
                                hssfSheet.removeRow(hssfRow);
                            }
                        }
                    }
                }
            }
            OutputStream output = new FileOutputStream(outPath);
            hssfWorkbook.write(output);
            // 关闭流
            hssfWorkbook.close();
            input.close();
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 产生带有错误信息的
     * Excel2010
     * 
     * <p>Title: makeXlsxExcel</p> 
     * <p>Description: </p>  
     * @time 下午5:48:13 
     * @param path
     * @param outPath
     * @param errorMessages
     */
    public void makeXlsxExcel(String path, String outPath, List<ErrorMessage> errorMessages) {
        try {
            InputStream input = new FileInputStream(path);
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(input);
            for (int numSheet = ExcelConstants.START_SHEET; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
                XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
                if (xssfSheet == null) {
                    continue;
                }
                int lastRowNum = xssfSheet.getLastRowNum();
                // 除去第一行标题,从第二行开始读取
                for (int rowNum = lastRowNum; rowNum >= ExcelConstants.START_ROW; rowNum--) {
                    XSSFRow xssfRow = xssfSheet.getRow(rowNum);
                    if (xssfRow != null) {
                        // 判断该行是否为存在错误的行
                        ErrorMessage errorMessage = validateErrorRow(numSheet, rowNum, errorMessages);
                        if (errorMessage != null) {
                            // 存在错误将错误信息写到最后一列
                            Cell errorMessageCell = xssfRow.createCell(6);
//                          Cell errorMessageCell = xssfRow.createCell(xssfRow.getLastCellNum());
                            errorMessageCell.setCellValue(errorMessage.getMessage());
                            // 创建字体对象
                            Font font = xssfWorkbook.createFont();
                            // 设置字体颜色
                            font.setColor(HSSFColor.RED.index);
                            // 创建样式对象
                            CellStyle style = xssfWorkbook.createCellStyle(); 
                            // 将字体放入样式中
                            style.setFont(font);
                            // 设置单元格样式
                            errorMessageCell.setCellStyle(style);
                        } else {
                            // 不存在错误删除该行内容
                            if (rowNum < lastRowNum) {
                                xssfSheet.shiftRows(rowNum + 1, lastRowNum, -1);
                            } else {
                                xssfSheet.removeRow(xssfRow);
                            }
                        }
                    }
                }
            }
            OutputStream output = new FileOutputStream(outPath);
            xssfWorkbook.write(output);
            // 关闭流
            xssfWorkbook.close();
            input.close();
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断是否为存在错误的行
     * 
     * @param sheetNum所在sheet
     * @param rowNum所在行数
     * @param errorMessages错误信息集合
     * @return errorMessage错误信息
     */
    private ErrorMessage validateErrorRow(int sheetNum, int rowNum, List<ErrorMessage> errorMessages) {
        for (ErrorMessage errorMessage : errorMessages) {
            int errorSheetNum = errorMessage.getSheetNum().intValue();
            int errorRowNum = errorMessage.getRowNum().intValue();
            // 判断错误信息所在的sheet和row是否和当前的sheet和row相等,若相等则该行是错误信息行
            if (sheetNum == errorSheetNum && rowNum == errorRowNum) {
                return errorMessage;
            }
        }
        return null;
    }
}

六.导入数据操作

/**
     * <p>Title: importExcelFile</p> 
     * <p>Description: 导入excel文件 
     * 1.上传Excel到服务器
     * -->2.读取上传的excel数据   
     * -->3.判断收集错误信息
     * -->4.没有错误数据则保存数据到数据库  </p>  
     * @time 上午10:21:19 
     * @param request
     * @param file
     * @return
     */
    @SuppressWarnings({ "unchecked", "unlikely-arg-type" })
    @RequestMapping(value = "/importFile", method = RequestMethod.POST)
    public String importExcelFile(HttpServletRequest request, MultipartFile file, Model model) {
        StringBuffer buffer = new StringBuffer();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String savePath = buffer.append(ExcelConstants.EXCEL_USER_DIR).append("/").append(format.format(new Date()))
                .append("/").toString();
        /* 上传excel文件 */
        Map<String, Object> resultMap = FileUploadUtil.uploadFile(request, file, savePath);
        /* 获取上传文件的真实URL和webUrl */
        String url = (String) resultMap.get(EntityTrainingSystemConstants.PHYSICS_URL);
        String webUrl = (String) resultMap.get(EntityTrainingSystemConstants.WEB_URL);
        /* 获取数据 */
        ReadExcel readExcel = new ReadExcel();
        resultMap = readExcel.readImportExcel(url);/* 获取刚导入的excel数据 */
        int errorCount = 0;/* 初始化错误条数 */
        int successCount = 0;/* 初始化错误条数 */
        /* 用户集合和错误集合 */
        List<User> userList = (List<User>) resultMap.get(ExcelConstants.USER);
        List<ErrorMessage> errorMessages = (List<ErrorMessage>) resultMap.get(ExcelConstants.ERROR_MESSAGE);
        try {
            for (Iterator<User> iterator = userList.iterator(); iterator.hasNext();) {
                User user = iterator.next();
                ErrorMessage errorMessage = null;
                /* 如果数据为空,则导入失败 */
                if (user.getUsername() != null && !"".equals(user.getUsername()) && user.getRealname() != null
                        && !"".equals(user.getRealname()) 
                        && user.getRoleId() != null && !"".equals(user.getRoleId())) {
                    /* 通过获取到的用户名查询数据库 */
                    List<User> checkuser = userService.findUserByUsername(user);
                    if (checkuser.size() == 0) {/* 如果没有重复数据,添加新数据,有重复数据不操作 */
                        User users = new User();
                        users.setRealname(user.getRealname());// realname
                        users.setUsername(user.getUsername());// username
                        users.setMobile(user.getUsername());// mobilephone
                        String password = user.getPassword();
                        String salt = EntityTrainingSystemConstants.PASSWORD_SALT;
                        String Password = new SimpleHash("SHA-1", password, salt).toString();
                        users.setPassword(Password);// password
                        users.setRoleId(user.getRoleId());
                        users.setGender(user.getGender());
                        userService.save(users);
                        successCount++;/* 成功条数统计 */
                    } else {
                        /* 封装错误信息 */
                        errorMessage = new ErrorMessage();
                        errorMessage.setSheetNum(user.getSheetNum());
                        errorMessage.setRowNum(user.getRowNum());
                        errorMessage.setMessage("用户名信息已存在!(请修改后删除此提示信息重新导入)");
                        errorMessages.add(errorMessage);
                        iterator.remove();
                        errorCount++;/* 用户名重复条数统计 */
                    }
                } else {
                    /* 封装错误信息 */
                    errorMessage = new ErrorMessage();
                    errorMessage.setSheetNum(user.getSheetNum());
                    errorMessage.setRowNum(user.getRowNum());
                    errorMessage.setMessage("导入数据存中在空数据!(请修改后删除此提示信息重新导入)");
                    errorMessages.add(errorMessage);
                    iterator.remove();
                    errorCount++;/* 数据有空的项统计 */
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (!errorMessages.isEmpty()) {
                String excelName = url.substring(url.lastIndexOf(File.separator) + 1);
                StringBuffer messageBuffer = new StringBuffer();
                String fileName = messageBuffer.append(excelName.substring(0, excelName.lastIndexOf("."))).append("_")
                        .append(ExcelConstants.ERROR_MESSAGE).append(ExcelConstants.ERROR_POSTFIX).toString();
                String errorRealUrl = url.substring(0, url.lastIndexOf(File.separator) + 1) + fileName;
                // 修改excel文件向其中添加错误信息
                ErrorMessageExcel errorMessageExcel = new ErrorMessageExcel();
                errorMessageExcel.makeErrorExcel(url, errorRealUrl, errorMessages);
                String errorUrl = webUrl.substring(0, webUrl.lastIndexOf("/") + 1) + fileName;
                model.addAttribute("errorUrl", errorUrl);
            }
        }
        model.addAttribute("countSum", successCount + errorCount);
        model.addAttribute("successCount", successCount);
        model.addAttribute("errorCount", errorCount);
        model.addAttribute("method", "post");
        return "/admin/organization/importResultList";
    }
    /**
     * <p>Title: downloadErrorFile</p> 
     * <p>Description: 下载错误Excel文件</p>  
     * @time 下午1:17:22 
     * @param request
     * @param response
     * @param path
     * @throws IOException
     */
    @ResponseBody
    @RequestMapping(value = "/downloadErrorFile", method = RequestMethod.POST)
    public void downloadErrorFile(HttpServletRequest request, HttpServletResponse response, String path)
            throws IOException {
        String realPath = request.getSession().getServletContext().getRealPath(path);
        File downloadFile = new File(realPath); 
        DownloadUtil.downloadFile(response, downloadFile);
    }
    /**
     * <p>Title: downloadExcelModel</p> 
     * <p>Description: 下载导入模板</p>
     * @time 下午4:00:02 
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "/downloadExcelModel", method = RequestMethod.POST)
    public void downloadExcelModel(HttpServletRequest request, 
            HttpServletResponse response) throws IOException {
            String realPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
            String fileName = ExcelConstants.EXCEL_USER_MODEL;  
            File downloadFile = new File(realPath, fileName);
            DownloadUtil.downloadFile(response, downloadFile);
    }

猜你喜欢

转载自blog.csdn.net/weixin_37519752/article/details/80828157