JS 在 Excel 中构建了 CSV,在 # 后断开

Ror*_* L. 4 javascript csv excel special-characters

我正在通过 JavaScript 构建 CSV,一些单元格值包含主题标签和其他特殊字符。我特别注意到主题标签充当文件的硬停止。我无法在网上找到解决方案,也没有真正看到这个具体问题。我已尝试\uFEFF修复,但无济于事。下面是我用来构建 CSV 的函数。

export const buildCSV = (headers, data) => {
  if (!headers && !data) return;

  let csvContent = "data:text/csv;charset=UTF-8,";

  if (headers) {
    csvContent += headers.join(",") + "\r\n";
  }

  if (data) {
    data.forEach(row => {
      csvContent += row.join(",") + "\r\n";
    });
  }

  return encodeURI(csvContent);
};
Run Code Online (Sandbox Code Playgroud)

作为参考,当前,诸如 的值150 # content将显示为150,并且打开 CSV 时其余行将被截断。

预先感谢任何花时间提供答案的人!

Ror*_* L. 12

我设法通过进行此切换来解决该问题:

  const encodedURI = encodeURI(csvContent);
  const fixedEncodedURI = encodedURI.replaceAll('#', '%23');
  return fixedEncodedURI;
Run Code Online (Sandbox Code Playgroud)

在运行encodeURI 之前执行切换会导致结果为“%23”,而不是正确地将其转换回主题标签。根据MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#Description),该encodeURI函数不会转义主题标签(以及其他字符,但我没有注意到其他角色的问题)。手动编码后,下载并在 Excel 中打开后,它们会转换回主题标签。

TKoL 创建了一个小提琴,显示了如何使用encodeURIComponent来产生所需的输出。需要注意的是,当我尝试使用此功能时遇到问题时,必须对初始代码进行以下更改,否则将导致下载失败:

let csvContent = "";

other code...

return "data:text/csv;charset=utf-8," + encodeURIComponent(csvContent);
Run Code Online (Sandbox Code Playgroud)

感谢所有提供潜在解决方案的人!

  • 我制作了 [this jsfiddle](https://jsfiddle.net/1gxsp75o/1/) 来测试 `encodeURIComponent` (3认同)