最近项目需求:导出数据为csv格式。

项目环境:后端Node

前端用a标签的download属性下载

<a class="btn btn-primary" ng-href="http://xxxx/order/exportOrders?year={{year}}&month={{month}}" download="list.csv">导出</a>

后端代码:


var json2csv = require('json2csv');
var async = require('async');
var iconv = require('iconv-lite');
async.map(orders,function(item,callback){
                    item = {
                        "投保人姓名":item.get("customerName"),
                        "投保时间":item.createdAt,
                        "身份证号":"=" + '"' + item.get("idCardNumber") + '"',
                        "手机号码":item.get("mobilePhoneNumber"),
                        "产品名称":item.get("productName"),
                        "状态":item.status,
                        "保单号": "=" + '"' + item.get("policyNumber") + '"'
                    };
                    callback(null,item);
            },function(err,results){
                console.log(results.length);
                var fields = ['投保人姓名','投保时间', '身份证号', '手机号码','产品名称','状态','保单号'];
                json2csv({ data: results, fields: fields}, function(err, csv) {
                    if (err) console.log(err);
                    console.log(csv);
                    var csvWithoutUndefined = csv.replace(/undefined/g,"");
                    console.log(csvWithoutUndefined);
                    if(month <10){
                        month = '0' + month;
                    }
                    //需要转换字符集
                    var newCsv = iconv.encode(csvWithoutUndefined, 'GBK'); // 转编码
                    res.header('Content-Type','text/csv;charset=UTF-8;name="orders-'+ year + month + '.csv"');
                    res.header('Content-Disposition','attachment; filename="orders-' + year + month + '.csv"');
                    res.send(newCsv);

                });
            });
        },

这里,用到了json2csv模块,npm install 一下即可,用作将json数据转换为csv格式数据。还有iconv-lite模块,是用来转换字符集的。

如果没有转换字符集,那么csv数据中的中文数据在excel中打开会出现乱码。

在定义item时:代码

"保单号": "=" + '"' + item.get("policyNumber") + '"';

在保单号的值之前加上“=”,是防止数字序列位数过长,会显示成科学计数法样式。

因为http响应中content-type默认的值是text/html,所以需要将其值改为‘text/csv’,name和filename属性时规定下载文件的文件名。

此时,我们只需将csv格式的数据send就可以了。

 

posted on 2016-06-22 17:22  ymwangel  阅读(632)  评论(0编辑  收藏  举报