javascript - 创建 csv 文件时编码符号
问题描述
在我的网页中,我可以将数据导出到一个 csv 文件中,我们可以在 Excel 中打开和读取该文件。但我注意到每个符号都喜欢ô
或Ø
不被支持。例如Ø
,我有,而不是Ø
。
我想阻止这种情况,但目前我做不到。
应用程序.js:
app.post("/exportLibelles", function(req, res) {
try {
dao.exportLibelle().then((value) => {
res.attachment(__dirname+'/ExportLibelle.csv');
res.status(200).send(value);
})
} catch (e) {
console.log(e);
}
})
exportLibelle 函数:
async exportLibelle() {
try {
let request = "SELECT * FROM PROFACE.dbo.ParametresMachines;"
let results = await sql.query(request);
return this.convertToCSV(JSON.stringify(results.recordset))
} catch (e) {
console.log(e);
}
}
convertToCSV(objArray) {
var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
var str = '', header = '';
for (var i = 0; i < array.length; i++) {
var line = '';
for (var index in array[i]) {
if (i == 0) {
if (header != '') {
header += ';'
}
header += index;
}
if (line != '') {
line += ';'
}
line += array[i][index];
}
str += line + '\r\n';
}
return (header + '\r\n' + str);
}
我尝试使用encodeURI()
或encodeURIComponent()
喜欢这样:
convertToCSV(objArray) {
var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
var str = '', header = '';
for (var i = 0; i < array.length; i++) {
var line = '';
for (var index in array[i]) {
if (i == 0) {
if (header != '') {
header += ';'
}
header += index;
}
if (line != '') {
line += ';'
}
line += array[i][index];
}
str += line + '\r\n';
}
let csv = header + '\r\n' + str;
csv = 'data:text/csv;charset=utf-8,%EF%BB%BF;' + csv;
return encodeURI(csv);
}
使用此代码,当我打开 csv 文件时,所有数据都在一行上,带有符号的单词看起来像这样Tampon%20GO%20%C3%98%203.8%20&%2012
,而不是Tampon GO Ø 3.8 & 12
.
解决方案
最近有一个非常相似的问题,并且能够通过将 utf-8 bom ( \ufeff
) 附加到 csv 字符串来解决它。只有使用该 Excel 才能正确解释它。
所以在你的情况下尝试:
convertToCSV(objArray) {
//...
return ('\ufeff'+ header + '\r\n' + str);
}
在你的控制器中:
dao.exportLibelle().then((value) => {
res.setHeader('Content-disposition', 'attachment; filename=ExportLibelle.csv');
res.set('Content-Type', 'text/csv');
res.status(200).send(value);
})
推荐阅读
- angular - 收到 websocket 消息后,如何从组件的 **ts** 文件中重新呈现角度组件视图?
- swift - 如何将类协议用作泛型?
- sql - 如何在 R 中为 SQL 编码特殊字符
- javascript - 路由更改后如何通过 API 调用更新数据和渲染新组件?
- xpath - 带有错误 xpath 的 IMPORTXML
- itext - iText 7 - 表格中的文本叠加,如何跨越所有可能的列
- git - 我们可以在命令行(作为 git shell 命令)获取 github 存储库的打开、关闭、合并的拉取请求的数量吗?
- jquery - onDragEnd 事件未在反应漂亮的 dnd 中触发
- python - asyncio Streamwriter 发送多个写入
- c - 如何将 struct 转换为 uint8_t(错误:请求转换为非标量类型)