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

有没有人碰巧知道是否有一个令牌,我可以添加到我的CSV某个领域,所以Excel不会尝试将其转换为日期?

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

我发现在双引号之前加一个'='就可以实现你想要的。 它迫使数据成为文本。

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

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

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

 "May 16, 2011" 

 "=""May 16, 2011""" 

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

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

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

有时可以从一个或多个零(0)开始,在转换为数字时将被丢弃。 或者该值包含可能与数学运算符混淆的字符(如日期)。

我可以想到,前面提到的“prepending =”解决方案可能不是最理想的两种情况

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

我的黑客解决这个问题

如果在值中预先/附加了非数字和/或非日期字符,则该值将被识别为文本而不被转换。 非打印字符将是好的,因为它不会改变显示的值。 但是,简单的旧空格字符(\ s,ASCII 32)不能正常工作,因为它被Excel截断,然后该值仍然被转换。 但是还有其他各种印刷和非印刷空间的人物都能很好地工作。 最简单的方法追加(添加)简单的制表符(\ t,ASCII 9)。

这种方法的好处:

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

另一种选择

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

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


加成

需要说的是,MS Excel的更新版本(2013+)不再以电子表格的格式打开CSV – 一个人的工作流程中又多出现一个速度缓冲区,从而使Excel的用处变得不那么有用…至少有指导说明。 看到例如这个Stackoverflow: 如何在Excel 2013中正确显示.csv文件? 。

我有一个类似的问题,这是帮助我,而不必编辑CSV文件内容的解决方法:

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

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

在向导的第二页中,选择“,”作为分隔符,如果用引号将值包围,则还可以选择文本限定符

在第三页,单独选择每一列,并指定每个类型的“文本”,而不是“常规”,以阻止Excel搞乱您的数据。

希望这可以帮助你或有类似问题的人!

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

我发现唯一的解决方法是消除字段内容包含逗号的情况。

这可能意味着在Excel中有一些领域不可能完全代表“正确”,但是现在我相信没有人会太惊讶。

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

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

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

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

(假设Excel 2003 …)

当使用“文本到列向导”时,在步骤3中可以指定每个列的数据类型。 点击预览中的栏目,将错误列从“常规”更改为“文本”。

下面是我们在生成csv文件时首先使用的简单方法,它确实改变了一些值,所以不适用于所有的应用程序:

预留一个空间给csv中的所有值

这个空格将被“1”,“2.3”和“-2.9e4”等数字的excel去掉,但会保留在像“01/10/1993”这样的日期和像“TRUE”这样的布尔值之间,从而阻止它们被转换成excel的内部数据类型。

它也停止双引号被读入zapped,所以一个csv中的文本的万无一失的方式保持不变由excel即使如果像“3.1415”一些文本是用双引号括起来,并用一个空格前置整个字符串,即(使用单引号显示您将键入的内容)“3.1415”“。 然后在Excel中,你总是有原始的字符串,除了它被双引号包围,并以空格作为前缀,所以你需要考虑任何公式中的那些字符。

这是我知道如何做到这一点,而不用搞乱文件本身的唯一途径。 和往常一样,我通过在桌面上敲打我的头几个小时就学会了这一点。

将.csv文件扩展名更改为.txt; 这将会阻止Excel在打开文件时自动转换文件。 下面是我如何做到这一点:打开Excel空白工作表,关闭空白表,然后选择文件=>打开,选择文件的扩展名为.txt。 这迫使Excel打开“文本导入向导”,它会问你如何解释文件的问题。 首先你选择你的分隔符(逗号,制表符等),然后(这里是重要的部分),你选择一组列的列并选择格式。 如果你想要的文件,然后选择“文本”,Excel将显示分隔符之间的内容。

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

  1. 以文本方式打开CSV文件(记事本)
  2. 复制它(ctrl + a,ctrl + c)。
  3. 将它粘贴到一个新的excel表格中 – 它将全部粘贴在一列中作为长文本字符串。
  4. 选择/选择此列。
  5. 转到数据 – “文本到列…”,在打开的窗口中选择“分隔”(下一个)。 检查“逗号”是否被标记(标记它已经显示数据与下面的列分隔)(下一步),在这个窗口中,你可以选择你想要的列,并将其标记为文本(而不是一般)(完成)。

HTH

我有本周遇到这个惯例,这似乎是一个很好的方法,但我找不到任何地方参考。 有人熟悉它吗? 你能引用它的来源吗? 我没有看过几个小时,但希望有人会认识到这种做法。

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

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

它不是Excel。 Windows确实承认公式,数据作为日期和自动更正。 您必须更改Windows设置。

“控制面板” – >“切换到经典视图” – >“区域和语言选项” – >选项卡“区域选项” – >“自定义…” – >选项卡“数字” – >然后更改符号根据你想要的。

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

它可以在你的计算机上工作,如果这些设置没有改变,例如在客户的计算机上,他们会看到日期而不是数据。

嗨,我有同样的问题,

