Przeglądaj źródła

create 在线编制xlsx

linweizeng 2 lat temu
rodzic
commit
761b83200d

+ 2 - 0
package.json

@@ -48,6 +48,7 @@
     "diagram-js-origin": "^1.3.1",
     "echarts": "^4.9.0",
     "element-ui": "^2.13.2",
+    "exceljs": "^4.3.0",
     "file-saver": "^2.0.5",
     "flex.css": "^1.1.7",
     "focus-visible": "^5.1.0",
@@ -66,6 +67,7 @@
     "lodash": "^4.17.20",
     "long": "^4.0.0",
     "lowdb": "^1.0.0",
+    "luckyexcel": "^1.0.1",
     "mockjs": "^1.1.0",
     "normalize.css": "^8.0.1",
     "nprogress": "^0.2.0",

+ 10 - 0
public/index.html

@@ -18,6 +18,16 @@
     <% for (var i in htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %>
     <link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="preload" as="script">
     <% } %>
+
+    <!-- 使用luckysheet文件 -->
+    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css' />
+    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css' />
+    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css' />
+    <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/assets/iconfont/iconfont.css' />
+    <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script>
+
+
     <title><%= VUE_APP_TITLE %></title>
 <!-- 	<script type="text/javascript" src="http://192.168.48.129:9999/web-apps/apps/api/documents/api.js"></script> -->
 	<script type="text/javascript" src="https://www.szjyxt.com/word/web-apps/apps/api/documents/api.js"></script>

+ 273 - 0
src/views/onLineEditing/index.vue

@@ -0,0 +1,273 @@
+<template>
+    <div class="test2">
+        <div class="mb-md">
+            <div class="demo-input-suffix">
+                表格名称:
+                <el-input placeholder="请输入表格名称" v-model="title" style="width: 400px"> </el-input>
+            </div>
+            <div class="demo-input-suffix">
+                <el-button type="success" @click="save">保存</el-button>
+            </div>
+            <div class="demo-input-suffix">
+                <el-button type="warning" @click="clickHandle">上传xlsx</el-button>
+            </div>
+            <div class="demo-input-suffix">
+                <el-button type="info" @click="exportExcelBtn">导出xlsx</el-button>
+            </div>
+            <input type="file" @change="chageFile" ref="inputFile" style="display: none" />
+        </div>
+        <!--web spreadsheet组件-->
+        <div class="excel">
+            <div id="luckysheetDom" style="margin: 0px; padding: 0px; width: 100%; height: 100%"></div>
+        </div>
+    </div>
+</template>
+
+  <script>
+//引入依赖包
+import LuckyExcel from 'luckyexcel'
+const luckysheet = window.luckysheet
+//代码见下
+import { exportExcel } from './js/export'
+import repostCurd from '@/business/platform/form/utils/custom/joinCURD.js'
+import curdPost from '@/business/platform/form/utils/custom/joinCURD.js'
+export default {
+    name: 'XspreadsheetDemo',
+    props: {
+        id: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            option: null,
+
+            showtoolbarConfig: {
+                // //自定义配置工具栏
+                undoRedo: true, //撤销重做,注意撤消重做是两个按钮,由这一个配置决定显示还是隐藏
+                paintFormat: true, //格式刷
+                currencyFormat: true, //货币格式
+                percentageFormat: true, //百分比格式
+                numberDecrease: true, // '减少小数位数'
+                numberIncrease: true, // '增加小数位数
+                moreFormats: true, // '更多格式'
+                font: true, // '字体'
+                fontSize: true, // '字号大小'
+                bold: true, // '粗体 (Ctrl+B)'
+                italic: true, // '斜体 (Ctrl+I)'
+                strikethrough: true, // '删除线 (Alt+Shift+5)'
+                underline: true, // '下划线 (Alt+Shift+6)'
+                textColor: true, // '文本颜色'
+                fillColor: true, // '单元格颜色'
+                border: true, // '边框'
+                mergeCell: true, // '合并单元格'
+                horizontalAlignMode: true, // '水平对齐方式'
+                verticalAlignMode: true, // '垂直对齐方式'
+                textWrapMode: true, // '换行方式'
+                textRotateMode: false, // '文本旋转方式'
+                image: true, // '插入图片'
+                link: false, // '插入链接'
+                chart: false, // '图表'(图标隐藏,但是如果配置了chart插件,右击仍然可以新建图表)
+                postil: false, //'批注'
+                pivotTable: false, //'数据透视表'
+                function: true, // '公式'
+                frozenMode: false, // '冻结方式'
+                sortAndFilter: true, // '排序和筛选'
+                conditionalFormat: true, // '条件格式'
+                dataVerification: true, // '数据验证'
+                splitColumn: false, // '分列'
+                screenshot: true, // '截图'
+                findAndReplace: true, // '查找替换'
+                protection: false, // '工作表保护'
+                print: false // '打印'
+            },
+            cellRightClickConfig: {
+                //右键单元格菜单设置
+                copy: true, // 复制
+                copyAs: true, // 复制为
+                paste: true, // 粘贴
+                insertRow: true, // 插入行
+                insertColumn: true, // 插入列
+                deleteRow: true, // 删除选中行
+                deleteColumn: true, // 删除选中列
+                deleteCell: true, // 删除单元格
+                hideRow: false, // 隐藏选中行和显示选中行
+                hideColumn: false, // 隐藏选中列和显示选中列
+                rowHeight: true, // 行高
+                columnWidth: true, // 列宽
+                clear: true, // 清除内容
+                matrix: false, // 矩阵操作选区
+                sort: true, // 排序选区
+                filter: true, // 筛选选区
+                chart: false, // 图表生成
+                image: true, // 插入图片
+                link: false, // 插入链接
+                data: true, // 数据验证
+                cellFormat: true // 设置单元格格式
+            },
+            showstatisticBarConfig: {
+                //自定义配置底部计数栏
+                count: false, // 计数栏
+                view: true, // 打印视图
+                zoom: true // 缩放
+            },
+            title: ''
+        }
+    },
+    mounted() {
+        if(this.id){
+            this.getInitData(this.id)
+            // this.init()
+        }else{
+            this.init()
+        }
+
+    },
+    methods: {
+        init() {
+            let options = ''
+            if (!options) {
+                options = {
+                    container: 'luckysheetDom',
+                    title: '',
+                    lang: 'zh',
+                    data: [
+                        {
+                            name: 'sheet1'
+                        }
+                    ],
+                    showtoolbarConfig: this.showtoolbarConfig,
+                    showinfobar: false,
+                    cellRightClickConfig: this.cellRightClickConfig,
+                    showstatisticBarConfig: this.showstatisticBarConfig
+                }
+            }
+            // 可开启只读模式
+            // options.allowEdit = false
+            // this.option = options
+            luckysheet.create(options)
+        },
+        //获取数据表的数据
+        getInitData(id){
+            let sql = `select * from t_pbgl where id_ = '${id}'`
+            curdPost('sql', sql).then(res => {
+                if (res.state == '200') {
+                    let dataItem = res.variables.data[0]
+                    this.title = dataItem.shu_ju_ming_cheng
+                    let options = JSON.parse(dataItem.shu_ju_cun_chu_)
+                    luckysheet.create(options)
+                }
+            })
+        },
+        save() {
+            let data = luckysheet.toJson()
+            this.getSumbit(data)
+        },
+        //下载文档
+        exportExcelBtn() {
+            let title = this.title ? this.title : '下载'
+            exportExcel(luckysheet.getluckysheetfile(), title)
+        },
+        //上传文档
+        clickHandle() {
+            this.$refs.inputFile.click()
+        },
+        chageFile() {
+            this.importExcel(this.$refs.inputFile.files[0])
+        },
+        importExcel(file) {
+            let name = file.name
+            this.title = name.split('.xlsx')[0]
+            //获取文件后缀
+            let suffixArr = name.split('.'),
+                suffix = suffixArr[suffixArr.length - 1]
+            if (suffix !== 'xlsx') {
+                alert('目前只能导入xlsx类型的文件')
+                return
+            }
+            LuckyExcel.transformExcelToLucky(file, this.fileCb, this.errorCb)
+        },
+        fileCb(exportJson, luckysheetfile) {
+            // 转换后获取工作表数据
+            if (exportJson.sheets === null || exportJson.sheets.length === 0) {
+                alert('无法读取excel文件的内容,当前不支持xls文件!')
+                return
+            }
+            // console.log('exportJson', exportJson)
+            // console.log('luckysheetfile', luckysheetfile)
+
+            luckysheet.destroy()
+
+            luckysheet.create({
+                container: 'luckysheetDom', //luckysheet is the container id
+                data: exportJson.sheets,
+                title: exportJson.info.name,
+                userInfo: exportJson.info.name.creator,
+                lang: 'zh',
+                showtoolbarConfig: this.showtoolbarConfig,
+                showinfobar: false,
+                cellRightClickConfig: this.cellRightClickConfig,
+                showstatisticBarConfig: this.showstatisticBarConfig
+            })
+        },
+        errorCb(error) {
+        },
+
+        getSumbit(option) {
+            if (this.title == '') {
+                this.$message({
+                    showClose: true,
+                    message: '请填写表格名称',
+                    type: 'warning'
+                })
+                return
+            }
+            let data = {
+                shu_ju_cun_chu_: JSON.stringify(option),
+                shu_ju_lei_xing_: '在线编辑',
+                shu_ju_ming_cheng: this.title
+            }
+            let params = {
+                tableName: 't_pbgl',
+                paramWhere: [data]
+            }
+            repostCurd('add', JSON.stringify(params)).then((res) => {
+                if (res.state == '200') {
+                    let dataItem = res.variables.cont[0]
+                    this.$emit('addClick', dataItem.id_, dataItem)
+                    this.$message({
+                        showClose: true,
+                        message: this.title + '的文档' + '保存成功',
+                        type: 'success'
+                    })
+                }
+            })
+        }
+    }
+}
+</script>
+  <style scoped lang="less">
+.mb-md {
+    padding: 10px;
+    display: flex;
+}
+.demo-input-suffix {
+    margin-right: 10px;
+}
+.test2 {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    .excel {
+        flex: 1;
+    }
+}
+
+.drag-button {
+    position: fixed;
+    cursor: move;
+    z-index: 9999;
+}
+</style>

