【问题标题】:Angular JS - How to export Javascript Object to XLS file ?Angular JS - 如何将 Javascript 对象导出到 XLS 文件?
【发布时间】:2014-06-08 17:29:36
【问题描述】:

实际上,我的控制器中有一个对象,我只想将该对象导出为 .xls 或 .csv 文件。我使用了很多这样的方法:

HTML

<script src="https://rawgithub.com/eligrey/FileSaver.js/master/FileSaver.js" type="text/javascript" />
<div ng-controller="myCtrl">
    <button ng-click="exportData()">Export</button>
    <br />
    <div id="exportable">
    <table width="100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Email</th>
                <th>DoB</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="item in items">
                <td>{{item.name}}</td>
                <td>{{item.email}}</td>
                <td>{{item.dob | date:'MM/dd/yy'}}</td>
            </tr>
        </tbody>
    </table>
    </div>
</div>

Javascript

function myCtrl($scope) {
    $scope.exportData = function () {
        var blob = new Blob([document.getElementById('exportable').innerHTML], {
            type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
        });
        saveAs(blob, "Report.xls");
    };

    $scope.items = [{
        name: "John Smith",
        email: "j.smith@example.com",
        dob: "1985-10-10"
    }, {
        name: "Jane Smith",
        email: "jane.smith@example.com",
        dob: "1988-12-22"
    }, {
        name: "Jan Smith",
        email: "jan.smith@example.com",
        dob: "2010-01-02"
    }, {
        name: "Jake Smith",
        email: "jake.smith@exmaple.com",
        dob: "2009-03-21"
    }, {
        name: "Josh Smith",
        email: "josh@example.com",
        dob: "2011-12-12"
    }, {
        name: "Jessie Smith",
        email: "jess@example.com",
        dob: "2004-10-12"
    }]
}

但这不适用于分页表。有没有办法直接将对象(在本例中为 $scope.item )导出到文件 (xls,csv) ?

【问题讨论】:

    标签: javascript angularjs csv export xls


    【解决方案1】:

    是的,您可以使用带有 XLSX.js 库的 Alasql JavaScript 库来保存数据。这是一个例子:

    首先:在您的页面中包含两个 JavaScript 库:

    • alasql.min.js
    • xlsx.core.min.js

    第二:将代码中的 exportData() 函数替换为:

      $scope.exportData = function () {
          alasql('SELECT * INTO XLSX("john.xlsx",{headers:true}) FROM ?',[$scope.items]);
      };
    

    第三:对于 CSV 文件 - 只需使用 CSV() 函数:

      alasql('SELECT * INTO CSV("john.csv",{headers:true, separator:";"}) FROM ?',[$scope.items]);
    

    你可以和this example in jsFiddle一起玩。

    【讨论】:

    • 这是一个很棒的解决方案,非常感谢您的贡献。你有任何简单的解决方案来解析任何内部对象和集合吗?
    • 是的。您可以尝试 SEARCH 运算符,它类似于 SELECT,但它在 JSON 对象内部进行遍历(参见此处:github.com/agershun/alasql/wiki/Search
    • plunkr xlsx 文件在您尝试打开时出现问题。
    • 对于任何寻找 xlsx.core 分布的人:npmjs.com/package/js-xlsx
    【解决方案2】:

    如果您对 CSV 文件感到满意,那么ngCsv 模块就是您的最佳选择。您无需从 DOM 加载元素,而是直接导出数组。在这里您可以看到ngCsv 的示例。

    html:

     <h2>Export {{sample}}</h2>
      <div>
          <button type="button" ng-csv="getArray" filename="test.csv">Export</button>
    </div>
    

    和js:

    angular.module('csv', ['ngCsv']);
    
    function Main($scope) {
        $scope.sample = "Sample";
        $scope.getArray = [{a: 1, b:2}, {a:3, b:4}];                            
    }
    

    【讨论】:

    • 是的,当然。我使用了这个模块。但我的目标是将过滤后的对象直接导出到Excel 文件。
    • 好吧,您在问题中声明您需要导出到 .xls 或 .csv 文件。您始终可以将过滤器应用于数组(如果 .csv 仍然重要)。
    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多