使用Unicode字符通过JavaScript生成Excel CSV

ou6hu8tu  于 2023-03-20  发布在  Java
关注(0)|答案(3)|浏览(249)

我正在尝试使用javascript在客户端生成一个CSV文件。我使用了the answer on this stackoverflow question。我在内容中使用了unicode字符(在我的例子中是希伯来语字符)。
文件生成成功,但是当我在Excel中打开文件时-所有的Unicode字符都显示为有趣的字符。ASCII字符(英语和数字)显示得很好。
奇怪的是,如果我在记事本中打开文件,unicode字符显示良好,所以我猜这与Excel和我保存文件的方式有关。
有什么想法吗?

pu82cl6c

pu82cl6c1#

在科尔的注解和this question之后,解决我的问题的方法是在文件的开头添加BOM前缀(\uFEFF)。
以下是工作代码:

var csvContent = "...csv content...";
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", "data:text/csv;charset=utf-8,\uFEFF" + encodedUri);
link.setAttribute("download","report.csv");
link.click();
hzbexzde

hzbexzde2#

建议的解决方案并不适用于所有的浏览器,但我找到了一种方法,让它在所有的浏览器(Chrome,Firefox,IE11,甚至边缘,...不知道IE9-10,因为我没有访问它们了)。
我必须使用外部库来编码encoding.js,它与unicode配合得非常好(我可以在Excel中的CSV导出中看到我的独角兽表情符号)。
下面是代码

data = new TextEncoder('utf-16be').encode(csvContent);
  
// create a Blob object for the download
const blob = new Blob(['\uFEFF', data], {
  type: 'text/csv;charset=utf-8';
});

// if we're using IE/Edge, then use different download call
if (typeof navigator.msSaveOrOpenBlob === 'function') {
  navigator.msSaveOrOpenBlob(blob, filename);
} else {
  // the next code will generate a temp <a /> tag that you can trigger a hidden click for it to start downloading
  const link = document.createElement('a');
  const csvUrl = URL.createObjectURL(blob);

  link.textContent = 'download';
  link.href = csvUrl;
  link.setAttribute('download', filename);

  // set the visibility hidden so that there is no effect on your web-layout
  link.style.visibility = 'hidden';

  // finally we will append the anchor tag and remove it after clicking it
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

就是这样,它在IE / Edge / Chrome / Firefox中工作

nnsrf1az

nnsrf1az3#

在Node/Express服务器上,我尝试了Shay的答案,但我得到了一个错误,因为我的头中有无效字符。相反,我在回复正文的开头添加了\uFEFF,它起作用了。

app.get('/', function (req, res) {
    var csv = Papa.unparse(...);
    res.set({
       'Content-Type': 'text/csv; charset=UTF-8',
       'Content-Disposition': 'attachment; filename="file.csv"',
    });
    res.send('\uFEFF' + csv)
})

相关问题