我写这个vbscipt来创建另一个CSV文件。 新的CSV文件将在每个字段的字体中有一个空格,所以Excel会将其理解为文本。

所以你用下面的代码创建一个.vbs文件(例如Modify_CSV.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 

不用修改您的csv文件,您可以:

  1. 将Excel格式单元格选项更改为“文本”
  2. 然后使用“文本导入向导”来定义csv单元格。
  3. 一旦导入删除该数据
  4. 然后只是作为纯文本粘贴

Excel将正确格式化和分离您的CSV格式的文本格式忽略自动日期格式。

一种愚蠢的解决办法,但它比输入前修改CSV数据节拍。 安迪贝尔德和理查德躲避这种方法,但错过了一些重要的步骤。

如果在字段的起始处插入一个逗号,它将被解释为文本。

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

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

我知道这是一个古老的线索。 对于像我这样的人,仍然有这个问题使用Office 2013通过PowerShell的COM对象可以使用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支持,但微软的实施似乎被窃听。 此外,它确实没有发现德国特定的字符。 给它正确的文化并没有改变这种行为。 所有文件(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++;} 

但是,这是非常缓慢的,这就是为什么我寻找替代品。 Appearently 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" ";" 

你可以使用上面的代码,因为它应该将任何csvs转换成excel。 只要将路径更改为csv,并将底部的分隔符改为。

(EXCEL 2007及更高版本)

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

或者:

  • 将该文件重命名为.txt
  • 如果你不能这样做,而不是直接在Excel中打开CSV文件,创建一个新的工作簿,然后去
    Data > Get external data > From Text
    并选择你的CSV。

无论哪种方式,您将被提供导入选项,只需选择每个包含日期的列,并告诉excel格式为“文本”而不​​是“一般”。

将表粘贴到词中。 做一个搜索/替换和全部 – (破折号) – (双破折号)。 复制并粘贴到Excel中。 可以为其他符号(/)等做相同的事情。如果需要在Excel中更改回破折号,只需将列格式化为文本,然后进行更改。 希望这可以帮助。

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

 012345,00198475 

在Excel中打开之前,这些应该被修改:

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

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

 ="012345" 

在我的情况下,使用R生成的csv文件中的“Sept8”被Excel 2013转换为“8-Sept”。问题是通过在xlsx包中使用write.xlsx2()函数来生成xlsx格式的输出文件,可以通过Excel加载,而不需要转换。 所以,如果你有一个csv文件,你可以尝试加载到R,并使用write.xlsx2()函数将其转换为xlsx。

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

这是一个可怕的工作流程,但至少我的价值观是应该保持的。

好吧,找到一个简单的方法来在Excel 2003到2007年做到这一点。打开一个空白的xls工作簿。 然后进入数据菜单,导入外部数据。 选择您的csv文件。 通过向导,然后在“列数据格式”中选择需要被强制为“文本”的任何列。 这将导入整个列作为文本格式,防止Excel试图将任何特定的单元格作为日期。

在双引号前缀空间解决了问题!

我在.csv文件列中有一个像“7/8”的数据,MS-Excel将它转换为“07-08”的日期。 但用“LibreOffice Calc”没有问题。

为了解决这个问题,我只是在“7/8”之前加了前缀空格字符(在7之前加了空格),并且对我有用 。 这是为Excel-2007测试的。

这个问题在Mac Office 2011和Office 2013中仍然存在,我不能阻止它发生。 这似乎是一个基本的东西。

在我的情况下,我在CSV中包含正确的引号内的“1 – 2”和“7 – 12”这样的值,这会自动转换为excel中的日期,如果您尝试将其转换为纯文本,如43768的日期的数字表示。此外,它将条码和EAN号码中的大数字重新格式化为123E +数字,这些数字不能被转换回来。

我发现Google云端硬盘的Google表格不会将这些数字转换为日期。 条码中每3个字符都有一个逗号,但这些字符很容易被删除。 它处理CSV真的很好,特别是在处理MAC / Windows CSV时。

可能会在某个时间保存某人。

最简单的解决方案我今天就明白了这一点。

  • 在Word中打开
  • 用连字符替换所有的连字符
  • 保存并关闭
  • 在Excel中打开

一旦完成编辑,您可以随时在Word中将其重新打开,以便再次用连字符替换连字符。

我做了这个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解决方案,它没有包括在输入文本前插入。 这段代码保留了原始数据。

另一种方法:

将要更改的列的格式转换为“文本”。 选择你想要保存的所有单元格,复制。 如果不取消选择这些列,请单击“编辑>选择性粘贴>作为值”

另存为CSV。 请注意,这是你对文件做的最后一件事情,因为当你重新打开它时,它将自己格式化为日期,因为单元格格式不能保存在CSV文件中。

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

CSV – 逗号分隔值。 只需通过文本编辑器而不是xls / xlsx / exel来创建/编辑。 在编辑中,您可以按要求的格式设置日期,并且必须保持不变。 这是假设相同的文件,然后得到处理程序。