阻止Excel自动将某些文本值转换为日期

621

请问是否有一种标记可以添加到我的csv文件中的某个字段,使得Excel不会尝试将其转换为日期格式?

我正在尝试从我的应用程序写入一个.csv文件,其中一个值看起来非常像日期,因此Excel自动将它从文本转换为日期格式。我尝试将所有文本字段(包括看起来像日期的字段)放在双引号内,但这没有任何效果。


146
当一个拥有1万个用户名的文件中出现一个名为“april25”的用户名时,它会被转换成日期格式,最终处理成“apr-25”,导致了“未找到用户名”的错误。这是因为你没有预料到Excel会将一个单一的值转换为日期,而在文件的前4000条记录中保留其余文本。多么糟糕的CSV读取代码啊!实际上,它不应该根据前X条记录来猜测类型并坚持使用吗?或者将所有内容都保留为文本。如果我想将其格式化为“通用”格式,我可以稍后选择。通过从一开始就假定为“通用”格式,它可能会导致文本数据损坏。 - Triynko
104
我认为Excel的这种行为是一个严重的缺陷。那么,对于所有没有奢侈改变CSV文件内容的人怎么办呢?或者对于在对CSV文件做了许多其他更改之后才意识到这个问题的人怎么办呢?这使得使用Excel处理CSV文件变得非常混乱。 - robguinness
你是否正在使用DatatableJS?因为我已经知道如何使用该API来完成这个任务。如果你需要,可以在这里找到它:https://dev59.com/LIDba4cB1Zd3GeqPDFqk#36142043 - Richard Rebeco
17
对于我们这些知道该怎么做的人来说,使用文件->打开->导入这些解决方案还不错,但对于那些不了解如何从应用程序/内部/浏览文件系统的全球其它99.5%的人来说,这是无用的。他们看到一个文件,想要使用它就双击它即可。我花费了25年时间教授人们如何使用办公应用程序并编写生成所述办公应用程序数据的代码,但使用/应用程序/查找要使用的文件对于几乎所有人来说都是完全超出了他们的理解能力。 - user2624417
我也遇到了这个问题。可以肯定的是 Excel 不是为开发人员设计的。我正在寻找替代方案。 - PathToLife
显示剩余4条评论
37个回答

-1

如果你在字段的开头放一个倒引号,它会被解释为文本。

例子: 25/12/2008 变成 '25/12/2008

在导入时,你也可以选择字段类型。


11
我不希望我的数据开头有一个'。 - user16324
30
“仅在直接输入Excel中起作用,但在CSV中不起作用 - 导入后在Excel单元格中会有额外的'字符。” - Tomas

-1

另一种方法:

将要更改的列的格式转换为“文本”。选择要保留的所有单元格,复制。在未取消选定这些列的情况下,单击“编辑>粘贴特殊>作为值”

保存为CSV。请注意,这必须是您对该文件执行的最后一项操作,因为重新打开它时,它会将自己格式化为日期,因为单元格格式无法保存在CSV文件中。


-1
我编写了这个VBA宏,基本上是在粘贴数字之前将输出范围格式化为文本。当我想要粘贴像8/11、23/6、1/3等值时,它对我来说完美地工作,而不会被Excel解释为日期。
Sub PasteAsText()
' Created by Lars-Erik Sørbotten, 2017-09-17
Call CreateSheetBackup
    
Columns(ActiveCell.Column).NumberFormat = "@"
    
Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard

ActiveCell.PasteSpecial

End Sub

我非常想知道这个方法是否也适用于其他人。我已经寻找解决这个问题的方法有一段时间了,但是我没有看到一个快速的VBA解决方案,而不需要在输入文本前插入'。这段代码保留了数据的原始形式。


-1

如果你正在使用Javascript并尝试上传带有单元格值Martin18或任何带有数字的字符串,它会在JSON中显示一些日期值。

解决方案:

      const bstr = event.target.result;
      const wb = XLSX.read(bstr, { type: 'string', raw: true });
      /* Get first worksheet */
      const wsname = wb.SheetNames[0];
      const ws = wb.Sheets[wsname];
      /* Convert array of arrays */
      const data = XLSX.utils.sheet_to_json(ws, { header: 1, defval: ''});

对我来说有效 :)
解决方案来源:https://github.com/SheetJS/sheetjs/issues/940


-2

在双引号中添加空格前缀解决了该问题!!

我在一个 .csv 文件列中有"7/8"这样的数据,而 MS-Excel 将其转换为日期格式 "07-Aug"。但是使用 "LibreOffice Calc" 没有问题。

为了解决这个问题,我只需在数字 7 前添加空格字符(即在 7 前加上空格),如" 7/8",就可以顺利解决。这已经在 Excel-2007 中进行测试过。


2
好的,但是这样单元格值中就会有一个空格。这可能不是问题,但是单元格开头/结尾处的不可见空格通常会引起问题... - Gary McGill

-4
SELECT CONCAT('\'',NOW(),'\''), firstname, lastname 
FROM your_table
INTO OUTFILE 'export.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '\"' 
LINES TERMINATED BY '\n'

16
请解释这段代码为什么能够解决所提出的问题,而不仅仅只是贴一堆代码。如果没有解释,那么这就不是一个答案。 - Martijn Pieters

-5
CSV - 逗号分隔值。只需通过文本编辑器创建/编辑,而不是xls/xlsx/exel。 在编辑时,您可以设置所需格式的日期,并保持其原样。 这是假定同一文件随后被程序自动处理的情况下。

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