indexupload.vue 20 KB
Newer Older
xiangjiaojunxp's avatar
xiangjiaojunxp committed
1 2 3 4 5
<template>
    <div class="app-container">
        <el-form  ref="queryForm" size="small" :inline="true" >
            <el-form-item label="行" prop="row">
                <el-input
xiangjiaojunxp's avatar
xiangjiaojunxp committed
6
                    oninput="value=value.replace(/[^\d]/g,'')"
xiangjiaojunxp's avatar
xiangjiaojunxp committed
7 8 9
                    v-model="row"
                    placeholder="请输入开始行"
                    clearable
xiangjiaojunxp's avatar
xiangjiaojunxp committed
10
                    @keyup.enter.native="handleEnter"
xiangjiaojunxp's avatar
xiangjiaojunxp committed
11 12 13
                    maxlength="8"
                />
            </el-form-item>
14 15 16
            <!--            <el-form-item>
                            <el-checkbox v-model="zero">是否比较0或空</el-checkbox>
                        </el-form-item>-->
xiangjiaojunxp's avatar
xiangjiaojunxp committed
17 18 19
            <el-form-item>
                <el-checkbox v-model="numm">是否只比较数值</el-checkbox>
            </el-form-item>
xiangjiaojunxp's avatar
xiangjiaojunxp committed
20 21 22 23 24 25 26 27 28
        </el-form>
        <el-row :gutter="10" class="mb8">
            <el-col :span="1.5">
                <el-upload
                    type="file"
                    name="file"
                    ref="upload"
                    :before-upload="handleFileChange"
                    action=''
xiangjiaojunxp's avatar
xiangjiaojunxp committed
29
                    accept='.xlsx'
xiangjiaojunxp's avatar
xiangjiaojunxp committed
30 31
                    :limit="1"
                    :file-list="fileList"
xiangjiaojunxp's avatar
xiangjiaojunxp committed
32
                    :show-file-list=false
xiangjiaojunxp's avatar
xiangjiaojunxp committed
33 34 35 36 37 38 39 40 41 42 43
                >
                    <el-button  plain size="mini" icon="el-icon-download" type="primary"  >导入初始文件</el-button>
                </el-upload>
            </el-col>
            <el-col :span="1.5">
                <el-upload
                    type="file"
                    name="file"
                    ref="upload"
                    :before-upload="handleFileChange1"
                    action=''
xiangjiaojunxp's avatar
xiangjiaojunxp committed
44
                    accept='.xlsx'
xiangjiaojunxp's avatar
xiangjiaojunxp committed
45 46 47
                    :limit="1"
                    :file-list="fileList"
                    :disabled="disableNextButton"
xiangjiaojunxp's avatar
xiangjiaojunxp committed
48
                    :show-file-list=false
xiangjiaojunxp's avatar
xiangjiaojunxp committed
49 50 51 52 53 54 55 56 57 58 59 60 61 62
                >
                    <el-button  plain size="mini" icon="el-icon-download" type="primary"  :disabled="disableNextButton"  >导入对比文件</el-button>
                </el-upload>
            </el-col>
            <el-col :span="1.5">
                <el-button
                    type="warning"
                    plain
                    icon="el-icon-upload2"
                    size="mini"
                    @click="handleExport"
                >导出</el-button>
            </el-col>
            <el-col :span="1.5">
xiangjiaojunxp's avatar
xiangjiaojunxp committed
63
                <el-button icon="el-icon-s-opportunity" size="mini" @click="addToMap">生成</el-button>
xiangjiaojunxp's avatar
xiangjiaojunxp committed
64 65
            </el-col>
            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" class="right-float">重置</el-button>
xiangjiaojunxp's avatar
xiangjiaojunxp committed
66 67 68 69
        </el-row>
        <!-- luckysheet容器 -->
        <div
            id="luckysheet"
xiangjiaojunxp's avatar
xiangjiaojunxp committed
70 71
            style="margin: 0px; padding: 0px; position: absolute; width: 100%;left: 0px; top: 105px; height: 75vh; z-index: 0"
        ></div>
xiangjiaojunxp's avatar
xiangjiaojunxp committed
72 73 74 75

    </div>
</template>

xiangjiaojunxp's avatar
xiangjiaojunxp committed
76 77 78 79 80
<style>
.right-float {
    float: right;
}
</style>
xiangjiaojunxp's avatar
xiangjiaojunxp committed
81 82 83 84 85 86 87 88 89 90 91
<script>

