java前端上傳excel並后端解析入庫


前端代碼:

<el-button type="primary" @click="importVisible= true">批量</el-button>
<el-dialog title="導入" v-model="importVisible" width="500px"  v-if="importVisible">
            <div style="text-align: center;margin-top: 20px">
                <el-upload
                        class="upload-demo"
                        drag
                        :action="url"
                        :data="addParams"
                        :on-success="uploadSuc"
                        :on-remove="removeFile"
                        :on-error="uploadErr">
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">將文件拖到此處,或<em>點擊上傳</em></div>
                </el-upload>
            </div>
        </el-dialog>
        <!-- 導入分配有錯誤信息后的彈框 -->
        <el-dialog :title="errTitle" v-model="batchImportErrMsg" width="70%" @close="emptyClerkImportErrMsg">
            <el-button round type="danger" style="float:right;margin-buttom: 20px" @click="exportExcel()">請及時導出數據
            </el-button>
            <el-table :data="batchImportErrMsgList" height="565" stripe="true" id="staTable"
                      :cell-style="{padding: '2px 0'}" border class="table" ref="multipleTable" header-cell-class-name="table-header" @selection-change="selectChangesStore">
                <el-table-column prop="errMsg" label="錯誤信息"  align="left">
                    <template #default="scope">{{ scope.row.errMsg }}</template>
                </el-table-column>
            </el-table>
            <template #footer>
                <span class="dialog-footer">
                    <el-button type="primary" @click="emptyClerkImportErrMsg">關 閉</el-button>
                </span>
            </template>
        </el-dialog>
 
         
data(){
        return{
            tableHeight: document.body.clientHeight * 0.55 + "px",
            importVisible:false,
            url:FL_SERVICE + "/qwManage/excelBatchImport",
            addParams:reactive({
                reqTicket: sessionStorage.getItem("reqClientTicket")
            }),
            batchImportErrMsg:false,
            batchImportErrMsgList:[],
            errTitle:'',
        }
    },

  

methods
     emptyClerkImportErrMsg(){
            this.batchImportErrMsg = false;
            this.batchImportErrMsgList = [];
        },
        exportExcel:function(){
            let tables = document.querySelector("#staTable");
            let xlsxParam = {raw: true};
            var wb = this.$xlsx.utils.table_to_book(tables, xlsxParam);
            var wbout = this.$xlsx.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
            try {
                const fileName = '批量分配-錯誤信息';
                this.$fileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), fileName + '.xlsx')
            } catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
            return wbout
        },
        uploadSuc(response,file,fileList){
            console.log(response);
            if(response.retCode == REQ_SUCCESS_GET){
                this.importVisible = false;
                this.removeFile();
                this.getData();
                if(JSON.stringify(response.body).indexOf("全部上傳成功") != -1){
                    ElMessage.success(response.body);
                }else{
                    this.errTitle = response.body.successNum;
                    this.batchImportErrMsgList = response.body.errList;
                    this.batchImportErrMsg = true;
                }
            }else{
                ElMessage.error(response.retMsg);
                this.getData();
            }
        },

        removeFile(file,fileList){
            console.log("文件刪除");
        },

        uploadErr(err,file,fileList){
            console.log(err);
            ElMessage.error("上傳失敗");
        },

 

 



后端:controller
@RequestMapping(value = "/excelBatchImport", method = RequestMethod.POST)
    @ResponseBody
    public Result excelBatchImport(@RequestParam Map<String, String> map, @RequestParam("file") MultipartFile file) {
        Result result = new Result();
        String fileName = file.getOriginalFilename();
        if (map.get("reqTicket") == null || "".equals(String.valueOf(map.get("reqTicket")))) {
            return result.error("令牌信息為空,請重新登陸");
        }
        String reqTicket = String.valueOf(map.get("reqTicket"));
        ServerResp<Object> resp = qwGatherManageService.excelBatchImport(fileName, file, reqTicket);
        return result.conversion(resp);
    }
}

serviceImpl

