分析在线生成模板、导入、导出

vue前端代码:

1.列表按钮
<el-form-item>
  <el-button  v-if="isAuth('salary:jxperreward:downloadFile')" type="primary" @click="createCSV()">生成模板</el-button>
</el-form-item>
<el-form-item >
  <el-upload class="upload-demo" ref="upload" :action="uploadurl()" :on-success="uploadSuccess" :on-remove="handleRemove"  :on-error="uperror"
             accept = ".xlsx" :file-list="fileList" :on-change = "fileChange" :show-file-list="false">
    <el-button  v-if="isAuth('salary:jxperbasepay:importbasepayxlsx')" type="primary" >导入</el-button>
  </el-upload>
</el-form-item>
<el-form-item>
  <el-button  v-if="isAuth('salary:jxpayroll:export')" type="primary" @click="createExcel()">导出</el-button>
</el-form-item>

2.方法实现

createCSV (val) {
  location.href = process.env.BASE_API + 'salary/jxperreward/downloadFile?token=' + Vue.cookie.get('token')
},
uploadurl () {
  return process.env.BASE_API + 'salary/jxperreward/importperrewardxlsx?token=' + Vue.cookie.get('token')
},
uploadSuccess (response, file, fileList) {
  this.type = '1'
  // 上传成功
  if (response.data.flag) {
    if (response.data.number === 1) {
      this.$message({message: '上传失败金额请输入数字或小数格式', type: 'error', duration: 2000})
    } if (response.data.number === 2) {
      this.percode = response.data.percode
      this.$message({message: this.percode + '的揽存号' + '不存在', type: 'error', duration: 2000})
    } else {
      this.fileInfo.fileName = '奖励.xls'
      this.tempFname = response.data.tempFname
      this.fileInfo.filedCnName = '奖励'
      this.fileInfo.filePath = response.data.filePath
      this.fileInfo.realName = response.data.tempFname
      this.$message({message: '上传成功', type: 'success', duration: 2000})
      const params = {
        'fileName': this.tempFname,
        'type': this.type
      }
      this.showRewardVisible = true
      this.$nextTick(() => {
        this.$refs.RewardFileList.init(params, this.fileInfo)
      })
    }
  } else {
    this.$message({message: '上传失败请下载最新模板', type: 'error', duration: 2000})
    this.$nextTick(() => {
    })
  }
},
createExcel () {
  const params = []
  params.push(this.dataForm.key + ',' + this.dataForm.percode + ',' + this.dataForm.orgName + ',' + this.dataForm.fixwagedate)
  return API.creatcsv.createExcel(params)
},

3.后台逻辑实现

(1)生成模板

