在 Angular 中将 JSON 导出为 CSV

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31969430/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 18:01:05  来源:igfitidea点击:

Export JSON to CSV in Angular

jsonangularjscsv

提问by mindparse

I am looking for ways to convert a JSON object into CSV format using Angular. I came across this https://www.npmjs.com/package/jsonexportwhich is exactly the kind of thing I want to use, but I am unsure if I can actually use this with Angular (seems to node specific?) and if not, are there any ready made directives, etc out there that I could feed some JSON into to get CSV back.

我正在寻找使用 Angular 将 JSON 对象转换为 CSV 格式的方法。我遇到了这个https://www.npmjs.com/package/jsonexport,这正是我想要使用的那种东西,但我不确定我是否真的可以将它与 Angular 一起使用(似乎是特定于节点的?)不,是否有任何现成的指令等,我可以将一些 JSON 输入到其中以返回 CSV。

Can anyone point me at some useful examples, I have had a look around and they seem to be few and far between and what I have found only seems to cope with very basic flat JSON structures.

任何人都可以指出一些有用的例子,我环顾四周,它们似乎很少,而且我发现的似乎只能处理非常基本的扁平 JSON 结构。

Thanks

谢谢

回答by Alex

Try this http://ngmodules.org/modules/ng-csv

试试这个http://ngmodules.org/modules/ng-csv

For working example - https://asafdav.github.io/ng-csv/example/

对于工作示例 - https://asafdav.github.io/ng-csv/example/

Usage example js (taken from their docs)

用法示例 js(取自他们的文档)

Script

脚本

    var myapp = angular.module('myapp', ["ngSanitize", "ngCsv"]);

    myapp.controller('myctrl', function ($scope) {
        $scope.filename = "test";
        $scope.getArray = [{a: 1, b:2}, {a:3, b:4}];

      $scope.addRandomRow = function() {
        $scope.getArray.push({a: Math.floor((Math.random()*10)+1), b: Math.floor((Math.random()*10)+1)});
      };

      $scope.getHeader = function () {return ["A", "B"]};

      $scope.clickFn = function() {
        console.log("click click click");
      };
    });

Markup

标记

<div ng-app="myapp">
    <div class="container" ng-controller="myctrl">

      <div class="page-header">
        <h1>ngCsv <small>example</small></h1>
      </div>

      <div class="form-group">
        <label for="filename">Filename </label>
        <input type="text" id="filename" class="form-control" ng-model="filename">
      </div>

      <div class="form-group">
        <label for="separator">Field separator</label>
        <input type="text" id="separator" class="form-control" ng-model="separator" ng-init="separator=','">
      </div>

      <div class="form-group">
        <label for="decimal-separator">Decimal separator</label>
        <input type="text" id="decimal-separator" class="form-control" ng-model="decimalSeparator" ng-init="decimalSeparator='.'">
      </div>            

      <button class="btn btn-default"
              ng-csv="getArray" filename="{{ filename }}.csv" field-separator="{{separator}}" decimal-separator="{{decimalSeparator}}"
              >Export to CSV</button>

      <button class="btn btn-default"
              ng-csv="getArray" csv-header="getHeader()" filename="{{ filename }}" field-separator="{{separator}}" decimal-separator="{{decimalSeparator}}"
              >Export to CSV with header</button>

      <button class="btn btn-default"
              ng-csv="getArray" csv-header="getHeader()" filename="{{ filename }}" field-separator="{{separator}}" decimal-separator="{{decimalSeparator}}"
              ng-click="clickFn()">Export with ng-click</button>

      <button class="btn btn-default"
              ng-csv="getArray" filename="{{ filename }}.csv" field-separator="{{separator}}" decimal-separator="{{decimalSeparator}}" add-bom="true"
        >With BOM</button>

      <button class="btn btn-default" ng-click="addRandomRow()">Add row</button>
    </div>
</div>

回答by VRavi

There is no option to export sub-grid data in ui-grid. But we have another choice to export ui-grid and it's sub-grid data as .csv file by using FileSaver.js. I have created a Directive to get grid data/Json data and then format the data like a tree structure and then download .csv file by using FileSaver.js . It has a limit upto a nested grid.

ui-grid 中没有导出子网格数据的选项。但是我们还有另一种选择,可以使用 FileSaver.js 将 ui-grid 及其子网格数据导出为 .csv 文件。我创建了一个指令来获取网格数据/Json 数据,然后像树结构一样格式化数据,然后使用 FileSaver.js 下载 .csv 文件。它对嵌套网格有限制。

    angular.module("exampleModule", [])
