【AngularJS】(指令)js表格数据导出.csv

主要代码

$scope.PrintTableToExcel = function (id){
    var $trs = $("#"+id).find("tr"),
        str = "";
    for (var i = 0; i < $trs.length; i++) {
        var $tds = $trs.eq(i).find("td,th");
        for (var j = 1; j < $tds.length-1; j++) {
            str += $tds.eq(j).text().trim() + ",";
        }
        str += "\n";
    };
    var blob = new Blob([str], {type: "text/plain;charset=utf-8"});
    //解决中文乱码问题
    blob =  new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
    var object_url = window.URL.createObjectURL(blob);

    var link = document.createElement("a");
    link.href = object_url;
    link.download =  "导出.csv";
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
};

angularjs--封装指令

<ng-table-csv for="mailTable" options="[0,11]" title="邮件记录"></ng-table-csv>
//for:必须,绑定下载table的id。    options:非必须,指定不可下载列,默认全部可下载。    title:非必须,下载文件的命名。
<table id="mailTable"></table>

AppDirectives.directive('ngTableCsv', ['$document', function () {
    return {
        restrict: 'EA',
        multiElement: true,
        template: '<button class="ui button mini icon basic teal"><i class="icon file excel outline"></i></button>',
        scope: {
            for: "@",
            options: "<",
            name: "@"
        },
        link: function (scope, element) {
            var id = scope.for || '';
            if(id){
                var getHmtl = function () {
                    var i = 0,
                        title = $("#"+id).find("tr").eq(0).find("td,th"),
                        html = '<div class="self_scroll popContent csv">';
                    scope.options = scope.options || [];
                    for (; i < title.length; i++) {
                        if(scope.options.indexOf(i) == -1){
                            let text = title[i].innerText;
                            if(text){
                                html += '<div class="ui checkbox" style="width: 100%;" title="' + text + '">' +
                                    '<input i="' + i + '" type="checkbox" tabindex="0" class="hidden" checked/>' +
                                    '<label>' + text + '</label>' +
                                    '</div>';
                            };
                        };
                    };
                    html += '<button class="ui button teal" id="toCsv" style="width: 100%;padding: 7px 10px;margin: 0;">CSV</button></div>';
                    return html;
                };
                var option = {
                    className: {
                        popup: "ui popup colPop"
                    },
                    position: "right center",
                    on: "click",
                    html: getHmtl(),
                    onCreate: function ($module, popup) {
                        $(this).html(getHmtl());
                        $(".colPop .ui.checkbox").checkbox();
                        //导出
                        $("#toCsv").click(function (){
                            var $this = $('.popContent.csv>.checkbox'),
                                $trs = $("#"+id).find("tr"),
                                checked = $this.find("input:checked"),
                                index = [],
                                str = "";
                            angular.forEach(checked, function (d) {
                                index.push($(d).attr('i'));
                            });
                            for (var i = 0; i < $trs.length; i++) {
                                var $tds = $trs.eq(i).find("td,th");
                                for (var j = 0; j < $tds.length; j++) {
                                    if(index.indexOf(j) != -1){
                                        let text = $tds.eq(j).text().trim();
                                        //csv格式如果有逗号,整体用双引号括起来;如果里面还有双引号就替换成两个双引号
                                        if(text.indexOf(",") != -1 || text.indexOf("\n") != -1){
                                            text = text.replace(/\"/g, '\"\"');
                                            text = "\""+text+"\"";
                                        };
                                        str += text;
                                        if(indexlast > j) str += ",";
                                    };
                                }
                                str += "\n";
                            };
                            var blob = new Blob([str], {type: "text/plain;charset=utf-8"});
                            //解决中文乱码问题
                            blob =  new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
                            var object_url = window.URL.createObjectURL(blob);
                            var link = document.createElement("a");
                            link.href = object_url;
                            link.download = (scope.name || "表格数据")+".csv";
                            document.body.appendChild(link);
                            link.click();
                            document.body.removeChild(link);
                        });
                    }
                };
                element.popup(option);
            };
        }
    }
}]);

2020-04-27

今天发现问题:如果table中内容包含逗号/换行时,下载csv打开后样式全部错乱。

解决方法如下:

//csv格式如果有逗号,整体用双引号括起来;如果里面还有双引号就替换成两个双引号
if(text.indexOf(",") != -1 || text.indexOf("\n") != -1){
    text = text.replace(/\"/g, '\"\"');
    text = "\""+text+"\"";
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值