How to export csv nodejs
嘿,我正在尝试从node.js导出csv(从mongodb中拉出数据)。 我已经用逗号和所有字符来提取和分离数据,但是现在我试图弄清楚如何实际发送它……我将此代码粘贴在路由文件中。 有关如何获取数据数组并将其直接发送给用户以根据要求进行下载的任何建议。
这是代码:(我尝试了代码底部的第二个功能)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | exports.downloadContacts = function(req, res) { async.waterfall([ function(callback) { var source = []; Friend.find({userId: req.signedCookies.userid}, function(err, friends) { if(err) {console.log('err with friends for download'); } else { var userMap = {}; var friendIds = friends.map(function (user) { userMap[user.friend_id] = user; return user.friend_id; }); console.log(friends); User.find({_id: {$in: friendIds}}, function(err, users) { if(err) {console.log(err); } else { for(var i = 0; i < users.length; i++) { console.log('users') //console.log(users[i]); source.push(users[i].firstNameTrue, users[i].lastNameTrue, users[i].emailTrue, users[i].phone, users[i].emailList, users[i].phoneList) } console.log(source); callback(null, source); } }); } }); } ], function(err, source) { var result = []; res.contentType('csv'); csv() .from(source) .on('data', function(data){ result.push(data.join()); }) .on('end', function(){ res.send(result.join(' ')); }); }); }; |
这是我所做的:
1 2 3 4 | var json2csv = require('json2csv'); var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes']; var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes']; var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames }); |
1 2 | res.attachment('filename.csv'); res.status(200).send(data); |
您是否尝试过将内容类型设置为" application / octet-stream",
1 2 | res.set('Content-Type', 'application/octet-stream'); res.send(<your data>); |
或简单地
1 | res.send(Buffer.from(<your data>)); |
表达send()文档。
基于@VierTD的大家好,您必须使用json2csv从mongodb数据构建csv数据
使用依赖更新Package.json
1 2 3 4 5 | "dependencies": { "mongodb":"^2.2.10", "json2csv":"*", "express":"*" } |
创建json2CSV对象,请记住这是映射您的文档(数据库表),因此"字段"上的名称必须与数据库表匹配,fieldNames取决于您,但也很重要,因为这些是CSV文件列名
1 2 3 4 | var json2csv = require('json2csv'); var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes']; var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes']; var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames }); |
发送CSV数据到客户端
1 2 | res.attachment('filename.csv'); res.status(200).send(data); |
此代码显示如何基于mongo db文档(数据库表)导出csv文件
我已经创建了一个非常简单的示例示例的github存储库,还在Mongo Lab网站上创建了一个包含虚拟数据的数据库,因此该代码将在您的计算机中立即运行。基于@VietTD答案!
如果您有兴趣测试此代码,只需记住更改以下几行
更改数据库URL(使用您自己的数据库,这是可行的,但这仅出于显示目的; D)
1 | var url = 'mongodb://admin:[email protected]:63946/misale_dev'; |
更改目标文档(或数据库表)
1 | var collection = db.collection('_dummy'); |
更改文档列(或数据库表的列字段)
1 | var fields = ['_id', 'JobID', 'LastApplied']; |
最后,为您设置CSV标题列名称以及CSV文件名
1 | var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE']; |
最后但并非最不重要的
1 | res.attachment('yourfilenamehere.csv'); |
请随时改进示例代码,我将不胜感激!或仅下载它并查看代码,它已经随数据库一起提供,因此易于理解和运行,在这种情况下,您不必关心整个代码,也许您会看到一些有趣的东西:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | // // EXPRESS JS SERVER INITI // var express = require('express') var app = express() // // MONGO DB INIT // var MongoClient = require('mongodb').MongoClient, assert = require('assert'); app.get('/', function (req, res) { var url = 'mongodb://admin:[email protected]:63946/misale_dev'; // // This function should be used for migrating a db table to a TBD format // var migrateMongoDBTable = function(db, callback) { // Get the documents collection console.log("Reading database records"); // Get the documents collection var collection = db.collection('_dummy'); // Find some documents //collection.find({'a': 3}).toArray(function(err, docs) { collection.find({}).toArray(function(err, docs) { assert.equal(err, null); //console.log(docs); //console.log('docs.length ---> ', docs.length); console.log('Creating CSV...'); //console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-='); var json2csv = require('json2csv'); var fields = ['_id', 'JobID', 'LastApplied']; var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE']; var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames }); //console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-='); // EXPORT FILE res.attachment('yourfilenamehere.csv'); res.status(200).send(data); callback(docs); }); }; // Use connect method to connect to the server MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("Connected successfully to server"); // // migrate db table to some format TBD // migrateMongoDBTable(db, function() { db.close(); }); }); }) app.listen(3000, function () { console.log('Example app listening on port 3000!') }) // Connection URL //var url = 'mongodb://localhost:27017/myproject'; |
谢谢!
我不确定您要问的是什么,但我认为可以通过设置Content Disposition标头来解决您的问题。看一下另一个SO问题的响应:https://stackoverflow.com/a/7288883/2320243。
Express-csv是一个很棒的模块,用于将csv内容写入要从node.js服务器流传输的内容,该内容将作为对客户端的响应发送(并作为文件下载)。很好用。
1 2 3 4 5 6 | app.get('/', function(req, res) { res.csv([ ["a","b","c"] , ["d","e","f"] ]); }); |
的文档:https://www.npmjs.com/package/express-csv
传递对象时,需要显式地添加标题(如果需要)。这是我使用npm mysql的示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | router.route('/api/report') .get(function(req, res) { query = connection.query('select * from table where table_id=1;', function(err, rows, fields) { if (err) { res.send(err); } var headers = {}; for (key in rows[0]) { headers[key] = key; } rows.unshift(headers); res.csv(rows); }); }); |
自编写最高投票的答案以来,json2csv软件包已更新,新版本的语法略有不同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var { Parser } = require('json2csv') const fields = [{ label: 'header 1', value: 'field1_name' }, { label: 'header 2', value: 'field2_name' }] const json2csv = new Parser({ fields: fields }) try { const csv = json2csv.parse(data) res.attachment('data.csv') res.status(200).send(csv) } catch (error) { console.log('error:', error.message) res.status(500).send(error.message) } |
res.attachment是函数而不是属性。需要删除等号才能正常工作。
使用json2csv库,您可以从mongodb数据导出csv。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | const json2csv = require('json2csv').parse; //For unique file name const dateTime = new Date().toISOString().slice(-24).replace(/\D/g, '').slice(0, 14); const filePath = path.join(__dirname,"../../../","public","exports","csv-" + dateTime +".csv"); let csv; const student = await req.db.collection('Student').find({}).toArray(); // Logging student // [{id:1,name:"John",country:"USA"},{id:1,name:"Ronny",country:"Germany"}] const fields = ['id','name','country']; try { csv = json2csv(booking_info, {fields}); } catch (err) { return res.status(500).json({err}); } fs.writeFile(filePath, csv, function (err) { if (err) { return res.json(err).status(500); } else { setTimeout(function () { fs.unlink(filePath, function (err) { // delete file after 30 sec if (err) { console.error(err); } console.log('File has been Deleted'); }); }, 30000); res.download(filePath); } }) |
我在此http://nikgrozev.com/2017/05/10/mongo-query-to-CSV-download-expressjs/找到了解决方案
关键词
stream the output to the HTTP response