请问是否有一种标记可以添加到我的csv文件中的某个字段,使得Excel不会尝试将其转换为日期格式?
我正在尝试从我的应用程序写入一个.csv文件,其中一个值看起来非常像日期,因此Excel自动将它从文本转换为日期格式。我尝试将所有文本字段(包括看起来像日期的字段)放在双引号内,但这没有任何效果。
请问是否有一种标记可以添加到我的csv文件中的某个字段,使得Excel不会尝试将其转换为日期格式?
我正在尝试从我的应用程序写入一个.csv文件,其中一个值看起来非常像日期,因此Excel自动将它从文本转换为日期格式。我尝试将所有文本字段(包括看起来像日期的字段)放在双引号内,但这没有任何效果。
awk
- 避免重新格式化类似日期的值,尽管问题标题是关于awk
,但问题实际上出在Excel上。 - Jonathan Leffler(假设使用的是Excel 2003...)
在使用“文本分列向导”时,在第三步中,您可以为每个列指定数据类型。单击预览中的列,并将表现不佳的列从“常规”更改为“文本”。
012345,00198475
在Excel中打开之前,应该进行以下修改:
"="""012345","="""00198475"
在执行此操作后,Excel 中的每个单元格值都会显示为公式,因此不会被格式化为数字、日期等。例如,值 012345 的显示结果为:
="012345"
1234500198475E-8
表示的十进制数。它是CSV文件中两个字段相邻的值。字段1是012345
,字段2是00198475
。两者都作为带前导零的字符串存储。 - ChrisB(适用于Excel 2007及以上版本)
方法一:
Data > Get external data > From Text
,选择您的CSV文件。无论哪种方式,您都会看到导入选项,请选择包含日期的每个列,并告诉Excel将其格式设置为“文本”,而不是“常规”。
这里提供的解决方案都不是好的解决方案。它可能适用于个别情况,但前提是您能控制最终显示的内容。以我的例子为例:我的工作需要生成他们销售给零售商的产品列表。这是CSV格式,并包含由制造商设置(不在我们的控制范围内)的零部件代码,其中一些以零开头。去掉前导零,您可能实际上会匹配另一个产品。 零售客户希望以CSV格式提供清单,因为后端处理程序也不在我们的控制范围内,并且每个客户都不同,因此我们无法更改CSV文件的格式。没有前缀“=”,也没有添加制表符。原始CSV文件中的数据是正确的;问题出现在客户在Excel中打开这些文件时。而许多客户并不真正了解计算机。他们只能打开和保存电子邮件附件。 我们正在考虑以两种略微不同的格式提供数据:一种是Excel友好型(使用上面建议的选项添加制表符),另一种是“主”格式。但这可能是一厢情愿的,因为有些客户不会理解为什么我们需要这样做。与此同时,我们继续解释为什么他们有时会在电子表格中看到“错误”的数据。 在微软做出适当的更改之前,我认为没有适当的解决方案,只要没有控制最终用户如何使用文件。
"\xA0"
(不间断空格)来解决 Excel 的问题。 - Doin你好,我遇到了同样的问题。
我编写了这个vbscript来创建另一个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
我知道这是一个旧帖子。像我这样仍然使用Office 2013并通过PowerShell COM对象遇到此问题的人可以使用opentext方法。问题在于该方法有许多参数,有时彼此之间是互斥的。为解决此问题,您可以使用this post中介绍的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}
$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" ";"
http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html
如果不更改这些设置,它将在您的计算机上工作,但例如在您客户的计算机上,他们将看到日期而不是数据。不需要修改您的csv文件,您可以:
Excel将正确格式化并分隔您的csv单元格,忽略自动日期格式。
这种方法有点愚蠢,但比在导入之前修改csv数据要好。Andy Baird和Richard提到了这种方法,但错过了一些重要步骤。