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

有没有人碰巧知道,如果有一个令牌,我可以添加到我的csv的某个字段,这样Excel就不会试图将它转换为日期?

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

598337 次浏览

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

< p >的例子: 25/12/2008变为'25/12/2008

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

我发现在双引号前加一个'='就能达到你想要的效果。它强制数据为文本。

如。=“2008-10-03”=“文本”

编辑(根据其他帖子):因为Jeffiekins注意到的Excel 2007 bug应该使用Andrew提出的解决方案: "=""2008-10-03"""

(假设Excel 2003…)

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

另一种方法:

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

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

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

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

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

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

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

"May 16, 2011"

"=""May 16, 2011"""

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

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

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

它也停止双引号被zapped在读进去,所以一个简单的方法,使文本在csv中保持不变的excel即使是一些文本,如“3.1415”是用双引号包围它,并在整个字符串前加上一个空格,即(使用单引号来显示你会键入什么)“3.1415”。然后在excel中,你总是有原始的字符串,除了它被双引号包围并以空格开头,所以你需要在任何公式中考虑这些。

我有一个类似的问题,这是解决方案,帮助我无需编辑csv文件内容:

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

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

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

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

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

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

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

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

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

我可以想到两种情况,“prepending =”解决方案,如前所述,可能并不理想

  • 文件可能会导入到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版本也接受导入XML文件的某种格式,并且允许更多类似于. xls格式的选项,但我没有这方面的经验。

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


除了

需要说明的是,MS Excel的新版本(2013+)不再以电子表格格式打开CSV -在一个人的工作流程中增加了一个加速,使Excel不那么有用…至少,存在绕过它的说明。例如,这个Stackoverflow: 如何正确显示Excel 2013中的。csv文件? < / > . < / p >

CSV -逗号分隔值。只需通过文本编辑器创建/编辑,而不是xls/xlsx/exel。 在编辑时,您可以设置所需的格式的日期,它必须保持完整。 这是假设相同的文件随后被以编程方式处理

这周我刚刚遇到了这个惯例,它似乎是一个很好的方法,但我在任何地方都找不到它。有人熟悉吗?你能举出出处吗?我没有找了几个小时,但我希望有人会认识到这种方法。

例1:=("012345678905")显示为012345678905

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

这是我知道如何在不搞乱文件本身的情况下完成这一点的唯一方法。就像使用Excel一样,我用头在桌子上敲了几个小时才学会这一点。

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

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

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

嗨,我也有同样的问题,

我写这个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文件在c#中,我必须这样格式化它:

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

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

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

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

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

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

前缀双引号中的空格解决了这个问题!!

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

为了解决这个问题,我只是给空格字符加上前缀(在7之前添加空格),比如“7/8”,这对我来说很有效。这是为Excel-2007测试的。

无需修改您的csv文件,您可以:

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

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

有点愚蠢的工作,但它比修改csv数据之前导入。安迪·贝尔德(Andy Baird)和理查德(Richard)回避了这种方法,但遗漏了几个重要步骤。

我知道这是一个旧线程。对于像我这样的人来说,通过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支持的,但微软的实现似乎有bug。 此外,它不知何故没有检测到德语特有的字符。给它正确的文化并没有改变这种行为。所有文件(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和底部的分隔符。

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

在我的例子中,我的值是"1 - 2" &CSV中的“7 - 12”正确地包含在倒逗号中,这将自动转换为excel中的日期,如果您尝试随后将其转换为纯文本,您将得到日期的数字表示形式,如43768。此外,它将条形码和EAN编号中的大数字重新格式化为123E+数字,再次无法转换回来。

我发现谷歌驱动器的谷歌表不能将数字转换为日期。条形码中每3个字符有一个逗号,但这些很容易被删除。它处理csv非常好,特别是在处理MAC / Windows csv时。

说不定还能救人。

< p >最简单的解决方案 我今天才想出来。

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

一旦你完成编辑,你可以再次在Word中打开它,再次用连字符替换破折号。

(excel2007及以上版本)

如何强制excel不“检测”日期格式而不编辑源文件

:

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

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

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

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

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

HTH

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

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导入到谷歌Sheets中。导入选项现在允许禁用数字值的自动格式化。我将任何敏感列设置为纯文本并下载为xlsx。

这是一个糟糕的工作流程,但至少我的价值观保持了原样。

我做了这个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格式,包含部分代码,其中一些以零开头,由制造商设置(不受我们的控制)。去掉前导的0就可以匹配另一个乘积。 零售客户想要CSV格式的列表,因为后端处理程序也不在我们的控制范围内,每个客户都不一样,所以我们不能改变CSV文件的格式。没有前缀'=',也没有添加制表符。原始CSV文件中的数据正确;当客户在Excel中打开这些文件时,问题就出现了。而且很多客户并不精通电脑。他们几乎可以打开并保存电子邮件附件。 我们正在考虑以两种略微不同的格式提供数据:一种是Excel友好格式(使用上面添加TAB的选项建议),另一种是“master”格式。但这可能是一厢情愿的想法,因为一些客户不理解我们为什么需要这样做。与此同时,我们继续解释为什么他们有时会在电子表格中看到“错误”的数据。 在微软做出适当的改变之前,我认为没有适当的解决方案,只要一个人无法控制最终用户如何使用文件

使用谷歌驱动器(如果你在Mac上,也可以使用Numbers)的解决方案:

  1. 在Excel中打开数据
  2. 将数据错误的列的格式设置为文本(format > Cells > Number > Text)
  3. 将.csv文件加载到谷歌Drive,并使用谷歌Sheets打开它
  4. 复制出错的列
  5. 将列作为文本粘贴到Excel中(编辑>粘贴特殊>文本)

或者,如果你在Mac上进行第3步,你可以在Numbers中打开数据。

(EXCEL 2016及以后版本,实际上我没有尝试过旧版本)

  1. 打开新空白页
  2. 转到“数据”标签
  3. 点击“来自文本/CSV”,选择CSV文件
  4. 检查预览您的数据是否正确。
  5. 在сase中,当某些列被转换为日期时,单击“编辑”,然后通过单击列头部的日历选择类型文本
  6. 点击“关闭&负载”

2018

唯一适合我的解决方案(也是无需修改CSV)。

Excel 2010:

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

Excel office365:(客户端版本)

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

注意: Excel office365 (web版本),当我写这篇文章时,你将无法做到这一点。

如果有人还在寻找答案,下面这句话对我来说非常合适

我输入=("my_value")
例如,=("04SEP2009")显示为04SEP2009,而不是09/04/2009

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

如果你可以改变文件的源数据

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

  • 波浪号(~)
  • +(“+”)
  • 下划线(“_”)
  • 双破折号(“-”)
  • En-dash (Alt 150)
  • Em-dash (Alt 151)
  • (其他角色!)

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

因此,'4-11'转换为'4~11'与波浪号将不会被视为日期!

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

如果需要,在记事本(或类似工具)中的搜索/替换可以轻松地转换为/从替代分隔符。

导入原始数据

.使用实例 在新版本的Excel中,您可以导入数据(在其他答案中概述)。 在较旧版本的Excel中,您可以安装“Power Query”插件。该工具还可以导入csv而不进行转换。选择:Power Query选项卡/来自文件/来自文本- csv,然后“Load”以表格形式打开。(您可以从“数据类型检测”选项中选择“不检测数据类型”)