@RequestMapping("/downloadFile")
    @RequiresPermissions("salary:jxrewardimportfileinfo:download")
    public void downloadFile(HttpServletRequest request, HttpServletResponse response) throws IOException{
        String fileName = "奖励工资"; //模板名称
        String[] headers = {"人员揽存号","人员姓名","项目","奖励金额"}; //列标题
        HSSFWorkbook wb = new HSSFWorkbook();//创建工作薄
        //新建sheet
        HSSFSheet sheet1 = wb.createSheet("Sheet1");
        //生成sheet1内容
        HSSFRow row = sheet1.createRow(0);
        //写标题
        for (int i = 0; i < headers.length; i++) {
            row.createCell(i).setCellValue(headers[i]);
        }
      //下拉框数据
        String type= "1";
        String status = "1";
        JxProjectEntity jxProject = new JxProjectEntity();
        jxProject.setType(type);
        jxProject.setStatus(status);
        List<JxProjectEntity> list = jxProjectService.queryName(jxProject);
        if(list.size()!=0){
        String nameList = "";
        for(int i=0;i<list.size();i++){
            String name = list.get(i).getName();
            nameList = nameList+name+",";
        }
        String[] str1 = null;
        if(nameList.contains(",")){
            str1 = nameList.split(",");
        }
        //String[] str1 = {"机动工资、奖金","自助设备计酬"};
        //255以内的下拉,参数分别是:作用的sheet、下拉内容数组、起始行、终止行、起始列、终止列
        sheet1.addValidationData(setDataValidation(sheet1, str1, 1, 50000, 2 ,2)); //超过255个报错 
        }
        // 文件临时存放路径
        String filePath = CSVConfig.getCsvFilePath();
        fileName = fileName + ".xls";
        FileUtil.createFile(filePath);
     // 将文件保存到指定的位置
        try {
            FileOutputStream fos = new FileOutputStream(CSVConfig.getCsvFilePath() + File.separator + fileName);
            wb.write(fos);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        CSVUtils.exportFile(response, fileName); // 下载生成的CSV文件
}

(2)导入模板

/**
     * 上传文件
     */
    @RequestMapping("/importFile")
    @RequiresPermissions("salary:jxrewardimportfileinfo:importFile")
    public R importOrgFile(@RequestParam(value="file") MultipartFile file){
        Map<String, Object> data = new HashMap<String, Object>();
        if (!file.isEmpty()) {
            // 获取文件的后缀名
            String suffixName = file.getOriginalFilename();
            // 生成临时文件名:数据集_日期_10位uuid 如[BCKB_19990909_xxxxxxxxxx.xlsx]
            String fileName = DateUtils.getSysDate() + "_" + UUIDUtil.generateFileID() + suffixName;
            // 文件上传路径
            String filePath = CSVConfig.getCsvFilePath() + File.separator + DateUtils.getSysDate();
            String impFilePath = filePath + File.separator + fileName;
            try {
                if (FileUtil.createFile(filePath)){
                    // 转存文件
                    file.transferTo(new File(impFilePath));
                    data.put("tempFname", fileName);
                    data.put("filePath", filePath);
                    data.put("realName", file.getOriginalFilename());
                    data.put("flag", true);
                    data.put("number", 0);
                }
            } catch (Exception e) {
                // 报错删除
                FileUtil.delFile(filePath);
                data.put("flag", false);
                e.printStackTrace();
            }
            File file1 = new File(impFilePath);
            int total1 = 0;
            List<JxOrgRewardEntity> listMap = new ArrayList<JxOrgRewardEntity>();
            Map<String, Object> projectlist = new HashMap<String,Object>();
            try {
                List<List<Object>> list = ExcelUtils.readExcel(file1);
                for(int x = 1; x < list.size(); x++) {
                        JxOrgRewardEntity map = new JxOrgRewardEntity();
                        //Map<String, JxRewardImportFileInfoEntity> map = new HashMap<String, JxRewardImportFileInfoEntity>();
                         String value = list.get(x).toString();
                         String value1 = value.substring(1, value.length()-1);
                         String[] value2 = value1.split(", ");
                         String percode = value2[0].substring(0, value2[0].length()-3);
                         map.setPercode(percode);
                         map.setPername(value2[1]);
                         map.setProject(value2[2]);
                        projectlist.put(""+x, value2[2]);
                        String reg = "^[0,9]+(.[0,9]+)?$";
                        Pattern pattern = Pattern.compile(reg);
                        // 忽略大小写的写法
                        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
                        Matcher matcher = pattern.matcher(value2[3]);
                        // 查找字符串中是否有匹配正则表达式的字符/字符串
                        if(!matcher.find()){
                            // 报错删除
                            FileUtil.delFile(filePath);
                            data.put("flag", true);
                            data.put("number", 1);
                            return R.error().put("data", data);
                        }
                        BigDecimal pay = new BigDecimal(value2[3]);
                         map.setRewardPay(pay);
                        listMap.add(map);
                }
                //循环导入的数据,判断人员揽存号是否真实存在,不存在则提示揽存号不存在并返回
                for(int z=0;z<listMap.size();z++){
                    String percode = listMap.get(z).getPercode();
                     SysPersonEntity perlist = sysPersonService.queryObjectByPercode(percode);
                     if(perlist == null){
                         data.put("flag", true);
                         data.put("number", 2);
                         data.put("percode", listMap.get(z).getPername());
                         return R.ok().put("data", data);
                     }
                }
                for(int i=0;i<projectlist.size();i++){
                    String project = projectlist.get(""+i).toString();
                    JxProjectEntity jxProject = new JxProjectEntity();
                    jxProject.setName(project);
                    total1 += jxProjectService.isexit(jxProject);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             
            if(total1==0){
                // 报错删除
                FileUtil.delFile(filePath);
                data.put("flag", false);
                return R.error().put("data", data);
            }else{
            return R.ok().put("data", data);
         }
        }else{
            data.put("flag", false);
            return R.error().put("data", data);
        }
    }

(3)导出模板
    @RequestMapping("/createExcel")
    @RequiresPermissions("salary:jxpayroll:export")
    public void createExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {    
        // 获得业务日期上个月
        //String fixwagedate = "2018-07";
        String params=request.getParameter("params");
        }
        //提供导出excel的表头月份展示
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date d = null;
        try {
            d = format.parse(fixwagedate+"-01");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String month = Integer.toString(DateUtils.findMonth(d));
        String orgRel = "";
        String userId = getUser().getUserId();
        List<SysRoleEntity> roleList = sysPersonService.getRoleId(userId);
        entity.setOrgRel(orgRel);
        List<JxPayrollEntity> dataList = jxPayrollService.queryAllList(entity);
        String type = "序号,单位,姓名,奖励工资,绩效工资,薪金,扣除项,应领绩效工资,固定工资,应纳税所得额,工资应纳税额,税后扣除项,扣税后需减除的固定工资,实领工资,核发工资账号,员工本人签字,备注";
        String[] type1 = type.split(",");
        String[] header = new String[17];
        for(int i=0;i<type1.length;i++){
            header[i] = type1[i];
        }
        HSSFWorkbook workbook = new HSSFWorkbook();// excel文件对象
        HSSFSheet sheet = workbook.createSheet("sheet1");// 工作表对象
   
        // 设置列头样式
        HSSFCellStyle titleStyle = setTitleCellStyles(workbook, sheet);
        HSSFCellStyle dataStyle = setDataCellStyles(workbook, sheet);
        
        HSSFRow row00 = sheet.createRow(0);
        row00.setHeight((short) 800);//目的是想把行高设置成55px
        HSSFCellStyle titleStyle1 = null;
        titleStyle1 = workbook.createCellStyle();
        // 设置字体
        HSSFFont font = workbook.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 18); // 设置字体大小
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示
        titleStyle1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直
        titleStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
        titleStyle1.setFont(font);
        //row00.setRowStyle(titleStyle1);
        // 创建第二标题行
        HSSFRow row0 = sheet.createRow(2);
        row0.setHeight((short) 800);//目的是想把行高设置成80px
        for (int i = 0; i < 3; i++) {
            HSSFCell cell = row0.createCell(i);
            cell.setCellStyle(titleStyle);
        }
        //从数据库中查询所有已启用的奖励项目
        String type0= "1";
        String status = "1";
        JxProjectEntity jxProject = new JxProjectEntity();
        jxProject.setType(type0);
        jxProject.setStatus(status);
        List<JxProjectEntity> list = jxProjectService.queryName(jxProject);
        String[] salary = null;
        String[] salaryList = null;
        String salary1 = "";
        if(list.size()!=0){
        String nameList = "";
        for(int i=0;i<list.size();i++){
            String name = list.get(i).getName();
            nameList = nameList+name+",";
        }
        if(nameList.contains(",")){
            salary = nameList.split(",");
            for (int i = 3; i < 3+salary.length; i++) {
                HSSFCell cell = row0.createCell(i);
                cell.setCellValue(salary[i-3]);
                //获取到奖励工资的所有二级表头内容,为之后判断人员是否存在该项目并对应插入数据
                salary1 = salary1+(cell.getStringCellValue().toString())+",";
                cell.setCellStyle(titleStyle);
            }
            salaryList = salary1.split(",");
        }
        }else{
            salary =new String[1];
            salaryList =new String[0];
        }
            String[] deducount = new String[] {"综合考评计酬","业务量计酬","合计"};
            for (int i = 3+salary.length; i < 3+salary.length+deducount.length; i++) {
                HSSFCell cell = row0.createCell(i);
                cell.setCellValue(deducount[i-3-salary.length]);
                cell.setCellStyle(titleStyle);
            }
            HSSFCell cell6 = row0.createCell(3+salary.length);
            cell6.setCellStyle(titleStyle);
                    //动态合并列单元格
                    //总表头
                    Integer startrow00 = Integer.parseInt("0");
                    Integer overrow00 = Integer.parseInt("0");
                    Integer startcol00 = Integer.parseInt("0");
                    Integer overcol00 = 3+salary.length+5;
                    sheet.addMergedRegion(new CellRangeAddress(startrow00, overrow00,
                        startcol00, overcol00));
                    HSSFCell cell00 = row00.createCell(0);
                    cell00.setCellValue(month+"月份核发工资明细表");
                    cell00.setCellStyle(titleStyle1);
                    //合并二级表头的一级表头
                        Integer startrow0 = Integer.parseInt("1");
                        Integer overrow0 = Integer.parseInt("1");
                        Integer startcol0 = Integer.parseInt("3");
                        Integer overcol0 = 0;
                        //如果奖励工资的二级表头为0,需要合并奖励工资(不包含二级表头)的表头
                        if(salary.length!=1){
                            overcol0 = 3+salary.length-1;
                        }else{
                            overcol0 = 3;
                            salary =new String[1];
                        }
                        sheet.addMergedRegion(new CellRangeAddress(startrow0, overrow0,
                            startcol0, overcol0));
                      //动态合并行单元格
                        // 合并除带有二级表头的一级表头
                        Integer startrow1 = Integer.parseInt("1");
                        Integer overrow1 = Integer.parseInt("2");
                      //如果奖励工资项下拉二级表头为0,则需要合并该一级表头
                        int i11 = 3;
                        if(salary.length ==1){
                            i11 = 4;            
                        }
                        for (int i = 0; i < i11; i++) {
                            String z0 = Integer.toString(i);
                            Integer startcol1 = Integer.parseInt(z0);
                            Integer overcol1 = Integer.parseInt(z0);
                            sheet.addMergedRegion(new CellRangeAddress(startrow1, overrow1,
                                startcol1, overcol1));
                        }
                        if(deducount1.length ==0){
                              //如果税前扣除项下拉二级表头为0,则需要合并该一级表头
                            Integer startcol1 = 3+salary.length+deducount.length+1;
                            Integer overcol1 = startcol1;
                            sheet.addMergedRegion(new CellRangeAddress(startrow1, overrow1,
                                    startcol1, overcol1));
                        }
                    //poi设置行高列宽
                        //row00.setHeight((short) 700);//目的是想把行高设置成20px
                        HSSFRow row = sheet.createRow(1);
                        row.setHeight((short) 350);//目的是想把行高设置成300px
                    // 创建标题行并写入内容
                    // 设置第一标题行的列宽和样式
                    for (int i = 0; i < 3+salary.length+5; i++) {
                        HSSFCell cell = row.createCell(i);
                        cell.setCellStyle(titleStyle);
                        sheet.autoSizeColumn(1, true);
                        sheet.setColumnWidth(i, sheet.getColumnWidth(i)*17/10);
                    }
                    //设置第一列列宽
                    sheet.setColumnWidth(0, 1500);
                    //设置奖励工资的列宽
                    sheet.setColumnWidth(3, 2500);
                    sheet.setColumnWidth(3+salary.length, 2500);
                    //跳过合并单元格的多余列
                    for (int i = 0; i < 4; i++) {
                        HSSFCell cell = row.createCell(i);
                        cell.setCellValue(header[i]);
                        cell.setCellStyle(titleStyle);
                    }
                    HSSFCell cell44 = row.createCell(3+salary.length);
                    cell44.setCellValue(header[4]);
                    cell44.setCellStyle(titleStyle);
                    HSSFCell cell55 = row.createCell(3+salary.length+deducount.length);
                    cell55.setCellValue(header[5]);
                    cell55.setCellStyle(titleStyle);
                    HSSFCell cell66 = row.createCell(3+salary.length+deducount.length+1);
                    cell66.setCellValue(header[6]);
                    cell66.setCellStyle(titleStyle);
                    int i0 = 3+salary.length+deducount.length+1+deducount1.length; //第三个二级表头之后的第一个表头
                    int i1 = 3+salary.length+deducount.length+1+deducount1.length+4; //第三个二级表头之后的最后一个表头
                    for (int i =i0 ; i < i1; i++) {
                        HSSFCell cell = row.createCell(i);
                        cell.setCellValue(header[i-salary.length+1-deducount.length+1-deducount1.length+1]);
                        cell.setCellStyle(titleStyle);
                    }
                    int i2 = 3+salary.length+deducount.length+1+deducount1.length+4; //最后一个二级表头的第一列单元格
                    HSSFCell cell77 = row.createCell(i2);
                    cell77.setCellValue(header[3+1+1+1+1+4]);//二级表头合并为一个,所有有几个二级表头就加几个1
                    cell77.setCellStyle(titleStyle);
                    int i3 = 3+salary.length+deducount.length+1+deducount1.length+4+otherdeducount.length; //最后一个二级表头之后的表头开始
                    int i4 = 3+salary.length+deducount.length+1+deducount1.length+4+otherdeducount.length+5; //结束表头
                    int i5 = salary.length-1+deducount.length-1+deducount1.length-1+otherdeducount.length-1;//i-i5表示循环插入的表头名称序号
                    for (int i = i3; i < i4; i++) {
                        HSSFCell cell = row.createCell(i);
                        cell.setCellValue(header[i-i5]);
                        cell.setCellStyle(titleStyle);
                    }
        // 内容集合有数组则循环显示增加
        if (dataList != null && dataList.size() > 0) {
            /*if(){
                
            }*/
            // 创建数据
            for (int i = 0; i < dataList.size(); i++) {
                //遍历集合数据,产生数据行
                creatEmployeeData(sheet, i + 4, dataStyle, workbook, dataList.get(i), 
                        salary.length, deducount.length, deducount1.length, otherdeducount.length,salaryList,deducount1List,otherdeducountList);
            }
        }
        
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attchment;fileName=模板;filename=" + URLEncoder.encode(month+"月份核发工资明细表.xls", "UTF-8"));
        workbook.write(response.getOutputStream());
        response.getOutputStream().close();
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值