@Override
public ServerResp<Object> excelBatchImport(String fileName, MultipartFile file, String reqTicket) {
    ServerResp<Object> resp = new ServerResp<>();
    try {
        SysTfUserInfo userInfo = commonUtils.getCurUserInfo(reqTicket);
        if (userInfo == null) {
            return resp.error("登陸失效,請重新登陸");
        }
        Integer id = userInfo.getId();
        if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
            throw new RuntimeException("上傳文件格式不正確");
        }
        boolean isExcel2003 = true;
        if (fileName.matches("^.+\\.(?i)(xlsx)$")) {
            isExcel2003 = false;
        }
        InputStream is = file.getInputStream();
        Workbook wb = null;
        if (isExcel2003) {
            wb = new HSSFWorkbook(is);
        } else {
            wb = new XSSFWorkbook(is);
        }
        Sheet sheet = wb.getSheetAt(0);
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        for (int r = 1; r <= sheet.getLastRowNum(); r++) {
            Row row = sheet.getRow(r);
            if (row == null) {
                break;
            }
            Map<String, Object> addParams = new HashMap<>();
            DataFormatter formatter = new DataFormatter();
            // 遇到為空的就退出循環(表格沒亂來的情況下是到了最后一條數據了)
            if (org.apache.commons.lang3.StringUtils.isBlank(formatter.formatCellValue(row.getCell(0)))) {
                break;
            }
            addParams.put("focusClerkName", formatter.formatCellValue(row.getCell(0)));     // 集運人員名稱
            addParams.put("focusClerkPhone", formatter.formatCellValue(row.getCell(1)));    // 集運人員手機號
            addParams.put("clerkName", formatter.formatCellValue(row.getCell(2)));          // 托管員工名稱
            addParams.put("clerkPhone", formatter.formatCellValue(row.getCell(3)));         // 托管員工手機號

            list.add(addParams);
        }
        logger.log(MyLogUtil.LOG_INFO, "集運人員分配托管員工導入數據" + list.size() + "條。");
        if (list.size() > 0) {
            int sum = 0;
            int i = 1;
            Map<String, Object> resultMap = new HashMap<>();
            List<Map<String, Object>> errList = new ArrayList<>();
            boolean errCode = true;
            for (Map<String, Object> map : list) {
                Map<String, Object> errMap = new HashMap<>();
                StringBuffer errMsg = new StringBuffer("");
                i = i + 1; // 第一條信息是excel第2行開始的
                logger.log(MyLogUtil.LOG_INFO, "===第" + i + "行信息:"+map.toString());
                logger.log(MyLogUtil.LOG_INFO, "查詢集運人員手機號【" + String.valueOf(map.get("focusClerkPhone")) + "】是否存在");
                List<Map<String,Object>> focusClerk = qwGatherManageMapper.selectFocusClerkByPhone((String) map.get("focusClerkPhone"));
                if (focusClerk.size() == 0) {
                    if (errCode) {
                        errMsg.append("*第" + i + "行信息:");
                    }
                    resp.error("集運人員手機號不存在");
                    errMsg.append("【" + String.valueOf(map.get("focusClerkPhone")) + "】集運人員不存在,");
                    errCode = false;
                }

                logger.log(MyLogUtil.LOG_INFO, "查詢托管員工手機號【" + String.valueOf(map.get("clerkPhone")) + "】是否存在");
                TfClerkInfo clerkInfo = tfClerkInfoMapper.selectClerkInfoByPhone((String) map.get("clerkPhone"));
                if (clerkInfo == null) {
                    if (errCode) {
                        errMsg.append("*第" + i + "行信息:");
                    }
                    resp.error("托管員工手機號不存在");
                    errMsg.append("【" + String.valueOf(map.get("clerkPhone")) + "】托管員工不存在,");
                    errCode = false;
                }

                // 如果基礎信息填的沒錯,就判斷是否已分配
                logger.log(MyLogUtil.LOG_INFO, "查詢托管員工手機號【" + String.valueOf(map.get("clerkPhone")) + "】是否分配");
                if (errCode) {
                    Map<String, Object> param = new HashMap<>();
                    param.put("staffIdt", clerkInfo.getId());
                    List<Map<String, Object>> qwStaffRelList = qwGatherManageMapper.ifDivide(param);
                    if (qwStaffRelList.size() > 0) {
                        if (errCode) {
                            errMsg.append("*第" + i + "行信息:");
                        }
                        resp.error("該員工已分配");
                        errMsg.append("【" + String.valueOf(map.get("clerkPhone")) + "】員工已分配在【"+qwStaffRelList.get(0).get("mobile")+"】下,");
                        errCode = false;
                    }
                }

                // 如果以上有excel信息錯誤,errCode 就為 false
                if (!errCode) {
                    logger.log(MyLogUtil.LOG_INFO, "第" + i + "行信息:"+map.toString()+"信息有誤,下一條");
                    errMap.put("errMsg", errMsg);
                    errList.add(errMap);
                    errCode = true;
                    continue;  // 跳出循環不執行以下代碼,只記錄 errMsg 最終返回前端
                }

                // 程序走到這,說明這一行信息沒報錯,可以插入分配對應信息表
                Map<String, Object> param = new HashMap<>();
                param.put("staffIdy", focusClerk.get(0).get("id"));
                param.put("staffIdt", clerkInfo.getId());
                Integer count = qwGatherManageMapper.addQwStaffRel(param);

                if (count == 0) {
                    throw new RuntimeException("集運分配員工錯誤,回滾");
                }

                if (count > 0) {
                    logger.log(MyLogUtil.LOG_INFO, "第" + i + "行信息:"+map.toString()+"分配成功");
                    sum++;
                }
            }
            if (list.size() == sum) {
                resp.success("全部上傳成功:" + sum + "條");
            } else {
                resultMap.put("successNum","總數量:"+list.size()+"條。分配成功數量:" + sum + "條。失敗數量:" + (list.size() - sum) + "條。");
                resultMap.put("errList", errList);
                logger.log(MyLogUtil.LOG_ERROR, "分配成功數量:" + sum + "條。分配失敗名單:" + errList);
                resp.success(resultMap);
            }

        } else {
            resp.error("文件內容為空");
        }
    } catch (Exception e) {
        logger.log(MyLogUtil.LOG_ERROR, "集運分配托管員工異常", e);
        resp.error("集運分配托管員工異常");
    }
    return resp;
}

 

mapper.xml

<insert id="addQwStaffRel" parameterType="java.util.Map">
        INSERT qw_staff_rel
        (staff_id_y,
        staff_id_t,
        mobile,
        head_img,
        name,
        user_id,
        state,
        login_state,
        create_time,
        update_time)
        VALUE
        (#{staffIdy},
        #{staffIdt},
        (select phone from tf_clerk_info where id = #{staffIdt}),
        null,
        null,
        null,
        'E',
        'OFF',
        NOW(),
        NOW())
    </insert>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM