美文网首页
关于前端将json数据导出为Excel格式并下载

关于前端将json数据导出为Excel格式并下载

作者: 旧时袋 | 来源:发表于2019-04-16 11:53 被阅读0次

总体思路就是json数据的key,value跟Excel的行列转换,还有就是解决数据在Excel表格中存放的位置,区域问题。

这里要用到的两个小插件,一个是xslx.js,一个是FileSaver.js,前者是来处理生成Excel的,后者是用来把文件下载保存到本地的。

下载地址:

https://github.com/eligrey/FileSaver.js

https://github.com/SheetJS/js-xlsx/tree/028d7010a516383cb9a2fdd0f0a919392e77600a/demos/angular

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>导出生成excel</title>
    <script src="js/xlsx.full.min.js"></script>
    <script src="js/FileSaver.min.js"></script>
</head>

<body>
    <button onclick="downloadExl(students)">导出</button>
    <script>
        var students = [{
            "name": "小明1",
            "age": "6",
            "sex": "男",
            "height": "60"
        }, {
            "name": "小明2",
            "age": "7",
            "sex": "男",
            "height": "70"
        }, {
            "name": "小明3",
            "age": "8",
            "sex": "男",
            "height": "80"
        }];
        function downloadExl(data, type) {

            var keys = Object.keys(data[0]);
            var firstRow = {};
            keys.forEach(function (item) {
                firstRow[item] = item;
            });
            data.unshift(firstRow);

            var content = {};

            // 把json格式的数据转为excel的行列形式
            var sheetsData = data.map(function (item, rowIndex) {
                return keys.map(function (key, columnIndex) {
                    return Object.assign({}, {
                        value: item[key],
                        position: (columnIndex > 25 ? getCharCol(columnIndex) : String.fromCharCode(65 + columnIndex)) + (rowIndex + 1),
                    });
                });
            }).reduce(function (prev, next) {
                return prev.concat(next);
            });

            sheetsData.forEach(function (item, index) {
                content[item.position] = { v: item.value };
            });

            //设置区域,比如表格从A1到D10,SheetNames:标题,
            var coordinate = Object.keys(content);
            var workBook = {
                SheetNames: ["helloSheet"],
                Sheets: {
                    "helloSheet": Object.assign({}, content, { "!ref": coordinate[0] + ":" + coordinate[coordinate.length - 1] }),
                }
            };
            //这里的数据是用来定义导出的格式类型
            var excelData = XLSX.write(workBook, { bookType: "xlsx", bookSST: false, type: "binary" });
            var blob = new Blob([string2ArrayBuffer(excelData)], { type: "" });
            saveAs(blob, "hello.xlsx");
        }
        //字符串转字符流
        function string2ArrayBuffer(s) {
            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;
        }
        // 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。
        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
        }
    </script>
</body>

</html>

纯属借鉴 出处:https://www.cnblogs.com/absolute-child/p/8083129.html

相关文章

网友评论

      本文标题:关于前端将json数据导出为Excel格式并下载

      本文链接:https://www.haomeiwen.com/subject/lwavwqtx.html