+ 1401 - 0
src/views/onLineEditing/js/export copy.js

@@ -0,0 +1,1401 @@
+const Excel = require('exceljs')
+export  async function exportExcel(luckysheet,name="file") { // 参数为luckysheet.getluckysheetfile()获取的对象
+    // 1.创建工作簿,可以为工作簿添加属性
+    const workbook = new Excel.Workbook();
+    // 2.创建表格,第二个参数可以配置创建什么样的工作表
+    luckysheet.every(function (table) {
+        if (table.data.length === 0) return true;
+        const worksheet = workbook.addWorksheet(name);
+        // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值
+        setStyleAndValue(table.data, worksheet);
+        setMerge(table.config.merge, worksheet);
+        setBorder(table, worksheet);
+        setImages(table, worksheet, workbook);
+        return true;
+    })
+    // 4.写入 buffer
+    const buffer = await workbook.xlsx.writeBuffer();
+    // 5.保存为文件
+    saveFile(buffer,name);
+}
+
+var saveFile = function(buf,name) {
+  let blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' });
+  const downloadElement = document.createElement('a');
+  let href = window.URL.createObjectURL(blob);
+  downloadElement.href = href;
+  downloadElement.download = name+".xlsx"; // 文件名字
+  document.body.appendChild(downloadElement);
+  downloadElement.click();
+  document.body.removeChild(downloadElement); // 下载完成移除元素
+  window.URL.revokeObjectURL(href); // 释放掉blob对象
+}
+
+
+var setMerge = function (luckyMerge = {}, worksheet) {
+  const mergearr = Object.values(luckyMerge);
+  mergearr.forEach(function (elem) { // elem格式:{r: 0, c: 0, rs: 1, cs: 2}
+    // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
+    worksheet.mergeCells(elem.r + 1, elem.c + 1, elem.r + elem.rs, elem.c + elem.cs);
+  });
+}
+
+//获取图片在单元格的位置
+var  getImagePosition =function(num,arr){
+  let index = 0;
+  let minIndex;
+  let maxIndex;
+  for (let i = 0; i < arr.length; i++) {
+    if (num < arr[i]) {
+        index = i;
+        break;
+    }
+  }
+
+  if(index==0){
+    minIndex = 0;
+    maxIndex = 1;
+    return  Math.abs((num-0)/(arr[maxIndex]-arr[minIndex]))+index;
+  }
+  else if(index == arr.length-1){
+    minIndex = arr.length-2;
+    maxIndex = arr.length-1;
+  }
+  else{
+    minIndex = index-1;
+    maxIndex = index;
+  }
+  let min = arr[minIndex];
+  let max = arr[maxIndex];
+  let radio = Math.abs((num-min)/(max-min))+index
+  return radio;
+}
+
+var setImages = function (table, worksheet, workbook) {
+    let {
+      images,
+      visibledatacolumn,//所有行的位置
+      visibledatarow //所有列的位置
+    } = {...table}
+    if (typeof images != 'object') return;
+    for (let key in images) {
+    // 通过 base64  将图像添加到工作簿
+        const myBase64Image = images[key].src;
+        //开始行 开始列 结束行 结束列
+        const item = images[key];
+        const imageId = workbook.addImage({
+            base64: myBase64Image,
+            extension: 'png'
+        });
+
+        const col_st = getImagePosition(item.default.left,visibledatacolumn);
+        const row_st = getImagePosition(item.default.top,visibledatarow);
+
+        //模式1,图片左侧与luckysheet位置一样,像素比例保持不变,但是,右侧位置可能与原图所在单元格不一致
+        worksheet.addImage(imageId, {
+            tl: { col: col_st, row: row_st},
+            ext: { width: item.default.width, height: item.default.height },
+        });
+        //模式2,图片四个角位置没有变动,但是图片像素比例可能和原图不一样
+        // const w_ed = item.default.left+item.default.width;
+        // const h_ed = item.default.top+item.default.height;
+        // const col_ed = getImagePosition(w_ed,visibledatacolumn);
+        // const row_ed = getImagePosition(h_ed,visibledatarow);
+        // worksheet.addImage(imageId, {
+        //   tl: { col: col_st, row: row_st},
+        //   br: { col: col_ed, row: row_ed},
+        // });
+    }
+};
+
+var setBorder = function (lucksheetfile, worksheet) {
+  if (!lucksheetfile) return;
+  const luckyToExcel = {
+    style: {
+      0: 'none',
+      1: 'thin',
+      2: 'hair',
+      3: 'dotted',
+      4: 'dashDot', // 'Dashed',
+      5: 'dashDot',
+      6: 'dashDotDot',
+      7: 'double',
+      8: 'medium',
+      9: 'mediumDashed',
+      10: 'mediumDashDot',
+      11: 'mediumDashDotDot',
+      12: 'slantDashDot',
+      13: 'thick'
+    }
+  }
+  //获取所有的单元格边框的信息
+  const borderInfoCompute = getBorderInfo(lucksheetfile);
+  for (let x in borderInfoCompute) {
+    let border = {};
+    let info = borderInfoCompute[x];
+    let row = parseInt(x.substr(0, x.indexOf('_')));
+    let column = parseInt(x.substr(x.indexOf('_') + 1));
+    if(info.t!=undefined){
+      const tcolor = info.t.color.indexOf('rgb')>-1 ?rgb2hex(info.t.color):info.t.color;
+      border['top'] = {style:luckyToExcel.style[info.t.style],color: {argb: tcolor.replace('#', '')}};
+    }
+    if(info.r!=undefined){
+      const rcolor = info.r.color.indexOf('rgb')>-1 ?rgb2hex(info.r.color):info.r.color;
+      border['right'] = {style:luckyToExcel.style[info.r.style],color: {argb: rcolor.replace('#', '')}};
+    }
+    if(info.b!=undefined){
+      const bcolor = info.b.color.indexOf('rgb')>-1 ?rgb2hex(info.b.color):info.b.color;
+      border['bottom'] = {style:luckyToExcel.style[info.b.style],color: {argb: bcolor.replace('#', '')}};
+    }
+    if(info.l!=undefined){
+      const lcolor = info.l.color.indexOf('rgb')>-1 ?rgb2hex(info.l.color):info.l.color;
+      border['left'] = {style:luckyToExcel.style[info.l.style],color: {argb: lcolor.replace('#', '')}};
+    }
+    worksheet.getCell(row + 1, column + 1).border = border;
+  }
+}
+
+var getBorderInfo=function(luckysheetfile){
+  let borderInfoCompute = {};
+  let cfg = luckysheetfile.config;
+  let data = luckysheetfile.data;
+  let borderInfo = cfg["borderInfo"];
+  //设置需要计算边框的区域
+  let dataset_row_st = 0,dataset_row_ed = data.length,dataset_col_st=0,dataset_col_ed=data[0].length;
+  if(borderInfo != null && borderInfo.length > 0){
+    for(let i = 0; i < borderInfo.length; i++){
+        let rangeType = borderInfo[i].rangeType;
+
+        if(rangeType == "range"){
+            let borderType = borderInfo[i].borderType;
+            let borderColor = borderInfo[i].color;
+            let borderStyle = borderInfo[i].style;
+
+            let borderRange = borderInfo[i].range;
+
+            for(let j = 0; j < borderRange.length; j++){
+                let bd_r1 = borderRange[j].row[0], bd_r2 = borderRange[j].row[1];
+                let bd_c1 = borderRange[j].column[0], bd_c2 = borderRange[j].column[1];
+
+                if(bd_r1<dataset_row_st){
+                    bd_r1 = dataset_row_st;
+                }
+
+                if(bd_r2>dataset_row_ed){
+                    bd_r2 = dataset_row_ed;
+                }
+
+                if(bd_c1<dataset_col_st){
+                    bd_c1 = dataset_col_st;
+                }
+
+                if(bd_c2>dataset_col_ed){
+                    bd_c2 = dataset_col_ed;
+                }
+
+                if(borderType == "border-left"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        if(borderInfoCompute[bd_r + "_" + bd_c1] == null){
+                            borderInfoCompute[bd_r + "_" + bd_c1] = {};
+                        }
+
+                        borderInfoCompute[bd_r + "_" + bd_c1].l = { "color": borderColor, "style": borderStyle };
+
+                        let bd_c_left = bd_c1 - 1;
+
+                        if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                            if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                let cell_left = data[bd_r][bd_c_left];
+
+                                let mc = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                if(mc.c + mc.cs - 1 == bd_c_left){
+                                    borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                            }
+                        }
+
+                        let mc = cfg["merge"] || {};
+                        for (const key in mc) {
+                            let {c,r,cs,rs} = mc[key];
+                            if(bd_c1 <= c + cs - 1 && bd_c1 > c && bd_r >= r && bd_r <= r + rs -1){
+                                borderInfoCompute[bd_r + "_" + bd_c1].l = null;
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-right"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        if(borderInfoCompute[bd_r + "_" + bd_c2] == null){
+                            borderInfoCompute[bd_r + "_" + bd_c2] = {};
+                        }
+
+                        borderInfoCompute[bd_r + "_" + bd_c2].r = { "color": borderColor, "style": borderStyle };
+
+                        let bd_c_right = bd_c2 + 1;
+
+                        if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                            if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                let cell_right = data[bd_r][bd_c_right];
+
+                                let mc = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                if(mc.c == bd_c_right){
+                                    borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                            }
+                        }
+                        let mc = cfg["merge"] || {};
+                        for (const key in mc) {
+                            let {c,r,cs,rs} = mc[key];
+                            if(bd_c2 < c + cs - 1 && bd_c2 >= c && bd_r >= r && bd_r <= r + rs -1){
+                                borderInfoCompute[bd_r + "_" + bd_c2].r = null;
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-top"){
+                    if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r1] != null) {
+                        continue;
+                    }
+
+                    for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                        if(borderInfoCompute[bd_r1 + "_" + bd_c] == null){
+                            borderInfoCompute[bd_r1 + "_" + bd_c] = {};
+                        }
+
+                        borderInfoCompute[bd_r1 + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+
+                        let bd_r_top = bd_r1 - 1;
+
+                        if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                            if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                let cell_top = data[bd_r_top][bd_c];
+
+                                let mc = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                if(mc.r + mc.rs - 1 == bd_r_top){
+                                    borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                            }
+                        }
+
+                        let mc = cfg["merge"] || {};
+                        for (const key in mc) {
+                            let {c,r,cs,rs} = mc[key];
+                            if(bd_r1 <= r + rs - 1 && bd_r1 > r && bd_c >= c && bd_c <= c + cs -1){
+                                borderInfoCompute[bd_r1 + "_" + bd_c].t = null;
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-bottom"){
+                    if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r2] != null) {
+                        continue;
+                    }
+
+                    for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                        if(borderInfoCompute[bd_r2 + "_" + bd_c] == null){
+                            borderInfoCompute[bd_r2 + "_" + bd_c] = {};
+                        }
+
+                        borderInfoCompute[bd_r2 + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+
+                        let bd_r_bottom = bd_r2 + 1;
+
+                        if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                            if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                let mc = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                if(mc.r == bd_r_bottom){
+                                    borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                            }
+                        }
+
+                        let mc = cfg["merge"] || {};
+                        for (const key in mc) {
+                            let {c,r,cs,rs} = mc[key];
+                            if(bd_r2 < r + rs - 1 && bd_r2 >= r && bd_c >= c && bd_c <= c + cs -1){
+                                borderInfoCompute[bd_r2 + "_" + bd_c].b = null;
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-all"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                let cell = data[bd_r][bd_c];
+
+                                let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+                                if(mc==undefined || mc==null){
+                                    continue
+                                };
+                                if(mc.r == bd_r){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                }
+
+                                if(mc.r + mc.rs - 1 == bd_r){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+
+                                if(mc.c == bd_c){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                }
+
+                                if(mc.c + mc.cs - 1 == bd_c){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                    borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                }
+
+                                borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                            }
+
+                            if(bd_r == bd_r1){
+                                let bd_r_top = bd_r1 - 1;
+
+                                if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                    if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                        let cell_top = data[bd_r_top][bd_c];
+
+                                        let mc = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                        if(mc.r + mc.rs - 1 == bd_r_top){
+                                            borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+
+                            if(bd_r == bd_r2){
+                                let bd_r_bottom = bd_r2 + 1;
+
+                                if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                    if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                        let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                        let mc = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                        if(mc.r == bd_r_bottom){
+                                            borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+
+                            if(bd_c == bd_c1){
+                                let bd_c_left = bd_c1 - 1;
+
+                                if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                        let cell_left = data[bd_r][bd_c_left];
+
+                                        let mc = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                        if(mc.c + mc.cs - 1 == bd_c_left){
+                                            borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+
+                            if(bd_c == bd_c2){
+                                let bd_c_right = bd_c2 + 1;
+
+                                if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                        let cell_right = data[bd_r][bd_c_right];
+
+                                        let mc = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                        if(mc.c == bd_c_right){
+                                            borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-outside"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(!(bd_r == bd_r1 || bd_r == bd_r2 || bd_c == bd_c1 || bd_c == bd_c2)){
+                                continue;
+                            }
+
+                            if(bd_r == bd_r1){
+                                if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                    borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                }
+
+                                borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+
+                                let bd_r_top = bd_r1 - 1;
+
+                                if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                    if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                        let cell_top = data[bd_r_top][bd_c];
+
+                                        let mc = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                        if(mc.r + mc.rs - 1 == bd_r_top){
+                                            borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+
+                            if(bd_r == bd_r2){
+                                if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                    borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                }
+
+                                borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+
+                                let bd_r_bottom = bd_r2 + 1;
+
+                                if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                    if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                        let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                        let mc = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                        if(mc.r == bd_r_bottom){
+                                            borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+
+                            if(bd_c == bd_c1){
+                                if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                    borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                }
+
+                                borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+
+                                let bd_c_left = bd_c1 - 1;
+
+                                if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                        let cell_left = data[bd_r][bd_c_left];
+
+                                        let mc = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                        if(mc.c + mc.cs - 1 == bd_c_left){
+                                            borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+
+                            if(bd_c == bd_c2){
+                                if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                    borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                }
+
+                                borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+
+                                let bd_c_right = bd_c2 + 1;
+
+                                if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                        let cell_right = data[bd_r][bd_c_right];
+
+                                        let mc = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                        if(mc.c == bd_c_right){
+                                            borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-inside"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(bd_r == bd_r1 && bd_c == bd_c1){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_r == bd_r2 && bd_c == bd_c1){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_r == bd_r1 && bd_c == bd_c2){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_r == bd_r2 && bd_c == bd_c2){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_r == bd_r1){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                    if(mc.c == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.c + mc.cs - 1 == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_r == bd_r2){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                    if(mc.c == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.c + mc.cs - 1 == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_c == bd_c1){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                    if(mc.r == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.r + mc.rs - 1 == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_c == bd_c2){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                    if(mc.r == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.r + mc.rs - 1 == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                    if(mc.r == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.r + mc.rs - 1 == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+
+                                    if(mc.c == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.c + mc.cs - 1 == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-horizontal"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(bd_r == bd_r1){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_r == bd_r2){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                    if(mc.r == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.r + mc.rs - 1 == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-vertical"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(bd_c == bd_c1){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else if(bd_c == bd_c2){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            else{
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c] || {};
+
+                                    if(mc.c == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                    else if(mc.c + mc.cs - 1 == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                        }
+                    }
+                }
+                else if(borderType == "border-none"){
+                    for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(borderInfoCompute[bd_r + "_" + bd_c] != null){
+                                delete borderInfoCompute[bd_r + "_" + bd_c];
+                            }
+
+                            if(bd_r == bd_r1){
+                                let bd_r_top = bd_r1 - 1;
+
+                                if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                    delete borderInfoCompute[bd_r_top + "_" + bd_c].b;
+                                }
+                            }
+
+                            if(bd_r == bd_r2){
+                                let bd_r_bottom = bd_r2 + 1;
+
+                                if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                    delete borderInfoCompute[bd_r_bottom + "_" + bd_c].t;
+                                }
+                            }
+
+                            if(bd_c == bd_c1){
+                                let bd_c_left = bd_c1 - 1;
+
+                                if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                    delete borderInfoCompute[bd_r + "_" + bd_c_left].r;
+                                }
+                            }
+
+                            if(bd_c == bd_c2){
+                                let bd_c_right = bd_c2 + 1;
+
+                                if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                    delete borderInfoCompute[bd_r + "_" + bd_c_right].l;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        else if(rangeType == "cell"){
+            let value = borderInfo[i].value;
+
+            let bd_r = value.row_index, bd_c = value.col_index;
+
+            if(bd_r < dataset_row_st || bd_r > dataset_row_ed || bd_c < dataset_col_st || bd_c > dataset_col_ed){
+                continue;
+            }
+
+            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                continue;
+            }
+
+            if(value.l != null || value.r != null || value.t != null || value.b != null){
+                if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                    borderInfoCompute[bd_r + "_" + bd_c] = {};
+                }
+
+                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                    let cell = data[bd_r][bd_c];
+                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c] || {};
+
+                    if(value.l != null && bd_c == mc.c){ //左边框
+                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": value.l.color, "style": value.l.style };
+
+                        let bd_c_left = bd_c - 1;
+
+                        if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                            if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                let cell_left = data[bd_r][bd_c_left];
+
+                                let mc_l = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                if(mc_l.c + mc_l.cs - 1 == bd_c_left){
+                                    borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].l = null;
+                    }
+
+                    if(value.r != null && bd_c == mc.c + mc.cs - 1){ //右边框
+                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": value.r.color, "style": value.r.style };
+
+                        let bd_c_right = bd_c + 1;
+
+                        if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                            if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                let cell_right = data[bd_r][bd_c_right];
+
+                                let mc_r = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                if(mc_r.c == bd_c_right){
+                                    borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].r = null;
+                    }
+
+                    if(value.t != null && bd_r == mc.r){ //上边框
+                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": value.t.color, "style": value.t.style };
+
+                        let bd_r_top = bd_r - 1;
+
+                        if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                            if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                let cell_top = data[bd_r_top][bd_c];
+
+                                let mc_t = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                if(mc_t.r + mc_t.rs - 1 == bd_r_top){
+                                    borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].t = null;
+                    }
+
+                    if(value.b != null && bd_r == mc.r + mc.rs - 1){ //下边框
+                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": value.b.color, "style": value.b.style };
+
+                        let bd_r_bottom = bd_r + 1;
+
+                        if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                            if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                let mc_b = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                if(mc_b.r == bd_r_bottom){
+                                    borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].b = null;
+                    }
+                }
+                else{
+                    if(value.l != null){ //左边框
+                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": value.l.color, "style": value.l.style };
+
+                        let bd_c_left = bd_c - 1;
+
+                        if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                            if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                let cell_left = data[bd_r][bd_c_left];
+
+                                let mc_l = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                if(mc_l.c + mc_l.cs - 1 == bd_c_left){
+                                    borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].l = null;
+                    }
+
+                    if(value.r != null){ //右边框
+                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": value.r.color, "style": value.r.style };
+
+                        let bd_c_right = bd_c + 1;
+
+                        if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                            if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                let cell_right = data[bd_r][bd_c_right];
+
+                                let mc_r = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                if(mc_r.c == bd_c_right){
+                                    borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].r = null;
+                    }
+
+                    if(value.t != null){ //上边框
+                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": value.t.color, "style": value.t.style };
+
+                        let bd_r_top = bd_r - 1;
+
+                        if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                            if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                let cell_top = data[bd_r_top][bd_c];
+
+                                let mc_t = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                if(mc_t.r + mc_t.rs - 1 == bd_r_top){
+                                    borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].t = null;
+                    }
+
+                    if(value.b != null){ //下边框
+                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": value.b.color, "style": value.b.style };
+
+                        let bd_r_bottom = bd_r + 1;
+
+                        if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                            if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                let mc_b = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                if(mc_b.r == bd_r_bottom){
+                                    borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                                }
+                            }
+                            else{
+                                borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                            }
+                        }
+                    }
+                    else{
+                        borderInfoCompute[bd_r + "_" + bd_c].b = null;
+                    }
+                }
+            }
+            else{
+                delete borderInfoCompute[bd_r + "_" + bd_c];
+            }
+        }
+    }
+  }
+  return borderInfoCompute;
+}
+
+//获取数据类型
+var getObjType = function (obj) {
+  let toString = Object.prototype.toString;
+
+  let map = {
+      '[object Boolean]': 'boolean',
+      '[object Number]': 'number',
+      '[object String]': 'string',
+      '[object Function]': 'function',
+      '[object Array]': 'array',
+      '[object Date]': 'date',
+      '[object RegExp]': 'regExp',
+      '[object Undefined]': 'undefined',
+      '[object Null]': 'null',
+      '[object Object]': 'object'
+  }
+  return map[toString.call(obj)];
+}
+
+
+var setStyleAndValue = function (cellArr, worksheet) {
+  if (!Array.isArray(cellArr)) return;
+
+  cellArr.forEach(function (row, rowid) {
+    const dbrow = worksheet.getRow(rowid+1);
+    //设置单元格行高,默认乘以1.2倍
+    dbrow.height=luckysheet.getRowHeight([rowid])[rowid]*1;
+    row.every(function (cell, columnid) {
+      if (!cell) return true;
+      if(rowid==0){
+        const dobCol = worksheet.getColumn(columnid+1);
+         //设置单元格列宽除以8
+        dobCol.width=luckysheet.getColumnWidth([columnid])[columnid]/8;
+      }
+      let fill = fillConvert(cell.bg);
+      let font = fontConvert(cell.ff, cell.fc, cell.bl, cell.it, cell.fs, cell.cl, cell.ul);
+      let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr);
+      let value;
+
+      var v='';
+      if(cell.ct&&cell.ct.t=='inlineStr'){
+        var s=cell.ct.s;
+        s.forEach(function(val,num){
+          v+=val.v;
+        })
+      }else{
+        v=cell.v;
+      }
+      if (cell.f) {
+        value = { formula: cell.f, result: v };
+      } else {
+        value = v;
+      }
+      let target = worksheet.getCell(rowid + 1, columnid + 1);
+      target.fill = fill;
+      target.font = font;
+      target.alignment = alignment;
+      target.value = value;
+      return true;
+    })
+  })
+}
+
+//转换颜色
+var rgb2hex =function(rgb) {
+    if (rgb.charAt(0) == '#'){
+      return rgb;
+    }
+
+    var ds = rgb.split(/\D+/);
+    var decimal = Number(ds[1]) * 65536 + Number(ds[2]) * 256 + Number(ds[3]);
+    return "#" + zero_fill_hex(decimal, 6);
+
+    function zero_fill_hex(num, digits) {
+      var s = num.toString(16);
+      while (s.length < digits)
+        s = "0" + s;
+      return s;
+   }
+}
+
+var fillConvert = function (bg) {
+  if (!bg) {
+    return null;
+    // return {
+	// 	type: 'pattern',
+	// 	pattern: 'solid',
+	// 	fgColor:{argb:'#ffffff'.replace('#','')}
+	// }
+  }
+  bg  = bg.indexOf('rgb')>-1 ?rgb2hex(bg):bg;
+  let fill = {
+    type: 'pattern',
+    pattern: 'solid',
+    fgColor: {argb: bg.replace('#', '')}
+  }
+  return fill
+}
+
+var fontConvert = function (ff = 0, fc = '#000000', bl = 0, it = 0, fs = 10, cl = 0, ul = 0) { // luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
+  const luckyToExcel = {
+    0: '微软雅黑',
+    1: '宋体(Song)',
+    2: '黑体(ST Heiti)',
+    3: '楷体(ST Kaiti)',
+    4: '仿宋(ST FangSong)',
+    5: '新宋体(ST Song)',
+    6: '华文新魏',
+    7: '华文行楷',
+    8: '华文隶书',
+    9: 'Arial',
+    10: 'Times New Roman ',
+    11: 'Tahoma ',
+    12: 'Verdana',
+    num2bl: function (num) {
+      return num === 0 ? false : true
+    }
+  }
+  let color = fc?'':(fc+"").indexOf('rgb')>-1?util.rgb2hex(fc):fc;
+
+  let font = {
+    name:ff,
+    family: 1,
+    size: fs,
+    color: {argb: color.replace('#', '')},
+    bold: luckyToExcel.num2bl(bl),
+    italic: luckyToExcel.num2bl(it),
+    underline: luckyToExcel.num2bl(ul),
+    strike: luckyToExcel.num2bl(cl)
+  }
+
+  return font;
+}
+
+var alignmentConvert = function (vt = 'default', ht = 'default', tb = 'default', tr = 'default') { // luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
+  const luckyToExcel = {
+    vertical: {
+      0: 'middle',
+      1: 'top',
+      2: 'bottom',
+      default: 'top'
+    },
+    horizontal: {
+      0: 'center',
+      1: 'left',
+      2: 'right',
+      default: 'left'
+    },
+    wrapText: {
+      0: false,
+      1: false,
+      2: true,
+      default: false
+    },
+    textRotation: {
+      0: 0,
+      1: 45,
+      2: -45,
+      3: 'vertical',
+      4: 90,
+      5: -90,
+      default: 0
+    }
+  }
+
+  let alignment = {
+    vertical: luckyToExcel.vertical[vt],
+    horizontal: luckyToExcel.horizontal[ht],
+    wrapText: luckyToExcel.wrapText[tb],
+    textRotation: luckyToExcel.textRotation[tr]
+  }
+  return alignment;
+
+}

+ 1418 - 0
src/views/onLineEditing/js/export.js

@@ -0,0 +1,1418 @@
+import ExcelJS from 'exceljs'
+
+import FileSaver from 'file-saver'
+
+const exportExcel = function(luckysheet,name) { // 参数为luckysheet.getluckysheetfile()获取的对象
+    // 1.创建工作簿,可以为工作簿添加属性
+    const workbook = new ExcelJS.Workbook();
+    // 2.创建表格,第二个参数可以配置创建什么样的工作表
+    // 2.创建表格,第二个参数可以配置创建什么样的工作表
+    if (Object.prototype.toString.call(luckysheet) === '[object Object]') {
+        luckysheet = [luckysheet]
+    }
+    console.log(luckysheet)
+    //var tableArr=luckysheet.getAllSheets();
+    luckysheet.forEach(function(table) {
+        if (table.data.length === 0) return  true
+        // ws.getCell('B2').fill = fills.
+        const worksheet = workbook.addWorksheet(table.name)
+        setStyleAndValue(table.data, worksheet);
+        setMerge(table.config.merge, worksheet);
+        setBorder(table, worksheet);
+        setImages(table, worksheet, workbook);
+        return true
+    })
+
+    // return
+    // 4.写入 buffer
+    const buffer = workbook.xlsx.writeBuffer().then(data => {
+        // console.log('data', data)
+        const blob = new Blob([data], {
+            type: 'application/vnd.ms-excel;charset=utf-8'
+        })
+        console.log("导出成功!")
+        saveFile(blob, name)
+    })
+}
+
+var saveFile = function(buf,name) {
+    let blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' });
+    const downloadElement = document.createElement('a');
+    let href = window.URL.createObjectURL(blob);
+    downloadElement.href = href;
+    downloadElement.download = name+".xlsx"; // 文件名字
+    document.body.appendChild(downloadElement);
+    downloadElement.click();
+    document.body.removeChild(downloadElement); // 下载完成移除元素
+    window.URL.revokeObjectURL(href); // 释放掉blob对象
+}
+
+
+var setMerge = function (luckyMerge = {}, worksheet) {
+    const mergearr = Object.values(luckyMerge);
+    mergearr.forEach(function (elem) { // elem格式:{r: 0, c: 0, rs: 1, cs: 2}
+        // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)
+        worksheet.mergeCells(elem.r + 1, elem.c + 1, elem.r + elem.rs, elem.c + elem.cs);
+    });
+}
+
+//获取图片在单元格的位置
+var  getImagePosition =function(num,arr){
+    let index = 0;
+    let minIndex;
+    let maxIndex;
+    for (let i = 0; i < arr.length; i++) {
+        if (num < arr[i]) {
+            index = i;
+            break;
+        }
+    }
+
+    if(index==0){
+        minIndex = 0;
+        maxIndex = 1;
+    }
+    else if(index == arr.length-1){
+        minIndex = arr.length-2;
+        maxIndex = arr.length-1;
+    }
+    else{
+        minIndex = index-1;
+        maxIndex = index;
+    }
+    let min = arr[minIndex];
+    let max = arr[maxIndex];
+    let radio = Math.abs((num-min)/(max-min))+index
+    return radio;
+}
+
+var setImages = function (table, worksheet, workbook) {
+    let {
+        images,
+        visibledatacolumn,//所有行的位置
+        visibledatarow //所有列的位置
+    } = {...table}
+    if (typeof images != 'object') return;
+    for (let key in images) {
+        // 通过 base64  将图像添加到工作簿
+        const myBase64Image = images[key].src;
+        //开始行 开始列 结束行 结束列
+        const item = images[key];
+        const imageId = workbook.addImage({
+            base64: myBase64Image,
+            extension: 'png'
+        });
+
+        const col_st = getImagePosition(item.default.left,visibledatacolumn);
+        const row_st = getImagePosition(item.default.top,visibledatarow);
+
+        //模式1,图片左侧与luckysheet位置一样,像素比例保持不变,但是,右侧位置可能与原图所在单元格不一致
+        worksheet.addImage(imageId, {
+            tl: { col: col_st, row: row_st},
+            ext: { width: item.default.width, height: item.default.height },
+        });
+        //模式2,图片四个角位置没有变动,但是图片像素比例可能和原图不一样
+        // const w_ed = item.default.left+item.default.width;
+        // const h_ed = item.default.top+item.default.height;
+        // const col_ed = getImagePosition(w_ed,visibledatacolumn);
+        // const row_ed = getImagePosition(h_ed,visibledatarow);
+        // worksheet.addImage(imageId, {
+        //   tl: { col: col_st, row: row_st},
+        //   br: { col: col_ed, row: row_ed},
+        // });
+    }
+};
+
+var setBorder = function (lucksheetfile, worksheet) {
+    if (!lucksheetfile) return;
+    const luckyToExcel = {
+        style: {
+            0: 'none',
+            1: 'thin',
+            2: 'hair',
+            3: 'dotted',
+            4: 'dashDot', // 'Dashed',
+            5: 'dashDot',
+            6: 'dashDotDot',
+            7: 'double',
+            8: 'medium',
+            9: 'mediumDashed',
+            10: 'mediumDashDot',
+            11: 'mediumDashDotDot',
+            12: 'slantDashDot',
+            13: 'thick'
+        }
+    }
+    //获取所有的单元格边框的信息
+    const borderInfoCompute = getBorderInfo(lucksheetfile);
+    for (let x in borderInfoCompute) {
+        let border = {};
+        let info = borderInfoCompute[x];
+        let row = parseInt(x.substr(0, x.indexOf('_')));
+        let column = parseInt(x.substr(x.indexOf('_') + 1));
+        if(info.t!=undefined){
+            const tcolor = info.t.color.indexOf('rgb')>-1 ?rgb2hex(info.t.color):info.t.color;
+            border['top'] = {style:luckyToExcel.style[info.t.style],color: {argb: tcolor.replace('#', '')}};
+        }
+        if(info.r!=undefined){
+            const rcolor = info.r.color.indexOf('rgb')>-1 ?rgb2hex(info.r.color):info.r.color;
+            border['right'] = {style:luckyToExcel.style[info.r.style],color: {argb: rcolor.replace('#', '')}};
+        }
+        if(info.b!=undefined){
+            const bcolor = info.b.color.indexOf('rgb')>-1 ?rgb2hex(info.b.color):info.b.color;
+            border['bottom'] = {style:luckyToExcel.style[info.b.style],color: {argb: bcolor.replace('#', '')}};
+        }
+        if(info.l!=undefined){
+            const lcolor = info.l.color.indexOf('rgb')>-1 ?rgb2hex(info.l.color):info.l.color;
+            border['left'] = {style:luckyToExcel.style[info.l.style],color: {argb: lcolor.replace('#', '')}};
+        }
+        worksheet.getCell(row + 1, column + 1).border = border;
+    }
+}
+
+var getBorderInfo=function(luckysheetfile){
+    let borderInfoCompute = {};
+    let cfg = luckysheetfile.config;
+    let data = luckysheetfile.data;
+    let borderInfo = cfg["borderInfo"];
+    //设置需要计算边框的区域
+    let dataset_row_st = 0,dataset_row_ed = data.length,dataset_col_st=0,dataset_col_ed=data[0].length;
+    if(borderInfo != null && borderInfo.length > 0){
+        for(let i = 0; i < borderInfo.length; i++){
+            let rangeType = borderInfo[i].rangeType;
+
+            if(rangeType == "range"){
+                let borderType = borderInfo[i].borderType;
+                let borderColor = borderInfo[i].color;
+                let borderStyle = borderInfo[i].style;
+
+                let borderRange = borderInfo[i].range;
+
+                for(let j = 0; j < borderRange.length; j++){
+                    let bd_r1 = borderRange[j].row[0], bd_r2 = borderRange[j].row[1];
+                    let bd_c1 = borderRange[j].column[0], bd_c2 = borderRange[j].column[1];
+
+                    if(bd_r1<dataset_row_st){
+                        bd_r1 = dataset_row_st;
+                    }
+
+                    if(bd_r2>dataset_row_ed){
+                        bd_r2 = dataset_row_ed;
+                    }
+
+                    if(bd_c1<dataset_col_st){
+                        bd_c1 = dataset_col_st;
+                    }
+
+                    if(bd_c2>dataset_col_ed){
+                        bd_c2 = dataset_col_ed;
+                    }
+
+                    if(borderType == "border-left"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            if(borderInfoCompute[bd_r + "_" + bd_c1] == null){
+                                borderInfoCompute[bd_r + "_" + bd_c1] = {};
+                            }
+
+                            borderInfoCompute[bd_r + "_" + bd_c1].l = { "color": borderColor, "style": borderStyle };
+
+                            let bd_c_left = bd_c1 - 1;
+
+                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                    let cell_left = data[bd_r][bd_c_left];
+
+                                    let mc = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                    if(mc.c + mc.cs - 1 == bd_c_left){
+                                        borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+
+                            let mc = cfg["merge"] || {};
+                            for (const key in mc) {
+                                let {c,r,cs,rs} = mc[key];
+                                if(bd_c1 <= c + cs - 1 && bd_c1 > c && bd_r >= r && bd_r <= r + rs -1){
+                                    borderInfoCompute[bd_r + "_" + bd_c1].l = null;
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-right"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            if(borderInfoCompute[bd_r + "_" + bd_c2] == null){
+                                borderInfoCompute[bd_r + "_" + bd_c2] = {};
+                            }
+
+                            borderInfoCompute[bd_r + "_" + bd_c2].r = { "color": borderColor, "style": borderStyle };
+
+                            let bd_c_right = bd_c2 + 1;
+
+                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                    let cell_right = data[bd_r][bd_c_right];
+
+                                    let mc = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                    if(mc.c == bd_c_right){
+                                        borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+                            let mc = cfg["merge"] || {};
+                            for (const key in mc) {
+                                let {c,r,cs,rs} = mc[key];
+                                if(bd_c2 < c + cs - 1 && bd_c2 >= c && bd_r >= r && bd_r <= r + rs -1){
+                                    borderInfoCompute[bd_r + "_" + bd_c2].r = null;
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-top"){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r1] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(borderInfoCompute[bd_r1 + "_" + bd_c] == null){
+                                borderInfoCompute[bd_r1 + "_" + bd_c] = {};
+                            }
+
+                            borderInfoCompute[bd_r1 + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+
+                            let bd_r_top = bd_r1 - 1;
+
+                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                    let cell_top = data[bd_r_top][bd_c];
+
+                                    let mc = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                    if(mc.r + mc.rs - 1 == bd_r_top){
+                                        borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+
+                            let mc = cfg["merge"] || {};
+                            for (const key in mc) {
+                                let {c,r,cs,rs} = mc[key];
+                                if(bd_r1 <= r + rs - 1 && bd_r1 > r && bd_c >= c && bd_c <= c + cs -1){
+                                    borderInfoCompute[bd_r1 + "_" + bd_c].t = null;
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-bottom"){
+                        if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r2] != null) {
+                            continue;
+                        }
+
+                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                            if(borderInfoCompute[bd_r2 + "_" + bd_c] == null){
+                                borderInfoCompute[bd_r2 + "_" + bd_c] = {};
+                            }
+
+                            borderInfoCompute[bd_r2 + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+
+                            let bd_r_bottom = bd_r2 + 1;
+
+                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                    let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                    let mc = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                    if(mc.r == bd_r_bottom){
+                                        borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                }
+                            }
+
+                            let mc = cfg["merge"] || {};
+                            for (const key in mc) {
+                                let {c,r,cs,rs} = mc[key];
+                                if(bd_r2 < r + rs - 1 && bd_r2 >= r && bd_c >= c && bd_c <= c + cs -1){
+                                    borderInfoCompute[bd_r2 + "_" + bd_c].b = null;
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-all"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                    let cell = data[bd_r][bd_c];
+
+                                    let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+                                    if(mc==undefined || mc==null){
+                                        continue
+                                    };
+                                    if(mc.r == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+
+                                    if(mc.r + mc.rs - 1 == bd_r){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+
+                                    if(mc.c == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    }
+
+                                    if(mc.c + mc.cs - 1 == bd_c){
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                }
+
+                                if(bd_r == bd_r1){
+                                    let bd_r_top = bd_r1 - 1;
+
+                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                        if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                            let cell_top = data[bd_r_top][bd_c];
+
+                                            let mc = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                            if(mc.r + mc.rs - 1 == bd_r_top){
+                                                borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+
+                                if(bd_r == bd_r2){
+                                    let bd_r_bottom = bd_r2 + 1;
+
+                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                        if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                            let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                            let mc = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                            if(mc.r == bd_r_bottom){
+                                                borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+
+                                if(bd_c == bd_c1){
+                                    let bd_c_left = bd_c1 - 1;
+
+                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                            let cell_left = data[bd_r][bd_c_left];
+
+                                            let mc = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                            if(mc.c + mc.cs - 1 == bd_c_left){
+                                                borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+
+                                if(bd_c == bd_c2){
+                                    let bd_c_right = bd_c2 + 1;
+
+                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                            let cell_right = data[bd_r][bd_c_right];
+
+                                            let mc = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                            if(mc.c == bd_c_right){
+                                                borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-outside"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                                if(!(bd_r == bd_r1 || bd_r == bd_r2 || bd_c == bd_c1 || bd_c == bd_c2)){
+                                    continue;
+                                }
+
+                                if(bd_r == bd_r1){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+
+                                    let bd_r_top = bd_r1 - 1;
+
+                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                        if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                            let cell_top = data[bd_r_top][bd_c];
+
+                                            let mc = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                            if(mc.r + mc.rs - 1 == bd_r_top){
+                                                borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+
+                                if(bd_r == bd_r2){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+
+                                    let bd_r_bottom = bd_r2 + 1;
+
+                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                        if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                            let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                            let mc = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                            if(mc.r == bd_r_bottom){
+                                                borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+
+                                if(bd_c == bd_c1){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+
+                                    let bd_c_left = bd_c1 - 1;
+
+                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                            let cell_left = data[bd_r][bd_c_left];
+
+                                            let mc = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                            if(mc.c + mc.cs - 1 == bd_c_left){
+                                                borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+
+                                if(bd_c == bd_c2){
+                                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                    }
+
+                                    borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+
+                                    let bd_c_right = bd_c2 + 1;
+
+                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                            let cell_right = data[bd_r][bd_c_right];
+
+                                            let mc = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                            if(mc.c == bd_c_right){
+                                                borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                            }
+                                        }
+                                        else{
+                                            borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-inside"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                                if(bd_r == bd_r1 && bd_c == bd_c1){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_r == bd_r2 && bd_c == bd_c1){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_r == bd_r1 && bd_c == bd_c2){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_r == bd_r2 && bd_c == bd_c2){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_r == bd_r1){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                        let cell = data[bd_r][bd_c];
+
+                                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                        if(mc.c == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.c + mc.cs - 1 == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_r == bd_r2){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                        let cell = data[bd_r][bd_c];
+
+                                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                        if(mc.c == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.c + mc.cs - 1 == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_c == bd_c1){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                        let cell = data[bd_r][bd_c];
+
+                                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                        if(mc.r == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.r + mc.rs - 1 == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_c == bd_c2){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                        let cell = data[bd_r][bd_c];
+
+                                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                        if(mc.r == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.r + mc.rs - 1 == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                        let cell = data[bd_r][bd_c];
+
+                                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                        if(mc.r == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.r + mc.rs - 1 == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+
+                                        if(mc.c == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.c + mc.cs - 1 == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-horizontal"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                                if(bd_r == bd_r1){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_r == bd_r2){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                        let cell = data[bd_r][bd_c];
+
+                                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c];
+
+                                        if(mc.r == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.r + mc.rs - 1 == bd_r){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].t = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].b = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-vertical"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                                if(bd_c == bd_c1){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else if(bd_c == bd_c2){
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                                else{
+                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                                        let cell = data[bd_r][bd_c];
+
+                                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c] || {};
+
+                                        if(mc.c == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        }
+                                        else if(mc.c + mc.cs - 1 == bd_c){
+                                            if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                                borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                            }
+
+                                            borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                        }
+                                    }
+                                    else{
+                                        if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                                            borderInfoCompute[bd_r + "_" + bd_c] = {};
+                                        }
+
+                                        borderInfoCompute[bd_r + "_" + bd_c].l = { "color": borderColor, "style": borderStyle };
+                                        borderInfoCompute[bd_r + "_" + bd_c].r = { "color": borderColor, "style": borderStyle };
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    else if(borderType == "border-none"){
+                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){
+                            if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                                continue;
+                            }
+
+                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){
+                                if(borderInfoCompute[bd_r + "_" + bd_c] != null){
+                                    delete borderInfoCompute[bd_r + "_" + bd_c];
+                                }
+
+                                if(bd_r == bd_r1){
+                                    let bd_r_top = bd_r1 - 1;
+
+                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                        delete borderInfoCompute[bd_r_top + "_" + bd_c].b;
+                                    }
+                                }
+
+                                if(bd_r == bd_r2){
+                                    let bd_r_bottom = bd_r2 + 1;
+
+                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                        delete borderInfoCompute[bd_r_bottom + "_" + bd_c].t;
+                                    }
+                                }
+
+                                if(bd_c == bd_c1){
+                                    let bd_c_left = bd_c1 - 1;
+
+                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                        delete borderInfoCompute[bd_r + "_" + bd_c_left].r;
+                                    }
+                                }
+
+                                if(bd_c == bd_c2){
+                                    let bd_c_right = bd_c2 + 1;
+
+                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                        delete borderInfoCompute[bd_r + "_" + bd_c_right].l;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            else if(rangeType == "cell"){
+                let value = borderInfo[i].value;
+
+                let bd_r = value.row_index, bd_c = value.col_index;
+
+                if(bd_r < dataset_row_st || bd_r > dataset_row_ed || bd_c < dataset_col_st || bd_c > dataset_col_ed){
+                    continue;
+                }
+
+                if (cfg["rowhidden"] != null && cfg["rowhidden"][bd_r] != null) {
+                    continue;
+                }
+
+                if(value.l != null || value.r != null || value.t != null || value.b != null){
+                    if(borderInfoCompute[bd_r + "_" + bd_c] == null){
+                        borderInfoCompute[bd_r + "_" + bd_c] = {};
+                    }
+
+                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == "object" && data[bd_r][bd_c].mc != null){
+                        let cell = data[bd_r][bd_c];
+                        let mc = cfg["merge"][cell.mc.r + "_" + cell.mc.c] || {};
+
+                        if(value.l != null && bd_c == mc.c){ //左边框
+                            borderInfoCompute[bd_r + "_" + bd_c].l = { "color": value.l.color, "style": value.l.style };
+
+                            let bd_c_left = bd_c - 1;
+
+                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                    let cell_left = data[bd_r][bd_c_left];
+
+                                    let mc_l = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                    if(mc_l.c + mc_l.cs - 1 == bd_c_left){
+                                        borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].l = null;
+                        }
+
+                        if(value.r != null && bd_c == mc.c + mc.cs - 1){ //右边框
+                            borderInfoCompute[bd_r + "_" + bd_c].r = { "color": value.r.color, "style": value.r.style };
+
+                            let bd_c_right = bd_c + 1;
+
+                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                    let cell_right = data[bd_r][bd_c_right];
+
+                                    let mc_r = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                    if(mc_r.c == bd_c_right){
+                                        borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].r = null;
+                        }
+
+                        if(value.t != null && bd_r == mc.r){ //上边框
+                            borderInfoCompute[bd_r + "_" + bd_c].t = { "color": value.t.color, "style": value.t.style };
+
+                            let bd_r_top = bd_r - 1;
+
+                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                    let cell_top = data[bd_r_top][bd_c];
+
+                                    let mc_t = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                    if(mc_t.r + mc_t.rs - 1 == bd_r_top){
+                                        borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].t = null;
+                        }
+
+                        if(value.b != null && bd_r == mc.r + mc.rs - 1){ //下边框
+                            borderInfoCompute[bd_r + "_" + bd_c].b = { "color": value.b.color, "style": value.b.style };
+
+                            let bd_r_bottom = bd_r + 1;
+
+                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                    let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                    let mc_b = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                    if(mc_b.r == bd_r_bottom){
+                                        borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].b = null;
+                        }
+                    }
+                    else{
+                        if(value.l != null){ //左边框
+                            borderInfoCompute[bd_r + "_" + bd_c].l = { "color": value.l.color, "style": value.l.style };
+
+                            let bd_c_left = bd_c - 1;
+
+                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + "_" + bd_c_left]){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == "object" && data[bd_r][bd_c_left].mc != null){
+                                    let cell_left = data[bd_r][bd_c_left];
+
+                                    let mc_l = cfg["merge"][cell_left.mc.r + "_" + cell_left.mc.c];
+
+                                    if(mc_l.c + mc_l.cs - 1 == bd_c_left){
+                                        borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r + "_" + bd_c_left].r = { "color": value.l.color, "style": value.l.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].l = null;
+                        }
+
+                        if(value.r != null){ //右边框
+                            borderInfoCompute[bd_r + "_" + bd_c].r = { "color": value.r.color, "style": value.r.style };
+
+                            let bd_c_right = bd_c + 1;
+
+                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + "_" + bd_c_right]){
+                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == "object" && data[bd_r][bd_c_right].mc != null){
+                                    let cell_right = data[bd_r][bd_c_right];
+
+                                    let mc_r = cfg["merge"][cell_right.mc.r + "_" + cell_right.mc.c];
+
+                                    if(mc_r.c == bd_c_right){
+                                        borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r + "_" + bd_c_right].l = { "color": value.r.color, "style": value.r.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].r = null;
+                        }
+
+                        if(value.t != null){ //上边框
+                            borderInfoCompute[bd_r + "_" + bd_c].t = { "color": value.t.color, "style": value.t.style };
+
+                            let bd_r_top = bd_r - 1;
+
+                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + "_" + bd_c]){
+                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == "object" && data[bd_r_top][bd_c].mc != null){
+                                    let cell_top = data[bd_r_top][bd_c];
+
+                                    let mc_t = cfg["merge"][cell_top.mc.r + "_" + cell_top.mc.c];
+
+                                    if(mc_t.r + mc_t.rs - 1 == bd_r_top){
+                                        borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r_top + "_" + bd_c].b = { "color": value.t.color, "style": value.t.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].t = null;
+                        }
+
+                        if(value.b != null){ //下边框
+                            borderInfoCompute[bd_r + "_" + bd_c].b = { "color": value.b.color, "style": value.b.style };
+
+                            let bd_r_bottom = bd_r + 1;
+
+                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + "_" + bd_c]){
+                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == "object" && data[bd_r_bottom][bd_c].mc != null){
+                                    let cell_bottom = data[bd_r_bottom][bd_c];
+
+                                    let mc_b = cfg["merge"][cell_bottom.mc.r + "_" + cell_bottom.mc.c];
+
+                                    if(mc_b.r == bd_r_bottom){
+                                        borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                                    }
+                                }
+                                else{
+                                    borderInfoCompute[bd_r_bottom + "_" + bd_c].t = { "color": value.b.color, "style": value.b.style };
+                                }
+                            }
+                        }
+                        else{
+                            borderInfoCompute[bd_r + "_" + bd_c].b = null;
+                        }
+                    }
+                }
+                else{
+                    delete borderInfoCompute[bd_r + "_" + bd_c];
+                }
+            }
+        }
+    }
+    return borderInfoCompute;
+}
+
+//获取数据类型
+var getObjType = function (obj) {
+    let toString = Object.prototype.toString;
+
+    let map = {
+        '[object Boolean]': 'boolean',
+        '[object Number]': 'number',
+        '[object String]': 'string',
+        '[object Function]': 'function',
+        '[object Array]': 'array',
+        '[object Date]': 'date',
+        '[object RegExp]': 'regExp',
+        '[object Undefined]': 'undefined',
+        '[object Null]': 'null',
+        '[object Object]': 'object'
+    }
+    return map[toString.call(obj)];
+}
+
+
+var setStyleAndValue = function (cellArr, worksheet) {
+    if (!Array.isArray(cellArr)) return;
+
+    cellArr.forEach(function (row, rowid) {
+        const dbrow = worksheet.getRow(rowid+1);
+        //设置单元格行高,默认乘以1倍
+        dbrow.height=luckysheet.getRowHeight([rowid])[rowid]
+        row.every(function (cell, columnid) {
+            if (!cell) return true;
+            if(rowid==0){
+                const dobCol = worksheet.getColumn(columnid+1);
+                //设置单元格列宽除以8
+                dobCol.width=luckysheet.getColumnWidth([columnid])[columnid]
+            }
+            let fill = fillConvert(cell.bg);
+            let font = fontConvert(cell.ff, cell.fc, cell.bl, cell.it, cell.fs, cell.cl, cell.ul);
+            let alignment = alignmentConvert(cell.vt, cell.ht, cell.tb, cell.tr);
+            let value;
+
+            var v='';
+            if(cell.ct&&cell.ct.t=='inlineStr'){
+                var s=cell.ct.s;
+                s.forEach(function(val,num){
+                    v+=val.v;
+                })
+            }else{
+                v=cell.v;
+            }
+            if (cell.f) {
+                value = { formula: cell.f, result: v };
+            } else {
+                value = v;
+            }
+            let target = worksheet.getCell(rowid + 1, columnid + 1);
+            target.fill = fill;
+            target.font = font;
+            target.alignment = alignment;
+            target.value = value;
+            return true;
+        })
+    })
+}
+
+//转换颜色
+var rgb2hex =function(rgb) {
+    if (rgb.charAt(0) == '#'){
+        return rgb;
+    }
+
+    var ds = rgb.split(/\D+/);
+    var decimal = Number(ds[1]) * 65536 + Number(ds[2]) * 256 + Number(ds[3]);
+    return "#" + zero_fill_hex(decimal, 6);
+
+    function zero_fill_hex(num, digits) {
+        var s = num.toString(16);
+        while (s.length < digits)
+            s = "0" + s;
+        return s;
+    }
+}
+
+var fillConvert = function (bg) {
+    if (!bg) {
+        return null;
+        // return {
+        // 	type: 'pattern',
+        // 	pattern: 'solid',
+        // 	fgColor:{argb:'#ffffff'.replace('#','')}
+        // }
+    }
+    bg  = bg.indexOf('rgb')>-1 ?rgb2hex(bg):bg;
+    let fill = {
+        type: 'pattern',
+        pattern: 'solid',
+        fgColor: {argb: bg.replace('#', '')}
+    }
+    return fill
+}
+
+var fontConvert = function (ff = 0, fc = '#000000', bl = 0, it = 0, fs = 10, cl = 0, ul = 0) { // luckysheet:ff(样式), fc(颜色), bl(粗体), it(斜体), fs(大小), cl(删除线), ul(下划线)
+    const luckyToExcel = {
+        0: '微软雅黑',
+        1: '宋体(Song)',
+        2: '黑体(ST Heiti)',
+        3: '楷体(ST Kaiti)',
+        4: '仿宋(ST FangSong)',
+        5: '新宋体(ST Song)',
+        6: '华文新魏',
+        7: '华文行楷',
+        8: '华文隶书',
+        9: 'Arial',
+        10: 'Times New Roman ',
+        11: 'Tahoma ',
+        12: 'Verdana',
+        num2bl: function (num) {
+            return num === 0 ? false : true
+        }
+    }
+
+    let font = {
+        name:ff,
+        family: 1,
+        size: fs,
+        color: {argb: fc.replace('#', '')},
+        bold: luckyToExcel.num2bl(bl),
+        italic: luckyToExcel.num2bl(it),
+        underline: luckyToExcel.num2bl(ul),
+        strike: luckyToExcel.num2bl(cl)
+    }
+
+    return font;
+}
+
+var alignmentConvert = function (vt = 'default', ht = 'default', tb = 'default', tr = 'default') { // luckysheet:vt(垂直), ht(水平), tb(换行), tr(旋转)
+    const luckyToExcel = {
+        vertical: {
+            0: 'middle',
+            1: 'top',
+            2: 'bottom',
+            default: 'top'
+        },
+        horizontal: {
+            0: 'center',
+            1: 'left',
+            2: 'right',
+            default: 'left'
+        },
+        wrapText: {
+            0: false,
+            1: false,
+            2: true,
+            default: false
+        },
+        textRotation: {
+            0: 0,
+            1: 45,
+            2: -45,
+            3: 'vertical',
+            4: 90,
+            5: -90,
+            default: 0
+        }
+    }
+
+    let alignment = {
+        vertical: luckyToExcel.vertical[vt],
+        horizontal: luckyToExcel.horizontal[ht],
+        wrapText: luckyToExcel.wrapText[tb],
+        textRotation: luckyToExcel.textRotation[tr]
+    }
+    return alignment;
+
+}
+
+
+export { exportExcel }