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

Stop Excel from automatically converting certain text values to dates

提问人: 提问时间:10/3/2008 最后编辑:JimmyPena 更新时间:2/21/2023 访问量:627377

问:

有没有人碰巧知道我是否可以将某个字段的令牌添加到我的 csv 中,以便 Excel 不会尝试将其转换为日期?

我正在尝试从我的应用程序编写一个 .csv 文件,其中一个值恰好看起来像一个日期,Excel 会自动将其从文本转换为日期。我尝试将我所有的文本字段(包括看起来像日期的文本字段)放在双引号内,但这没有效果。

Excel CSV 导入

评论

146赞 Triynko 4/16/2011
是的,就像当一个有 10000 个用户名的文件有一个像“April25”这样的文件时,它被转换为日期,并最终被处理为“Apr-25”,导致“找不到用户名”错误,因为你没想到 Excel 会将单个值转换为日期,将 4000 条记录转换为文件,同时保留其余文本。多么蹩脚的CSV读码;真的,难道不应该根据前 X 条记录猜测类型并坚持下去吗?或者保留所有文本。如果我希望将其格式化为“常规”,我可以稍后选择它。通过从一开始就假设“一般”,它有文本数据损坏的风险。
0赞 Avatar 12/3/2012
我在进行复制和粘贴时遇到了问题。对于所有搜索解决方案的人,请选择目标列,将其设置为字符串/文本格式,然后复制源并使用“仅值”进行特殊粘贴(右键单击)。保留值,不设置日期格式。
104赞 robguinness 1/16/2013
我只想补充一点,我认为 Excel 的这种行为是一个严重的缺陷。那么在导入到 Excel 之前没有奢侈更改 csv 文件内容的人呢?或者,那些在对 CSV 文件进行许多其他更改后才意识到这个问题的人呢?它使在 Excel 中处理 CSV 文件变得一团糟。
0赞 Richard Rebeco 3/22/2016
你在用DatatableJS吗?因为我已经知道如何用那个 API 来做到这一点。如果你需要这个,你可以在这里找到它:stackoverflow.com/a/36142043/4241058
17赞 user2624417 3/31/2017
所有这些使用 File -> Open -> Import 的解决方案对我们来说都很好,因为我们知道我们在做什么,但对于世界上其他 99.5% 的人来说,它毫无用处,他们不了解从应用程序内部导航文件系统。他们看到一个文件,要使用它,他们双击它。我花了 25 年时间教人们如何使用办公应用程序并编写为所述办公应用程序生成数据的代码,并且使用 /application/ 查找要使用的文件几乎超出了所有人的范围。

答:

-1赞 Harley Holcombe 10/3/2008 #1

如果在字段的开头放置一个倒置的逗号,它将被解释为文本。

示例:变为25/12/2008'25/12/2008

您还可以在导入时选择字段类型。

评论

11赞 10/4/2008
我不想在数据的开头加上 '。
30赞 Tomas 12/29/2011
-1.“仅在直接在excel中输入时有效,但在CSV中不起作用 - 导入后excel单元格中会有额外的”字符。
398赞 Jarod Elliott 10/3/2008 #2

我发现在双引号前加上“=”将完成您想要的。它强制数据为文本。

例如。=“2008-10-03”,=“更多文字”

编辑(根据其他帖子):由于 Jeffiekins 指出的 Excel 2007 错误,应该使用 Andrew 提出的解决方案"=""2008-10-03"""

评论