.controller('exampleController', function ($scope) {
                $scope.dataList = [
                    {
                        id: 1,
                        name: 'github',
                        price: '200$',
                        publisher: {
                            name: 'hieutran',
                            company: 'Dtag-VN'
                        },
                        nested:[
                         {
                            name: 'name1',
                            company: 'company1'
                        },
                        {
                            name: 'name2',
                            company: 'company2'
                        }]
                    },
                     {
                        id: 2,
                        name: 'twitter',
                        price: '500$',
                        publisher: {
                            name: 'twitter tran',
                            company: 'Canada'
                        },
                         nested:[]
                    },

                    {
                        id: 3,
                        name: 'google',
                        price: '300$',
                        publisher: {
                            name: 'tran',
                            company: 'Vietname'
                        },
                         nested:[
                         {
                            name: 'name3',
                            company: 'company3'
                        },
                        {
                            name: 'name4',
                            company: 'company4'
                        }]
                    }
                ]
            })
                            .directive("ngGridJsonExportExcel", function($timeout) {
                                return {
                                    restrict: "AE",
                                    scope: {
                                        data: "=",
                                        filename: "=?",
                                        reportFields: "=",
                                        nestedReportFields: "=",
                                        nestedDataProperty: "@"
                                    },
                                    link: function(scope, element) {
                                        scope.filename = !!scope.filename ? scope.filename : "export-excel";

                                        function generateFieldsAndHeaders(fieldsObject, fields, header) {
                                            _.forEach(fieldsObject, function(field, key) {
                                                if (!field || !key) {
                                                    throw new Error("error json report fields");
                                                }
                                                fields.push(key);
                                                header.push(field);
                                            });
                                            return {fields: fields, header: header};
                                        }
                                        var fieldsAndHeader = generateFieldsAndHeaders(scope.reportFields, [], []);
                                        var fields = fieldsAndHeader.fields, header = fieldsAndHeader.header;
                                        var nestedFieldsAndHeader = generateFieldsAndHeaders(scope.nestedReportFields, [], [""]);
                                        var nestedFields = nestedFieldsAndHeader.fields, nestedHeader = nestedFieldsAndHeader.header;
                                        function _convertToExcel(body, header) {
                                            return header + "\n" + body;
                                        }
                                        function _objectToString(object) {
                                            var output = "";
                                            _.forEach(object, function(value, key) {
                                                output += key + ":" + value + " ";
                                            });

                                            return "'" + output + "'";
                                        }
                                        function generateFieldValues(list, rowItems, dataItem) {
                                            _.forEach(list, function(field) {
                                                var data = "", fieldValue = "", curItem = null;
                                                if (field.indexOf(".")) {
                                                    field = field.split(".");
                                                    curItem = dataItem;
                                                    // deep access to obect property
                                                    _.forEach(field, function(prop) {
                                                        if (curItem !== null && curItem !== undefined) {
                                                            curItem = curItem[prop];
                                                        }
                                                    });
                                                    data = curItem;
                                                } else {
                                                    data = dataItem[field];
                                                }
                                                fieldValue = data !== null ? data : " ";
                                                if (fieldValue !== undefined && angular.isObject(fieldValue)) {
                                                    fieldValue = _objectToString(fieldValue);
                                                }
                                                rowItems.push(fieldValue);
                                            });
                                            return rowItems;
                                        }
                                        function _bodyData() {
                                            var body = "";

                                            _.forEach(scope.data, function(dataItem) {
                                                var rowItems = [];var nestedBody = "";
                                                rowItems = generateFieldValues(fields, rowItems, dataItem);
                                                //Nested Json body generation start 
                                                if (scope.nestedDataProperty && dataItem[scope.nestedDataProperty].length) {
                                                    _.forEach(dataItem[scope.nestedDataProperty], function(nestedDataItem) {
                                                        var nestedRowItems = [""];
                                                        nestedRowItems = generateFieldValues(nestedFields, nestedRowItems, nestedDataItem);
                                                        nestedBody += nestedRowItems.toString() + "\n";
                                                    });
                                                    var strData = _convertToExcel(nestedBody, nestedHeader);
                                                    body += rowItems.toString() + "\n" + strData;
                                                    ////Nested Json body generation end 
                                                } else {
                                                    body += rowItems.toString() + "\n";
                                                }
                                            });
                                            return body;
                                        }

                                        $timeout(function() {
                                            element.bind("click", function() {
                                                var bodyData = _bodyData();
                                                var strData = _convertToExcel(bodyData, header);
                                                var blob = new Blob([strData], {
                                                    type: "text/plain;charset=utf-8"
                                                });

                                                return saveAs(blob, [scope.filename + ".csv"]);
                                            });
                                        }, 1000);
                                    }
                                };
                            });

HTML code:

<button ng-json-export-excel data="dataList"  nested-data-property="nested" report-fields="{id: 'ID Heder', name: 'Name Header', price: 'Price Head',  'publisher.name': 'Publisher Head', 'publisher.company': 'Company Head'}" nested-report-fields="{name: 'Nested Name', company: 'Nested Company'}">Json Export</button>

Here is my plunker

    angular.module("exampleModule", [])