/*import luckysheet from 'luckysheet'*/
import LuckyExcel from 'luckyexcel'
//导入库export.js 这个文件是es6的,不能在普通的HTML文件直接引入js文件(虽然都是js文件,但是有区别,具体请百度es6与es5)!需要把es6转es5才可以直接引入使用!
import { exportExcel } from '../../../../public/exportExcel';
import {vueScript} from "@/utils/generator/html";


var fileName="新建XLSX工作表"; //定义表名
var data1;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
92
var name1;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
93
var map=new Map();
xiangjiaojunxp's avatar
xiangjiaojunxp committed
94
var maper=new Map();
xiangjiaojunxp's avatar
xiangjiaojunxp committed
95 96 97 98
export default {
    name: "Mymodule",
    data() {
        return {
xiangjiaojunxp's avatar
xiangjiaojunxp committed
99
            row:1,
xiangjiaojunxp's avatar
xiangjiaojunxp committed
100
            numm:false,
xiangjiaojunxp's avatar
xiangjiaojunxp committed
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
            //弹出页面的表名
            // 是否显示弹出层
            fileList:[],
            disableNextButton: true,
            // 查询参数
            queryParams: {
                status:0
            },
        };
    },
    created() {

    },
    mounted() {

        this.init();
        fileName="新建XLSX工作表";
    },
    methods:{

        /** 回车事件和保存提交绑定 */
        handleEnter(event) {
            if (event.keyCode === 13) {
                event.preventDefault(); // 阻止默认的回车事件
                // 触发确定操作
xiangjiaojunxp's avatar
xiangjiaojunxp committed
126
                this.handleFileChange1();
xiangjiaojunxp's avatar
xiangjiaojunxp committed
127 128 129 130 131 132 133
            }
        },
        /** 重置按钮操作 */
        resetQuery() {
            //刷新下拉选框内容
            fileName="新建XLSX工作表";
            this.disableNextButton='';
xiangjiaojunxp's avatar
xiangjiaojunxp committed
134
            this.row=1;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
135 136 137
            //刷新luckysheet表格
            this.init();
            map.clear();
xiangjiaojunxp's avatar
xiangjiaojunxp committed
138 139 140
            maper.clear();
            //this.zero=false;
            this.numm=false;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
        },
        /** Luckyexcel文档 */
        init() {
            let options = {
                container: 'luckysheet', //luckysheet为容器id
                title:'',
                lang:'zh',
                showinfobar:false,
                data:[
                    {
                        "name": "sheet1", //工作表名称
                        "color": "", //工作表颜色
                        "index": 0, //工作表索引
                        "status": 1, //激活状态
                        "order": 0, //工作表的下标
                        "hide": 0,//是否隐藏
                        "row": 50, //行数
                        "column": 50, //列数
                        "defaultRowHeight": 19, //自定义行高
                        "defaultColWidth": 73, //自定义列宽
                        "celldata": [


                        ], //初始化使用的单元格数据
                        "config": {
                            "merge": {
                            }, //合并单元格
                            "rowlen":{}, //表格行高
                            "columnlen":{}, //表格列宽
                            "rowhidden":{}, //隐藏行
                            "colhidden":{}, //隐藏列
                            "borderInfo":{

                            }, //边框
                            "authority":{}, //工作表保护
                        },
                    },
                    /*{
                      "name": "Sheet2",
                      "color": "",
                      "index": 1,
                      "status": 0,
                      "order": 1,
                      "celldata": [],
                      "config": {}
                    },
                    {
                      "name": "Sheet3",
                      "color": "",
                      "index": 2,
                      "status": 0,
                      "order": 2,
                      "celldata": [],
                      "config": {},
                    }*/
                ]

            }
            luckysheet.create(options);

        },
        /** 导入事件*/
        handleFileChange(evt) {
            this.disableNextButton=false;
            let name = evt.name
            let suffixArr = name.split('.'),
                suffix = suffixArr[suffixArr.length - 1]
            if (suffix !== 'xlsx') {
                this.$message({
                    message: "上传格式不正确,请上传xlsx格式文件",
                    type: "warning"});
                return
            }
            LuckyExcel.transformExcelToLucky(
                evt,
                (exportJson)=> {
                    if (exportJson.sheets === null || exportJson.sheets.length === 0) {
                        this.$message({
                            message: "导入失败,请检查上传的文件是否正确",
                            type: "warning"
                        });
                        return
                    }
                    luckysheet.destroy()
                    luckysheet.create({
                        container: 'luckysheet', //luckysheet is the container id
                        title: exportJson.info.name,
                        lang: 'zh', // 设定表格语言
                        showinfobar: false,
                        data: exportJson.sheets,
                        userInfo: exportJson.info.name.creator
                    })
xiangjiaojunxp's avatar
xiangjiaojunxp committed
233
                    data1=exportJson.sheets[0];
xiangjiaojunxp's avatar
xiangjiaojunxp committed
234
                    name1=exportJson.sheets[0].name;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
235 236 237 238
                    let suffixArr = exportJson.info.name.split('.');
                    fileName = suffixArr[0];
                }
            )
xiangjiaojunxp's avatar
666  
xiangjiaojunxp committed
239

xiangjiaojunxp's avatar
xiangjiaojunxp committed
240
        },
xiangjiaojunxp's avatar
xiangjiaojunxp committed
241
        /** 生成标签*/
xiangjiaojunxp's avatar
xiangjiaojunxp committed
242 243 244
        addToMap(){
            map.forEach((value,key)=>{
                for(let i=0;i<value.length;i++){
xiangjiaojunxp's avatar
xiangjiaojunxp committed
245 246
                    let row=value[i][0]-1,cell=this.stringTonum(value[i][1])-1;
                    //let row=value[i][0]-1,cell=value[i][1]-1;
247 248 249 250 251
                    let sd=luckysheet.getCellValue(row,cell,{type:"bg"});
                    //用批注进行比较的时候把下面的!==判断去掉
                    //let sd=luckysheet.getCellValue(row,cell,{type:"ps"});
                    if(sd===null || sd!=="#e85f61"){
                        luckysheet.setCellValue(row, cell, {bg: "#e85f61"})
252 253 254 255 256 257 258 259 260 261
                        /*  luckysheet.setCellValue(row, cell, {
                               ps: { //批注
                                   "left": 92, //批注框左边距
                                   "top": 10, //批注框上边距
                                   "width": 91, //批注框宽度
                                   "height": 48, //批注框高度
                                   "value": key+"表有误", //批准内容
                                   "isshow": false //批注框为显示状态
                               }
                           })*/
xiangjiaojunxp's avatar
xiangjiaojunxp committed
262
                        maper.set("("+(row+1)+","+value[i][1]+")",1);
xiangjiaojunxp's avatar
xiangjiaojunxp committed
263
                    }else{
264 265
                        //let sd=luckysheet.getCellValue(row,cell,{type:"ps"}).value;
                        /*luckysheet.setCellValue(row, cell, {
xiangjiaojunxp's avatar
xiangjiaojunxp committed
266 267 268 269 270
                            ps: { //批注
                                "left": 92, //批注框左边距
                                "top": 10, //批注框上边距
                                "width": 91, //批注框宽度
                                "height": 48, //批注框高度
xiangjiaojunxp's avatar
xiangjiaojunxp committed
271
                                "value": sd+'\n;'+key+"表有误", //批准内容
xiangjiaojunxp's avatar
xiangjiaojunxp committed
272 273
                                "isshow": false //批注框为显示状态
                            }
274
                        })*/
xiangjiaojunxp's avatar
xiangjiaojunxp committed
275
                        maper.set("("+(row+1)+","+value[i][1]+")",maper.get("("+(row+1)+","+value[i][1]+")")+1);
xiangjiaojunxp's avatar
xiangjiaojunxp committed
276 277 278
                    }
                }

xiangjiaojunxp's avatar
111  
xiangjiaojunxp committed
279
            })
xiangjiaojunxp's avatar
xiangjiaojunxp committed
280
            let row;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
281
            let num=luckysheet.getSheet().data.length;
xiangjiaojunxp's avatar
111  
xiangjiaojunxp committed
282
            let data=luckysheet.getSheet().data;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
283
            for(let i=0;i<num;i++){
xiangjiaojunxp's avatar
xiangjiaojunxp committed
284
                if(data[i][0]===null){
xiangjiaojunxp's avatar
xiangjiaojunxp committed
285 286
                    row=i;
                    break;
xiangjiaojunxp's avatar
111  
xiangjiaojunxp committed
287 288
                }
            }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
289
            //生成多少条数据添加多少行
290 291 292 293 294
            let asd=maper.size+map.size;
            if(row+asd>=num){
                for (let i=0;i<=row+asd-num;i++){
                    luckysheet.insertRow(row + 1);
                }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
295 296
                luckysheet.insertRow(row + 1);
            }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
297
            row=row+1;
xiangjiaojunxp's avatar
111  
xiangjiaojunxp committed
298 299
            let k=0;
            for (let [key,value] of map.entries()) {
xiangjiaojunxp's avatar
xiangjiaojunxp committed
300

xiangjiaojunxp's avatar
xiangjiaojunxp committed
301
                let a="("+value.join("),(")+")";
xiangjiaojunxp's avatar
xiangjiaojunxp committed
302 303
                luckysheet.setCellValue(row+k,0,key);
                luckysheet.setCellValue(row+k,1 ,a);
xiangjiaojunxp's avatar
111  
xiangjiaojunxp committed
304
                k++
xiangjiaojunxp's avatar
666  
xiangjiaojunxp committed
305
            }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
306 307 308 309 310 311 312 313 314
            let froms = Array.from(maper);
            froms.sort((a, b) => {
                return b[1] - a[1];
            });
            for (let i=0;i<froms.length;i++){
                luckysheet.setCellValue(row+k,0,froms[i][0]);
                luckysheet.setCellValue(row+k,1 ,froms[i][1]);
                k++;
            }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
        },
        handleFileChange1(evt) {
            if (this.row==="") {
                this.$message({
                    message: "请先输入导入开始的行",
                    type: "warning"});
                return false
            }
            let name = evt.name
            let suffixArr = name.split('.'),
                suffix = suffixArr[suffixArr.length - 1];
            name=suffixArr[0]
            if (suffix !== 'xlsx') {
                this.$message({
                    message: "上传格式不正确,请上传xlsx格式文件",
                    type: "warning"});
                return
            }
            LuckyExcel.transformExcelToLucky(
                evt,
                (exportJson) =>{
                    if (exportJson.sheets === null || exportJson.sheets.length === 0) {
                        this.$message({
                            message: "导入失败,请检查上传的文件是否正确",
                            type: "warning"
                        });
                        return
                    }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
343 344 345 346
                    let ddd=data1;
                    let as=0;
                    let d1=window.luckysheet.transToData(ddd.celldata);
                    let d2=window.luckysheet.transToData(exportJson.sheets[0].celldata);
347 348 349
                    let r1=d1.length,r2=d2.length,c1=d1[0].length,c2=d2[0].length;
                    let row=(r1<=r2)?r1:r2;
                    let cell=(c1<=c2)?c1:c2;
xiangjiaojunxp's avatar
xiangjiaojunxp committed
350 351
                    let array=[];
                    let r=this.row-1;
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
                    try{
                        for(let i=r;i<row;i++) {
                            for (let j = 0; j <cell; j++) {
                                //第一个表的单元格为null直接跳出
                                if(d1[i][j]==null ){
                                    continue
                                }
                                //第二个表的单元格为null直接跳出
                                if(d2[i][j]==null ){
                                    continue
                                }
                                //第一个表内数据为0 且 第二个表只有样式内部为空
                                if(d2[i][j].v==0 && d1[i][j].v==undefined ){
                                    continue
                                }
                                //第一个表内数据为0 且 第二个表只有样式内部为空
                                if( d1[i][j].v==0 && d2[i][j].v==undefined ){
                                    continue
                                }
                                // 第一个表内数据为string型 且 第二个表只有样式内部为空
                                /*if((typeof(d1[i][j].v)=="string" && d2[i][j].v==undefined)){
                                    continue
                                }*/
                                //第一个表为合并单元格 且第二个内没有值
                                if(d1[i][j].mc!=undefined &&d2[i][j].v==undefined){
                                    continue
                                }
                                //第二个表为合并单元格 且第一个内没有值
                                if(d2[i][j].mc!=undefined &&d1[i][j].v==undefined){
                                    continue
                                }
                                if((isNaN(d1[i][j].v) && d2[i][j].v==undefined)){
384

385 386 387
                                }
                                // 第二个表内数据为string型 且 第一个表只有样式内部为空
                                if(isNaN(d2[i][j].v)&& d1[i][j].v==undefined){
388

389 390 391 392 393 394 395 396 397 398 399
                                }
                                // 没有选只比较数值 且 第一个表内数据为string型 且 第二个表内数据位string型
                                if(this.numm!=false &&(isNaN(d1[i][j].v)&&isNaN(d2[i][j].v))){
                                    continue;
                                }
                                // 两个表的值都是0
                                if(d1[i][j].v==0 && d2[i][j].v==0 ){
                                    continue
                                }
                                // 两个表都是只有样式没有数据
                                if(d1[i][j].v==undefined && d2[i][j].v==undefined ){
xiangjiaojunxp's avatar
xiangjiaojunxp committed
400

401
                                }else if (d1[i][j].v==undefined || d2[i][j].v==undefined){
xiangjiaojunxp's avatar
xiangjiaojunxp committed
402
                                    luckysheet.setCellValue(i, j, {bg: "#e85f5f"})
xiangjiaojunxp's avatar
xiangjiaojunxp committed
403
                                    as++
xiangjiaojunxp's avatar
xiangjiaojunxp committed
404 405 406
                                    let s = this.numToString(j+1);
                                    array.push([i+1,s]);
                                    //array.push([i+1,j+1]);
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
                                }else {
                                    if (d1[i][j].v!= d2[i][j].v) {
                                        luckysheet.setCellValue(i, j, {bg: "#e85f5f"})
                                        //查看是否有标签
                                        /*luckysheet.setCellValue(i, j, {
                                                ps: { //批注
                                                    "left": 92, //批注框左边距
                                                    "top": 10, //批注框上边距暖色

                                                    "width": 91, //批注框宽度
                                                    "height": 48, //批注框高度
                                                    "value": this.dep+"表有误", //批准内容
                                                    "isshow": false //批注框为显示状态
                                                }
                                            })*/
                                        as++
                                        let s = this.numToString(j+1);
                                        array.push([i+1,s]);
                                        //array.push([i+1,j+1]);
                                    }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
427 428 429
                                }
                            }
                        }
430 431 432 433 434 435 436 437 438 439 440
                        map.set(name1,array);
                        if(as>0){
                            this.$message({
                                message: "导入完成,本次导入共发现"+as+"条不同数据",
                                type: "warning"});
                        }else{
                            this.$message({
                                message: "导入完成,本次导入未发现不同数据",
                                type: "success"});
                        }
                    }catch (err){
xiangjiaojunxp's avatar
xiangjiaojunxp committed
441
                        this.$message({
442 443
                            message: "导入失败,导入文件与对比文件有所不匹",
                            type: "error"});
xiangjiaojunxp's avatar
xiangjiaojunxp committed
444
                    }
xiangjiaojunxp's avatar
xiangjiaojunxp committed
445

xiangjiaojunxp's avatar
xiangjiaojunxp committed
446
                })
xiangjiaojunxp's avatar
xiangjiaojunxp committed
447 448 449 450
        },
        /** 导出设置 */
        handleExport: debounce(function() {
            // 处理点击事件
xiangjiaojunxp's avatar
111  
xiangjiaojunxp committed
451
            exportExcel(luckysheet.getSheet(),fileName+"(对比后数据)")
xiangjiaojunxp's avatar
xiangjiaojunxp committed
452
        }, 500), // 设置延迟时间,单位为毫秒
xiangjiaojunxp's avatar
xiangjiaojunxp committed
453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
        numToString(numm){
            let char=[];
            char.length = 0;
            let numToStringAction = function(nnum){
                let num = nnum - 1;
                let a = parseInt(num / 26);
                let b = num % 26;
                char.push(String.fromCharCode(64 + parseInt(b+1)));
                if(a>0){
                    numToStringAction(a);
                }
            }
            numToStringAction(numm);
            return char.reverse().join("");
        },
        stringTonum(a) {
            var str = a.toLowerCase().split("");
            var num = 0;
            var al = str.length;
            var getCharNumber = function (charx) {
                return charx.charCodeAt() - 96;
            };
            var numout = 0;
            var charnum = 0;
            for (var i = 0; i < al; i++) {
                charnum = getCharNumber(str[i]);
                numout += charnum * Math.pow(26, al - i - 1);
            }
            ;
            return numout;
        },
xiangjiaojunxp's avatar
xiangjiaojunxp committed
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
    }
// 配置项111
};
// debounce函数定义
function debounce(func, delay) {
    let timer;
    return function () {
        const context = this;
        const args = arguments;
        clearTimeout(timer);
        timer = setTimeout(function () {
            func.apply(context, args);
        }, delay);
    };
}
</script>