13赞 10/3/2008
我接受这个答案,因为 1) 我的 csv 文件只会被 Excel 使用,2) 这是用于会计的,不能在开头有 ',以及 3) 我不希望他们必须进行导入。我只想让他们打开csv。
7赞 Tomas 12/30/2011
伟大!但是由于 Excel 2007 错误,请使用 Andrew 提出的解决方案:.更新了帖子。"=""2008-10-03"""
9赞 lokori 10/8/2014
这样做的原因是,当 Excel 看到字符“=”时,它决定计算它后面的表达式。在本例中,表达式只是一个字符串文本,字符串文本的值是字符串的内容。因此,引号神奇地消失了。您可以输入 =1+2+3 并在 CSV 导入后获得值 6。公式本身在导入过程中不会被销毁。
9赞 ACV 1/9/2018
这种方法有一个很大的问题 - 如果你在excel中打开文件并编辑,然后保存并再次打开所有这些“ 消失
4赞 Andrew Newby 1/6/2021
疯狂的是,在这个时代,我们不能只是告诉 Excel 不要更改日期格式。这给我的 CSV 文件带来的悲伤是疯狂的。不得不使用肮脏的工作方式不应该是一个解决方案。它充其量只是一个黑客攻击,但 M$ 应该伸出手指并实际修复他们的软件:(="xxx"
8赞 DocMax 10/3/2008 #3

(假设 Excel 2003...)

使用“文本到列向导”时,在步骤 3 中,您可以指定每列的数据类型。单击预览中的列,然后将行为异常的列从“常规”更改为“文本”。

评论

8赞 10/3/2008
如果我可以强制用户使用导入过程,这是一个很好的选择。
0赞 Chonez 3/14/2014
这实际上无济于事,因为无论如何导出到 .csv 时,TEXT 列中的数字都会转换为 NUMBERS......
29赞 Jeffiekins 12/11/2010 #4

警告:Excel '07(至少)有一个(其他)错误:如果字段的内容中有一个逗号,它不会正确解析 =“field, contents”,而是将逗号后面的所有内容放入以下字段中,而不管引号如何。

我发现唯一有效的解决方法是在字段内容包含逗号时消除 =。

这可能意味着有些字段不可能在Excel中完全“正确”地表示,但到目前为止,我相信没有人会感到惊讶。

评论

0赞 Sunny88 1/27/2012
我刚刚在 excel 2007 中测试了它,它对我来说工作正常。但是,如果引号前有一个前导空格,则它无法正确解析逗号。
10赞 Peter Stephens 4/12/2012
根据 RFC 4180,这似乎不是一个错误。引用字段的正确方法是引用整个字段,然后双引内部引用。所以 “=”“字段, content”“” tools.ietf.org/html/rfc4180
2赞 Pacerier 5/5/2015
@PeterStephens,如果里面有,这是行不通的。例如field, content""=""field, co""ntent"""
1赞 ErikE 11/20/2015
@Pacerier 可能嵌入的引号必须加双引号,变成 .""""
0赞 Tao 12/21/2019
我可以确认@ErikE的建议是正确的。对于具有 value 的字段,如果您选择使用此技巧(而不是将其保留为文件中的 - excel 已经将其视为文本),那么面向 Excel 的 CSV 文件中的最终正确字符串最终为 。1"2"1""2""=""1""""2"""
107赞 Andrew Ferk 5/17/2011 #5

根据 Jarod 的解决方案和 Jeffiekins 提出的问题,您可以修改

"May 16, 2011"

"=""May 16, 2011"""

评论

6赞 steve 3/31/2014
如果文本长度超过特定长度,则在 Excel 2010 中不起作用。
1赞 Pacerier 5/5/2015
@Andrew,如果您需要在日期之间的任何位置使用值,则此“修复”将导致问题。"
11赞 d512 12/18/2015
仅供参考,如果您保存 Excel 文件,= 会消失,下次打开时您又回到了原点。
1赞 tbc0 9/27/2017
我的经验与史蒂夫和 d512 都不匹配。它在Excel 2013中传入的.csv中对我有用,并且在另存为.xlsx后它不会恢复。任何人都可以轻松使用此行数据进行测试:“806676”,“None”,“41”,“=”“”May 16, 2011“”“,”100.00“,”False”
1赞 NetMage 1/30/2019
@tbc0 尝试,您将看到保存并重新加载丢失了连字符文本。"806676","None","41","=""05-16-2011""","100.00","False"
11赞 Dan 1/29/2013 #6

这是我们在生成csv文件时使用的简单方法,它确实会稍微改变值,因此它并不适合所有应用程序:

在 csv 中的所有值前面添加一个空格

excel 将从“1”、“2.3” 和 “-2.9e4” 等数字中剥离此空间,但将保留在“01/10/1993”等日期和“TRUE”等布尔值上,从而阻止它们转换为 excel 的内部数据类型。

它还可以阻止在读入时使用双引号,因此即使像“3.1415”这样的文本,也可以使 csv 中的文本保持不变,方法是用双引号将其括起来,并在整个字符串前面加上一个空格,即(使用单引号显示您将键入的内容)' “3.1415”'。然后在 excel 中,您始终拥有原始字符串,只是它被双引号括起来并在前面加上一个空格,因此您需要在任何公式等中考虑这些字符串。

评论

0赞 jacklin 2/1/2013
这对我有用。我有一些值,如 1-1-1,可以自动转换为日期。如前所述,空间会转移,因此值会发生变化,但是我在解析时会对其进行条带处理,因此对我来说这没什么大不了的。
0赞 Doin 7/29/2019
空格不再用于防止日期解释或前导零的剥离。但是你可以改用一个不间断空格 - 这将起作用。"\xA0"
72赞 rainerbit 2/21/2013 #7

我遇到了类似的问题,这是无需编辑csv文件内容即可帮助我的解决方法:

如果您可以灵活地将文件命名为“.csv”以外的其他名称,则可以使用“.txt”扩展名命名它,例如“Myfile.txt”或“Myfile.csv.txt”。然后,当您在Excel中打开它时(不是通过拖放,而是使用文件>打开或最近使用的文件列表),Excel将为您提供“文本导入向导”。

在向导的第一页中,选择“分隔”作为文件类型。

在向导的第二页中,选择“,”作为分隔符,如果值用引号括起来,则还要选择文本限定符

在第三页中,单独选择每一列,并为每列分配类型“文本”而不是“常规”,以防止 Excel 弄乱您的数据。

希望这对您或有类似问题的人有所帮助!

评论

4赞 rainerbit 2/21/2013
哦,顺便说一句,我不是第一个发现这一点的人。risingline.com/use-excel-read-csv-without-reformatting.php该网页还提供了有用的说明,您可以按住 Shift 键单击向导第三页中的列,以在为每个列分配类型“文本”之前将它们全部选中。
0赞 Michael 2/11/2017
这可能适用于日期值,但似乎不适用于 excel 解释为数字的东西。如果你的字符串都是数字和逗号,那么“文本”格式将是科学数字格式。
4赞 Kevin 8/25/2017
这对我来说非常有效,除了将其重命名为 .txt 之外,不涉及对我的文件进行任何更改。谢谢。
1赞 nachocab 10/24/2019
不幸的是,Excel 只允许您对前 6 列执行此操作。如果需要更多,更好的方法是复制 csv 的内容,创建并清空 excel 文件,选择所有列/行并将类型设置为文本,然后粘贴内容并使用数据 |文本到列
0赞 Rob 1/29/2020
这是最佳解决方案,应标记为答案。
182赞 frIT 2/27/2013 #8

我知道这是一个老问题,但问题不会很快消失。CSV 文件很容易从大多数编程语言生成,相当小,使用纯文本编辑器在紧缩中人类可读,并且无处不在。

问题不仅在于文本字段中的日期,而且任何数字也会从文本转换为数字。有几个例子是有问题的:

  • 邮政编码
  • 电话号码
  • 政府身份证号码

有时可以以一个或多个零 (0) 开头,当转换为数字时会被丢弃。或者,该值包含可能与数学运算符混淆的字符(如日期:/、-)。

我能想到的两种情况是,如前所述,“前缀 =”解决方案可能并不理想,它们是

  • 文件可能被导入到 MS Excel 以外的程序中(我想到了 MS Word 的邮件合并功能),
  • 人类的可读性可能很重要。

我的技巧可以解决这个问题

如果在值中预加/附加非数字和/或非日期字符,则该值将被识别为文本而不是转换。非打印字符会很好,因为它不会改变显示的值。但是,普通的旧空格字符(\s,ASCII 32)不适用于此,因为它被 Excel 砍掉,然后该值仍被转换。但是还有其他各种打印和非打印空格字符可以很好地工作。然而,最简单的方法是附加(添加)简单的制表符(\t,ASCII 9)。

这种方法的优点:

  • 可通过键盘或易于记忆的 ASCII 代码 (9) 提供,
  • 它不打扰进口,
  • 通常不会打扰邮件合并结果(取决于模板布局 - 但通常它只是在行尾添加一个宽空间)。(但是,如果这是一个问题,请查看其他字符,例如零宽度空格(ZWSP,Unicode U+200B)
  • 在记事本(等)中查看CSV时不是很大的障碍,
  • 并且可以通过在Excel(或记事本等)中查找/替换来删除。
  • 您无需导入 CSV,只需双击即可在 Excel 中打开 CSV。

如果出于某种原因不想使用该选项卡,请在 Unicode 表中查找其他合适的内容。

另一种选择

可能是生成 XML 文件,较新的 MS Excel 版本也接受某种格式导入,并且允许更多类似于 .XLS 格式的选项,但我没有这方面的经验。

所以有多种选择。根据您的要求/应用,一个可能比另一个更好。


加法

需要说的是,较新版本(2013+)的MS Excel不再以电子表格格式打开CSV - 工作流程中的又一个减速带使Excel的用处降低......至少,存在绕过它的说明。例如,请参阅此Stackoverflow:如何在Excel 2013中正确显示.csv文件?

评论

7赞 Morten Jensen 5/4/2015
在添加到我的分离字符后,我得到了正确的前导零......该死的 MS Office,为什么我必须花 2 分钟多的时间才能弄清楚?\t;
2赞 ocroquette 2/24/2016
在所有值的末尾添加 \t 确实可以解决问题。这是一种骇人听闻的解决方法,但在实践中它工作正常。我更喜欢这个,而不是具有相等的“=”的公式技巧,因为前者可能很难在其他工具中使用。
3赞 Asaf 4/11/2016
没有足够的赞成票可以表达我对你的感激之情。在记事本++中搜索和替换“,”,“到”\t,\t“(也适用于第一列和最后一列)就像一个魅力。谢谢。
1赞 6/24/2016
在我的MySQL查询中(通过PHP进行CSV输出),我使用了CONCAT('\t', )。也做到了。谢谢!column_name
1赞 Heath Raftery 4/25/2018
好主意。唉,Numbers 比 Excel 更“聪明”一点,并且不会落入标签技巧。我能想到的最好的选择是领先,因为它有点好理解,而且不会太分散注意力......但看不见会更好。'
4赞 GW4 6/13/2013 #9

本周我遇到了这个约定,这似乎是一个很好的方法,但我在任何地方都找不到它被引用。有人熟悉吗?你能引用它的来源吗?我没有找几个小时,但希望有人能认识到这种方法。

示例 1:=(“012345678905”) 显示为012345678905

示例 2:=(“1954-12-12”) 显示为 1954-12-12,而不是 12/12/1954

8赞 Chris 8/27/2013 #10

这是我知道如何在不弄乱文件本身的情况下完成此操作的唯一方法。像往常一样,我通过在桌子上敲打几个小时来学习这一点。

将 .csv 文件扩展名更改为 .txt;这将阻止 Excel 在打开文件时自动转换文件。我的做法是这样的:将 Excel 打开到一个空白工作表,关闭空白工作表,然后 File => Open 并选择扩展名为 .txt 的文件。这会强制 Excel 打开“文本导入向导”,它会询问您有关您希望它如何解释文件的问题。首先,选择分隔符(逗号、制表符等),然后(这是重要的部分)选择一组列的列并选择格式。如果您确切地想要文件中的内容,请选择“文本”,Excel 将显示分隔符之间的内容。

评论

0赞 Jonathan Leffler 3/4/2015
这在 2015 年 3 月 03 日使用 Excel for Mac 2011(版本 14.4.8 150116)时效果很好,处理 SO 问题 awk 中的数据 - 避免重新格式化类似日期的值,问题出在 Excel 而不是 ,尽管有问题标题。awk
17赞 Rob Stockley 2/7/2014 #11

在 Excel 2010 中,打开一个新工作表。 在“数据”功能区上,单击“从文本中获取外部数据”。 选择您的CSV文件,然后单击“打开”。 点击“下一步”。 取消选中“Tab”,在“逗号”旁边打勾,然后单击“下一步”。 单击第一列上的任意位置。 在按住 shift 键的同时,拖动滑块,直到您可以单击最后一列,然后松开 shift 键。 单击“文本”单选按钮,然后单击“完成”

所有列都将作为文本导入,就像它们在 CSV 文件中一样。

评论

1赞 Milacay 3/6/2014
我遇到了同样的问题,但仔细遵循@Rob的指示会很完美!谢谢
2赞 CodeManX 6/27/2016
很遗憾,文本数据助手不支持多行单元格。如果遇到这样的多行文本,它会将第一行之后的所有行写入新行,从而中断整个导入。仅当您通过双击打开 CSV 文件时,它才会正确解释换行符。该死的,你Microsoft......
1赞 Baracus 3/22/2018
不幸的是,这并不能解决 Excel 的随机格式“帮助”问题 - 文本 DEC1 仍更改为 Dec-01 日期。与 YYYY-MM-DD 的文本切换为 DD/MM/YYYY 相同。:(
4赞 Harry Duong 2/20/2014 #12

嗨,我有同样的问题,

我编写此 vbscipt 以创建另一个 CSV 文件。新的 CSV 文件在每个字段的字体中都有一个空格,因此 excel 会将其理解为文本。

因此,使用以下代码(例如 Modify_CSV.vbs)创建一个 .vbs 文件,保存并关闭它。将您的原始文件拖放到您的 vbscript 文件中。它将在同一位置创建一个带有“SPACE_ADDED”文件名的新文件。

Set objArgs = WScript.Arguments

Set objFso = createobject("scripting.filesystemobject")

dim objTextFile
dim arrStr ' an array to hold the text content
dim sLine  ' holding text to write to new file

'Looping through all dropped file
For t = 0 to objArgs.Count - 1
    ' Input Path
    inPath = objFso.GetFile(wscript.arguments.item(t))

    ' OutPut Path
    outPath = replace(inPath, objFso.GetFileName(inPath), left(objFso.GetFileName(inPath), InStrRev(objFso.GetFileName(inPath),".") - 1) & "_SPACE_ADDED.csv")

    ' Read the file
    set objTextFile = objFso.OpenTextFile(inPath)


    'Now Creating the file can overwrite exiting file
    set aNewFile = objFso.CreateTextFile(outPath, True) 
    aNewFile.Close  

    'Open the file to appending data
    set aNewFile = objFso.OpenTextFile(outPath, 8) '2=Open for writing 8 for appending

    ' Reading data and writing it to new file
    Do while NOT objTextFile.AtEndOfStream
        arrStr = split(objTextFile.ReadLine,",")

        sLine = ""  'Clear previous data

        For i=lbound(arrStr) to ubound(arrStr)
            sLine = sLine + " " + arrStr(i) + ","
        Next

        'Writing data to new file
        aNewFile.WriteLine left(sLine, len(sLine)-1) 'Get rid of that extra comma from the loop


    Loop

    'Closing new file
    aNewFile.Close  

Next ' This is for next file

set aNewFile=nothing
set objFso = nothing
set objArgs = nothing
26赞 Colin Pear 4/21/2014 #13

在 C# 中创建要写入我的 CSV 文件的字符串时,我必须以这种方式格式化它:

"=\"" + myVariable + "\""

评论

2赞 Vieenay Siingh 3/27/2016
这在 Rails 中也为我唤醒了。谢谢
3赞 Shoyo 3/17/2017
也适用于 Java
0赞 wobsoriano 7/26/2019
使用 Papa Parse 在 JavaScript 中为我工作。
0赞 Richard 5/6/2014 #14

好的,在Excel 2003到2007中找到了一种简单的方法来执行此操作。打开一个空白的 xls 工作簿。然后转到“数据”菜单,导入外部数据。选择您的 csv 文件。浏览向导,然后在“列数据格式”中选择需要强制为“文本”的任何列。这会将整个列导入为文本格式,防止 Excel 尝试将任何特定单元格视为日期。

2赞 syandras 5/8/2014 #15

它不是 Excel。Windows 确实可以识别公式、数据作为日期并自动更正。您必须更改 Windows 设置。

“控制面板”(->“切换到经典视图”)->“区域和语言 选项“ -> 选项卡 ”区域选项“ -> ”自定义...“ ->选项卡 ”数字“ -> 和 然后根据需要更改符号。

http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html

它将在您的计算机上运行,如果这些设置未更改,例如在客户的计算机上,他们将看到日期而不是数据。

评论

0赞 Christopher Hamkins 7/21/2022
这解决不了任何问题。也许它保护了原始的类似日期的字段,但它会让其他人面临同样的问题。
2赞 cliffclof 3/31/2015 #16

在不修改 csv 文件的情况下,您可以:

  1. 将excel的“设置单元格格式”选项更改为“文本”
  2. 然后使用“文本导入向导”定义csv单元格。
  3. 导入后,删除该数据
  4. 然后粘贴为纯文本

Excel 将正确地格式化您的 CSV 单元格并将其分隔为文本格式,忽略自动日期格式。

有点愚蠢的解决方法,但它胜过在导入之前修改 csv 数据。安迪·贝尔德(Andy Baird)和理查德(Richard)在某种程度上回避了这种方法,但错过了几个重要的步骤。

2赞 flatbeat 4/17/2015 #17

我知道这是一个旧线程。对于像我这样的人,他们仍然有这个问题,通过 PowerShell COM 对象使用 Office 2013 可以使用 opentext 方法。问题在于这种方法有许多参数,有时是相互排斥的。要解决此问题,您可以使用本文中介绍的方法。 一个例子是invoke-namedparameter

$ex = New-Object -com "Excel.Application"
$ex.visible = $true
$csv = "path\to\your\csv.csv"
Invoke-NamedParameter ($ex.workbooks) "opentext" @{"filename"=$csv; "Semicolon"= $true}

不幸的是,我刚刚发现,当单元格包含换行符时,这种方法以某种方式破坏了 CSV 解析。CSV支持这一点,但Microsoft的实现似乎存在错误。 此外,它不知何故没有检测到特定于德语的字符。赋予它正确的文化并没有改变这种行为。所有文件(CSV 和脚本)都以 utf8 编码保存。 首先,我编写了以下代码来逐个单元格插入 CSV。

$ex = New-Object -com "Excel.Application"
$ex.visible = $true;
$csv = "path\to\your\csv.csv";
$ex.workbooks.add();
$ex.activeWorkbook.activeSheet.Cells.NumberFormat = "@";
$data = import-csv $csv -encoding utf8 -delimiter ";"; 
$row = 1; 
$data | %{ $obj = $_; $col = 1; $_.psobject.properties.Name |%{if($row -eq1){$ex.ActiveWorkbook.activeSheet.Cells.item($row,$col).Value2= $_ };$ex.ActiveWorkbook.activeSheet.Cells.item($row+1,$col).Value2 =$obj.$_; $col++ }; $row++;}

但这非常慢,这就是我寻找替代方案的原因。显然,Excel允许您使用矩阵设置一系列单元格的值。因此,我使用这篇博客中的算法来转换多阵列中的 CSV。

function csvToExcel($csv,$delimiter){
     $a = New-Object -com "Excel.Application"
     $a.visible = $true
     
    $a.workbooks.add()
     $a.activeWorkbook.activeSheet.Cells.NumberFormat = "@"
     $data = import-csv -delimiter $delimiter $csv; 
     $array = ($data |ConvertTo-MultiArray).Value
     $starta = [int][char]'a' - 1
     if ($array.GetLength(1) -gt 26) {
         $col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char](($array.GetLength(1)%26) + $Starta)
     } else {
         $col = [char]($array.GetLength(1) + $starta)
     }
     $range = $a.activeWorkbook.activeSheet.Range("a1:"+$col+""+$array.GetLength(0))
     $range.value2 = $array;
     $range.Columns.AutoFit();
     $range.Rows.AutoFit();
     $range.Cells.HorizontalAlignment = -4131
     $range.Cells.VerticalAlignment = -4160
}

 function ConvertTo-MultiArray {
     param(
         [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
         [PSObject[]]$InputObject
     )
     BEGIN {
         $objects = @()
         [ref]$array = [ref]$null
     }
     Process {
         $objects += $InputObject
     }
     END {
         $properties = $objects[0].psobject.properties |%{$_.name}
         $array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
         # i = row and j = column
         $j = 0
         $properties |%{
             $array.Value[0,$j] = $_.tostring()
             $j++
         }
         $i = 1
         $objects |% {
             $item = $_
             $j = 0
             $properties | % {
                 if ($item.($_) -eq $null) {
                     $array.value[$i,$j] = ""
                 }
                 else {
                     $array.value[$i,$j] = $item.($_).tostring()
                 }
                 $j++
             }
             $i++
         }
         $array
     } 
} 
csvToExcel "storage_stats.csv" ";"

您可以按原样使用上述代码;它应该将任何CSV转换为Excel。只需更改 CSV 的路径和底部的分隔符即可。

评论

0赞 rollsch 10/24/2016
太复杂了
0赞 EricNo7 5/21/2015 #18

此问题仍然存在于 Mac Office 2011 和 Office 2013 中,我无法阻止它发生。这似乎是一件基本的事情。

就我而言,我在CSV中将“1 - 2”和“7 - 12”等值正确括在倒逗号中,这会自动转换为excel中的日期,如果您随后尝试将其转换为纯文本,您将获得日期的数字表示,例如43768。此外,它还将条形码和 EAN 编号中的大量数字重新格式化为 123E+ 数字,这些数字无法转换回来。

我发现 Google Drive 的 Google 表格不会将数字转换为日期。条形码每 3 个字符中确实有逗号,但这些逗号很容易删除。它可以很好地处理 CSV,尤其是在处理 MAC / Windows CSV 时。

也许有一天会救人。

1赞 Randy Hoffman 8/12/2015 #19

最简单的解决方案 我今天才想通了。

  • 在 Word 中打开
  • 将所有连字符替换为短划线
  • 保存并关闭
  • 在 Excel 中打开

完成编辑后,您可以随时再次在 Word 中重新打开它,以再次用连字符替换短划线。

5赞 Some_Guy 9/17/2015 #20

(EXCEL 2007 及更高版本)

如何在不编辑源文件的情况下强制 excel 不“检测”日期格式

也:

  • 将文件重命名为 .txt
  • 如果无法执行此操作,请不要直接在 excel 中打开 CSV 文件,而是创建一个新工作簿,然后转到

    并选择您的 CSV。
    Data > Get external data > From Text

无论哪种方式,您都会看到导入选项,只需选择包含日期的每一列,然后告诉 excel 格式为“文本”而不是“常规”。

13赞 Ana Maria Mendes-Pereira 12/1/2015 #21

在Microsoft Office 2016版本中仍然是一个问题,对于我们这些使用MARC1,MARCH1,SEPT1等基因名称的人来说,这是相当令人不安的。 在 R 中生成“.csv”文件后,我发现的解决方案是最实用的,然后将打开/与 Excel 用户共享:

  1. 以文本形式打开 CSV 文件(记事本)
  2. 复制它 (ctrl+a, ctrl+c)。
  3. 将其粘贴到新的 Excel 工作表中 - 它将全部粘贴为一列长文本字符串。
  4. 选择/选择此列。
  5. 转到数据-“文本到列...”,在打开的窗口中选择“分隔”(下一步)。检查是否标记了“逗号”(标记它已显示数据与以下列的分隔)(下一步),在此窗口中,您可以选择所需的列并将其标记为文本(而不是常规)(完成)。

HTH

评论

0赞 Ana Maria Mendes-Pereira 5/19/2016
手动工作对我来说也没有吸引力。然而,在用尽了手头的所有可能性之后,这个是最强大和最可靠的。
0赞 Ana Maria Mendes-Pereira 5/19/2016
尽管如此,批处理。
0赞 rollsch 10/24/2016
这实际上是这里需要最少工作量的最佳答案。我希望您可以设置一些选项来强制它不解析文件。
0赞 rollsch 10/24/2016
您也可以将所有逗号替换为制表符,然后它会自动删除
5赞 ChrisB 12/8/2015 #22

对于同样的问题,我所做的是在每个 csv 值之前添加以下内容: "=""" 在 Excel 中打开文件之前,每个 CSV 值后都有一个双引号。以以下值为例:

012345,00198475

在 Excel 中打开之前,应将这些内容更改为:

"="""012345","="""00198475"

执行此操作后,每个单元格值都会在 Excel 中显示为公式,因此不会格式化为数字、日期等。例如,值 012345 显示为:

="012345"

评论

0赞 ChrisB 2/17/2021
OP表示,文本字段中存储了值。在这种情况下,将它们存储为数字可能会更改值。此外,我上面的例子不是可以用 表示的小数。它是 CSV 文件中一行中的两个字段。字段 1 是,字段 2 是 。两者都存储为带有前导零的字符串。1234500198475E-801234500198475
2赞 Dinghai Zheng 2/29/2016 #23

就我而言,使用 R 生成的 csv 文件中的“Sept8”被 Excel 2013 转换为“8-Sept”。通过使用 xlsx 包中的 write.xlsx2() 函数生成 xlsx 格式的输出文件,解决了该问题,该文件可以通过 Excel 加载而无需进行不必要的转换。因此,如果给你一个 csv 文件,你可以尝试将其加载到 R 中并使用 write.xlsx2() 函数将其转换为 xlsx。

评论

0赞 sriharsha KB 9/22/2016
我不知道为什么你的答案被否决了。它至少对使用 R 的人很有用。这个答案帮助了我。谢谢:)
0赞 Brendonwbrown 8/17/2016 #24

我这样做是为了不断转换为科学记数法的信用卡号:我最终将我的 .csv 导入 Google 表格。导入选项现在允许禁用数值的自动格式设置。我将任何敏感列设置为纯文本并下载为 xlsx。

这是一个糟糕的工作流程,但至少我的价值观保持了应有的状态。

评论

1赞 Brendonwbrown 8/17/2016
我确实打扰了,谢谢。我暗示自动格式选择是导入过程的一个新部分。我的回答为那些像我一样被迫使用 Google 表格来处理这个特定问题的人提供了一个非常具体的工作流程。在我看来,这值得一个单独的答案。你的语气的微小调整实际上可能会导致你的评论被解释为有帮助,这就是这个网站系列的全部意义所在。
0赞 NetMage 1/30/2019
但是,您可以只使用 Excel 中的文本导入来导入 CSV 文件,而不必打扰 Sheets,如其他答案中所述。
0赞 andora 7/27/2021
此信用卡安全是否兼容 PCI/DSS?您应该与谷歌分享信用卡号吗?
5赞 mljm 11/30/2017 #25

这里提供的解决方案都不是一个好的解决方案。它可能适用于个别情况,但前提是您控制了最终显示。以我为例:我的工作产生了他们出售给零售的产品清单。这是CSV格式,包含零件代码,其中一些以零开头,由制造商设置(不受我们的控制)。去掉前导零,你实际上可以匹配另一个产品。 零售客户希望以 CSV 格式显示列表,因为后端处理程序也超出了我们的控制范围,并且每个客户都不同,因此我们无法更改 CSV 文件的格式。没有前缀'=',也没有添加制表符。原始 CSV 文件中的数据是正确的;当客户在 Excel 中打开这些文件时,问题就开始了。而且许多客户并不真正精通计算机。他们几乎可以打开并保存电子邮件附件。 我们正在考虑以两种略有不同的格式提供数据:一种是 Excel 友好(使用上面建议的选项,通过添加一个 TAB,另一种作为“主”。但这可能是一厢情愿的想法,因为有些客户不明白我们为什么需要这样做。与此同时,我们继续解释为什么他们有时会在电子表格中看到“错误”的数据。 在 Microsoft 做出适当的更改之前,我认为没有适当的解决方案,只要人们无法控制最终用户如何使用文件。

评论

0赞 Doin 7/29/2019
如果数据左侧的额外空格无关紧要,则可以通过在数据前面添加(非中断空格)来解决 Excel 的问题。"\xA0"
1赞 Derek Hill 12/20/2017 #26

使用 Google 云端硬盘(如果您使用的是 Mac,则为 Numbers)的解决方法:

  1. 在 Excel 中打开数据
  2. 将数据不正确的列的格式设置为文本(>单元格格式>数字>文本)
  3. 将 .csv 加载到 Google 云端硬盘中,然后使用 Google 表格打开它
  4. 复制有问题的列
  5. 将列作为文本粘贴到 Excel 中(编辑>粘贴特殊>文本)

或者,如果您使用的是 Mac 进行第 3 步,则可以在 Numbers 表格中打开数据。

评论

0赞 Mr. Unnormalized Posterior 6/12/2018
这是一个理智的解决方案,而不是在没有任何解决方案的情况下工作数小时。
1赞 Roman Yakoviv 6/27/2018 #27

(EXCEL 2016及更高版本,其实我没有在旧版本中尝试过)

  1. 打开新的空白页
  2. 转到“数据”选项卡
  3. 单击“从文本/CSV”并选择您的 csv 文件
  4. 在预览中检查数据是否正确。
  5. 在将某些列转换为日期时,单击“编辑”,然后通过单击列标题中的日历来选择键入文本
  6. 点击“关闭并加载”
38赞 evilReiko 8/12/2018 #28

2018

唯一适合我的正确解决方案(并且也没有修改 CSV)。

Excel 2010:

  1. 创建新工作簿
  2. 从文本>>数据 选择您的 CSV 文件
  3. 在弹出窗口中,选择“分隔”单选按钮,然后单击“下一>”
  4. 分隔符复选框:仅勾选“逗号”并取消选中其他选项,然后单击“下一个>”
  5. 在“数据预览”中,滚动到最右侧,然后按住 shift 键并单击最后一列(这将选择所有列)。现在在“列数据格式”中选择单选按钮“文本”,然后单击“完成”。

Excel office365:(客户端版本)

  1. 创建新工作簿
  2. 从文本/CSV >>数据 选择您的 CSV 文件
  3. 数据类型检测>不检测

注意:Excel office365(网络版),当我写这篇文章时,您将无法这样做。

评论

4赞 Jack 8/29/2018
这无需事先更改 CSV 文件即可工作,所以我认为这应该是正确的答案。
1赞 normanius 11/4/2019
这看起来像是正确的答案。我寄予厚望。但是在 MacOS (office365) 上,我无法选择所有列:文本导入向导中显示的预览窗口中没有水平滚动,因此我只能选择可见列。我尝试了快捷方式(CMD + A或其他东西),但无济于事。“不检测”选项也不存在。我被摧毁了。
0赞 Kurt Schultz 11/9/2019
Excel office 365,依次选择“文件”、“选项”、“数据”。如果需要,有一些复选框可以显示旧数据导入向导。
1赞 nfdavenport 3/8/2023
正确答案与否,谢谢,这就是我们大多数人真正追求的。这是我在 2023 年所需要的。希望我在几年前就想通了。
1赞 Srikanth Josyula 1/21/2021 #29

如果有人仍在寻找答案,下面的行非常适合我

我输入了=(“my_value”)。
即 显示为 not as
=("04SEP2009")04SEP200909/04/2009

这同样适用于超过 15 位的整数。他们不再被修剪了。

1赞 andora 7/27/2021 #30

如果可以更改文件源数据

如果您准备更改原始源 CSV 文件,另一种选择是更改数据中的“分隔符”,因此,如果您的数据是“4/11”(或 4-11),并且 Excel 将其转换为 4/11/2021(英国或 11-4-2021 美国),那么将“/”或“-”字符更改为其他字符将阻止不必要的 Excel 日期转换。选项可能包括:

  • 波浪号 ('~')
  • 加号 ('+')
  • 强调 ('_')
  • 双破折号 ('--')
  • 短划线 (Alt 150)
  • Em-dash (替代项 151)
  • (其他一些角色!

注意:如果要在其他地方使用文件,则移动到 Unicode 或其他非 ASCII/ansi 字符可能会使问题复杂化。

因此,将“4-11”转换为带有波浪号的“4~11”将不被视为日期!

对于大型 CSV 文件,这没有额外的开销(即:额外的引号/空格/制表符/公式构造),并且仅在直接打开文件时起作用(即:双击 CSV 打开),并避免将列预先格式化为文本或将 CSV 文件“导入”为文本。

如有必要,记事本(或类似工具)中的搜索/替换可以很容易地与替代分隔符相互转换。

导入原始数据

在较新版本的 Excel 中,您可以导入数据(在其他答案中概述)。 在旧版本的 Excel 中,可以安装“Power Query”加载项。此工具还可以导入 CSV,而无需转换。选择:“Power Query”选项卡/“从文件”/“从文本-CSV”,然后选择“加载”以表形式打开。(您可以从“数据类型检测”选项中选择“不检测数据类型”)。