vue使用xlsx修改樣式導出excel


1 npm install --save xlsx
2 npm install --save xlsx-style  //如果需要修改樣式,則需要安裝
1.解決引入xlsx-style報錯問題
2.找到:node_modules\xlsx-style\dist\xlsx.full.min.js 並把這個js文件拷貝到static文件夾下
3.再index.html中引入 <script src="static/xlsx.full.min.js"></script>
 
        
新建downExcel.js文件

import XLSX from "xlsx"
// 配置
const wopts = {
    bookType: "xlsx",
    bookSST: true,
    type: "binary",
    cellStyles: true
};

function downloadExl(json, config, type) {
    var tmpdata = json[0];
    json.unshift({});
    var keyMap = []; //獲取keys
    for (var k in tmpdata) {
        keyMap.push(k);
        json[0][k] = k;
    }
    var tmpdata = []; //用來保存轉換好的json
    let border = {
        bottom: {
            style: "thin",
            color: {
                rgb: "000000"
            }
        },
        top: {
            style: "thin",
            color: {
                rgb: "000000"
            }
        },
        left: {
            style: "thin",
            color: {
                rgb: "000000"
            }
        },
        right: {
            style: "thin",
            color: {
                rgb: "000000"
            }
        }
    };

    let style0 = {
        border: border,
        alignment: {
            horizontal: "center",
            wrapText: true,
            vertical: "center"
        },
        font: {
            sz: 18,
            bold: true,
            color: {
                rgb: "000000"
            },
            outline: true
        },
        fill: {
            bgColor: {
                indexed: 64
            }
        }
    };
    let style1 = {
        border: border,
        alignment: {
            horizontal: "center",
            wrapText: true,
            vertical: "center"
        },
        font: {
            sz: 12,
            bold: true,
            color: {
                rgb: "000000"
            },
            outline: true
        },
        fill: {
            bgColor: {
                indexed: 64
            }
        }
    };
    json
        .map((v, i) =>
            keyMap.map((k, j) =>
                Object.assign({}, {
                    v: v[k],
                    position: (j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) +
                        (i + 1)
                })
            )
        )
        .reduce((prev, next) => prev.concat(next))
        .forEach((v, i) => {
            // 在遍歷時修改樣式
            let s = {
                font: {
                    sz: 10,
                    name: "微軟雅黑"
                },
                alignment: {
                    horizontal: "center",
                    wrapText: true,
                    vertical: "center"
                }
            };
            // 判斷是否是標題
            if (config._this.title.includes(v.v) && v.position.length == 2 && v.position[1] == "1") {
                s.fill = {
                    fgColor: {
                        rgb: "008000"
                    }
                };
                s.border = {
                    right: {
                        style: "thin",
                        color: {
                            rgb: "000000"
                        }
                    }
                };
                // 判斷是否是需要紅色字體的標題字段
                if (config._this.redTitle.includes(v.v)) {
                    s.font.color = {
                        rgb: "ff0000"
                    };
                }
            }
            tmpdata[v.position] = {
                v: v.v || "",
                s
            };
        });
    var outputPos = Object.keys(tmpdata); //設置區域,比如表格從A1到D10
    //設置每列對應的寬度
    tmpdata["!margins"] = [{ //工作表單元格合並配置項 可選
            s: { //s start 開始
                c: 0, //cols 開始列
                r: 0 //rows 開始行
            }, //開始 A1
            e: { //e end  結束
                c: 4, //cols 結束列
                r: 0 //rows 結束行
            }
        },
        {
            s: {
                c: 0,
                r: 1
            }, //開始 A2
            e: {
                c: 1,
                r: 1
            } //結束B2
        },
        {
            s: {
                c: 2,
                r: 1
            }, //開始 C2
            e: {
                c: 3,
                r: 1
            } //結束D2
        },
    ]
    // !cols工作表列寬配置項 可選
    tmpdata["!cols"] = config.colwidth;

    
    //        第一二行樣式
    tmpdata["A1"].s = style0;
    tmpdata["A2"].s = style1;
    tmpdata["C2"].s = style0;
    var tmpWB = {
        SheetNames: ["mySheet"], //工作表名數組
        Sheets: {
            mySheet: Object.assign({},
                tmpdata, //!ref設置工作表的范圍 如 必須 否則不顯示
                {
                    "!ref": outputPos[0] + ":" + outputPos[outputPos.length - 1] //設置填充區域
                }
            )
        }
    };
    const tmpDown = new Blob(
        [
            s2ab(
                XLSX.write(
                    tmpWB, {
                        bookType: type == undefined ? "xlsx" : type,
                        bookSST: false,
                        type: "binary"
                    } //這里的數據是用來定義導出的格式類型
                )
            )
        ], {
            type: ""
        }
    );
    // 數據處理完后傳入下載
    saveAs(
        tmpDown,
        config._this.fileName +
        "." +
        (wopts.bookType == "biff2" ? "xls" : wopts.bookType)
    );
}
// 獲取26個英文字母用來表示excel的列
function getCharCol(n) {
    let temCol = "",
        s = "",
        m = 0;
    while (n > 0) {
        m = (n % 26) + 1;
        s = String.fromCharCode(m + 64) + s;
        n = (n - m) / 26;
    }
    return s;
}

function s2ab(s) {
    if (typeof ArrayBuffer !== "undefined") {
        var buf = new ArrayBuffer(s.length);
        var view = new Uint8Array(buf);
        for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
        return buf;
    } else {
        var buf = new Array(s.length);
        for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xff;
        return buf;
    }
}
// 下載功能
function saveAs(obj, fileName) {
    var tmpa = document.createElement("a");
    tmpa.download = fileName || "未命名";
    // 兼容ie 火狐 下載文件
    if ("msSaveOrOpenBlob" in navigator) {
        window.navigator.msSaveOrOpenBlob(obj, fileName);
    } else if (window.navigator.userAgent.includes("Firefox")) {
        var a = document.createElement("a");
        a.href = URL.createObjectURL(obj);
        a.download = fileName;
        document.body.appendChild(a);
        a.click();
    } else {
        tmpa.href = URL.createObjectURL(obj);
    }
    tmpa.click();
    setTimeout(function () {
        URL.revokeObjectURL(obj);
    }, 100);
}
export default downloadExl;
使用:import downloadfn from "@/config/downExcel
data(){
return{
            fileName:"testExcel",
            xmindJSON: [
                {
                    Code: 1,
                    Name: "里斯",
                    GBPerfix: "ABC-F",
                    stop: "測試"
                },
                {
                    Code: 2,
                    Name: "里斯1",
                    GBPerfix: "ABC-B",
                    stop: "測試1"
                },
                {
                    Code: 3,
                    Name: "里斯2",
                    GBPerfix: "ABC-D",
                    stop: "測試1"
                }
            ],
            config: {
                colwidth: [
                    { wpx: 169 },
                    { wpx: 63 },
                    { wpx: 203 },
                    { wpx: 128 },
                ],
                _this: this
            },
            title: ["功能模塊與路徑", "用例編號", "前置條件"]


}
}
methods:{
    export() {
 
         
            downloadfn(this.xmindJSON, this.config);
 
         
        }

}
   
 

 

 

 


免責聲明!

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



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