使用JavaScript保留CSV文件中的前导零

3
我正在使用以下代码下载csv文件。
<a download="somedata.csv"  id='x'>Download CSV</a>
<script>
       var csv = '01'; //prints 1 in the cell, truncating leading zero
       var csv = "'"+01+"'"; //prints '01' in the cell, with single quote
       var csv = '"\""01"\""'; //prints "01" in the cell, with double quotes
       var a = document.getElementById('x');
       a.href='data:text/csv;base64,' + btoa(csv);
</script>

我需要在csv文件中打印带前导零的数字。目前我找到的解决方案是将数字用单引号或双引号括起来,以此将其转换为文本。但是这并不能解决问题,因为它也会在单元格中打印引号。

难道没有一种方法可以保留前导零,并在单元格中打印不带引号的数字吗?有什么建议吗?

编辑:我忘记在原帖中提到,我必须在Excel中打开csv文件。

var csv = "'01";   //prints '01 in the cell
var csv = '="01"'; //prints  01 in the cell, but the value is ="01"

有没有一种方法可以获取单元格的值并将其显示为01(而不是不同的显示和值)?


请说明您是如何确定前导零被剥离的方式。如果我没错的话,这个关键因素是问题的原因,但您在问题描述中没有包含它! - Lightness Races in Orbit
4个回答

3

我知道这是一个旧问题,但最近我遇到了这个问题,并通过在结尾添加零宽空格字符来解决它,就像这样:

var csv = '01' + String.fromCharCode(8203);

我希望这能帮助到遇到这个问题的其他人。


1
不幸的是,当在Excel 365中显示时,此代码会添加此字符:​ - Kristianne Nerona

2
<a download="somedata.csv"  id='x'>Download CSV</a>
<script>
       var csv = '01';
       var a = document.getElementById('x');
       a.href='data:text/csv;base64,' + btoa(csv);
</script>

这个代码本身就很好用。

我猜你是在Excel中查看CSV文件,它会根据自己的喜好和单元格默认值重新格式化数字。但是如果你在记事本中查看CSV文件,你会发现前导的0仍然存在于实际文件中。


2

您的代码实际上是有效的:

<a download="somedata.csv"  id='x'>Download CSV</a>
<script>
       var csv = '01';
       var a = document.getElementById('x');
       a.href='data:text/csv;base64,' + btoa(csv);
</script>

如果您在文本编辑器中打开此文件,则前导零将存在。

如果您特别针对Microsoft Excel进行目标定位,则可以添加一个前导单引号以保留前导零-尽管您仍需要进入每个单元格并按Enter键才能使其生效!

<a download="somedata.csv"  id='x'>Download CSV</a>
<script>
       var csv = "'01";
       var a = document.getElementById('x');
       a.href='data:text/csv;base64,' + btoa(csv);
</script>

更加复杂 - 但有效(仅适用于Excel)
<a download="somedata.csv"  id='x'>Download CSV</a>
<script>
       var csv = '="01"';
       var a = document.getElementById('x');
       a.href='data:text/csv;base64,' + btoa(csv);
</script>

具体来说,这将强制Excel将“单元格”内容视为文本,而不是将其格式化为数字。尽管如您所说,这会使文件无法移植。 - Lightness Races in Orbit
2
是的 - 我能想到的唯一解决方案是在Excel和其他地方都有一个标题行,然后是一行虚拟数据,这些数据都是字符串,然后是第三行的真实数据。Excel在确定数据类型时会向前查看几行,因此具有字符串的数据将强制格式化程序不选择数字类型。 - Fenton
到目前为止,我不认为有任何需要进行“修复”的必要。Excel 显示的值是正确的。前导零没有语义上的重要性。不幸的是,原帖作者并没有解释他或她为什么关心这个问题。 - Lightness Races in Orbit
我曾在一家养老金公司工作,该公司从其收购的其他公司迁移账户。在这种情况下,“0094569”和“094569”的区别非常重要。 - Fenton
必须解释的数据应该在CSV文件中用引号引起来;如果Excel无法正确解析,那就太愚蠢了。 - Lightness Races in Orbit

0
我在CSV文件中遇到了类似的问题,我发现在数字前添加一个制表符字符可以解决该问题。
let csv = '\t'+'01';

这将保留这个前导零,而 Excel 会忽略 TAB 键


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接