.controller('exampleController', function ($scope) {
                $scope.dataList = [
                    {
                        id: 1,
                        name: 'github',
                        price: '200$',
                        publisher: {
                            name: 'hieutran',
                            company: 'Dtag-VN'
                        },
                        nested:[
                         {
                            name: 'name1',
                            company: 'company1'
                        },
                        {
                            name: 'name2',
                            company: 'company2'
                        }]
                    },
                     {
                        id: 2,
                        name: 'twitter',
                        price: '500$',
                        publisher: {
                            name: 'twitter tran',
                            company: 'Canada'
                        },
                         nested:[]
                    },

                    {
                        id: 3,
                        name: 'google',
                        price: '300$',
                        publisher: {
                            name: 'tran',
                            company: 'Vietname'
                        },
                         nested:[
                         {
                            name: 'name3',
                            company: 'company3'
                        },
                        {
                            name: 'name4',
                            company: 'company4'
                        }]
                    }
                ]
            })
                            .directive("ngGridJsonExportExcel", function($timeout) {
                                return {
                                    restrict: "AE",
                                    scope: {
                                        data: "=",
                                        filename: "=?",
                                        reportFields: "=",
                                        nestedReportFields: "=",
                                        nestedDataProperty: "@"
                                    },
                                    link: function(scope, element) {
                                        scope.filename = !!scope.filename ? scope.filename : "export-excel";

                                        function generateFieldsAndHeaders(fieldsObject, fields, header) {
                                            _.forEach(fieldsObject, function(field, key) {
                                                if (!field || !key) {
                                                    throw new Error("error json report fields");
                                                }
                                                fields.push(key);
                                                header.push(field);
                                            });
                                            return {fields: fields, header: header};
                                        }
                                        var fieldsAndHeader = generateFieldsAndHeaders(scope.reportFields, [], []);
                                        var fields = fieldsAndHeader.fields, header = fieldsAndHeader.header;
                                        var nestedFieldsAndHeader = generateFieldsAndHeaders(scope.nestedReportFields, [], [""]);
                                        var nestedFields = nestedFieldsAndHeader.fields, nestedHeader = nestedFieldsAndHeader.header;
                                        function _convertToExcel(body, header) {
                                            return header + "\n" + body;
                                        }
                                        function _objectToString(object) {
                                            var output = "";
                                            _.forEach(object, function(value, key) {
                                                output += key + ":" + value + " ";
                                            });

                                            return "'" + output + "'";
                                        }
                                        function generateFieldValues(list, rowItems, dataItem) {
                                            _.forEach(list, function(field) {
                                                var data = "", fieldValue = "", curItem = null;
                                                if (field.indexOf(".")) {
                                                    field = field.split(".");
                                                    curItem = dataItem;
                                                    // deep access to obect property
                                                    _.forEach(field, function(prop) {
                                                        if (curItem !== null && curItem !== undefined) {
                                                            curItem = curItem[prop];
                                                        }
                                                    });
                                                    data = curItem;
                                                } else {
                                                    data = dataItem[field];
                                                }
                                                fieldValue = data !== null ? data : " ";
                                                if (fieldValue !== undefined && angular.isObject(fieldValue)) {
                                                    fieldValue = _objectToString(fieldValue);
                                                }
                                                rowItems.push(fieldValue);
                                            });
                                            return rowItems;
                                        }
                                        function _bodyData() {
                                            var body = "";

                                            _.forEach(scope.data, function(dataItem) {
                                                var rowItems = [];var nestedBody = "";
                                                rowItems = generateFieldValues(fields, rowItems, dataItem);
                                                //Nested Json body generation start 
                                                if (scope.nestedDataProperty && dataItem[scope.nestedDataProperty].length) {
                                                    _.forEach(dataItem[scope.nestedDataProperty], function(nestedDataItem) {
                                                        var nestedRowItems = [""];
                                                        nestedRowItems = generateFieldValues(nestedFields, nestedRowItems, nestedDataItem);
                                                        nestedBody += nestedRowItems.toString() + "\n";
                                                    });
                                                    var strData = _convertToExcel(nestedBody, nestedHeader);
                                                    body += rowItems.toString() + "\n" + strData;
                                                    ////Nested Json body generation end 
                                                } else {
                                                    body += rowItems.toString() + "\n";
                                                }
                                            });
                                            return body;
                                        }

                                        $timeout(function() {
                                            element.bind("click", function() {
                                                var bodyData = _bodyData();
                                                var strData = _convertToExcel(bodyData, header);
                                                var blob = new Blob([strData], {
                                                    type: "text/plain;charset=utf-8"
                                                });

                                                return saveAs(blob, [scope.filename + ".csv"]);
                                            });
                                        }, 1000);
                                    }
                                };
                            });

HTML code:

<button ng-json-export-excel data="dataList"  nested-data-property="nested" report-fields="{id: 'ID Heder', name: 'Name Header', price: 'Price Head',  'publisher.name': 'Publisher Head', 'publisher.company': 'Company Head'}" nested-report-fields="{name: 'Nested Name', company: 'Nested Company'}">Json Export</button>

Here is my plunker