我将报告生成为CSV文件。 当我尝试在Excel中打开文件时,它会根据单元格的内容对数据类型进行假设,并相应地重新格式化。
例如,如果CSV文件包含
...,005,...
然后Excel将其显示为5。 有没有办法覆盖它并显示005?
我更愿意对文件本身做一些事情,以便用户只需双击CSV文件即可打开它。
我使用Excel 2003。
答案 0 :(得分:114)
打开.csv文件时,没有一种简单的方法可以控制Excel应用的格式。下面列出的是三种可能有用的方法。
我的偏好是第一个选择。
选项1 - 更改文件中的数据
您可以更改.csv文件中的数据,如下所示......, =“005”,... 这将在Excel中显示为......, 005 ,...
Excel会将数据保存为公式,但复制列并使用粘贴特殊值将删除公式但保留格式
选项2 - 格式化数据
如果它只是一个格式问题,那么该列中的所有数据都有三位数的长度。然后在Excel中打开数据,然后使用此自定义格式 000
格式化包含数据的列选项3 - 将文件扩展名更改为.dif(数据交换格式)
更改文件扩展名并使用文件导入向导来控制格式。 双击时,Excel会自动打开扩展名为.dif的文件。
一步一步:
答案 1 :(得分:27)
请勿使用CSV,请使用SYLK http://en.wikipedia.org/wiki/SYmbolic_LinK_(SYLK)
它提供了对格式化的更多控制,Excel不会通过检查内容来尝试猜测字段的类型。它看起来有点复杂,但你可以使用一个非常小的子集。
答案 2 :(得分:14)
适用于Microsoft Office 2010,Excel版本14
我误读了OP的偏好“对文件本身做了些什么。”对于那些想要直接格式化导入的解决方案的人,我仍然保留这个
答案 3 :(得分:2)
您可以简单地将范围格式化为文本。
同样here是关于数字格式以及如何编程的好文章。
答案 4 :(得分:2)
实际上我发现,至少从Office 2003开始,您可以将Excel电子表格另存为XML文件。 因此,我可以生成一个XML文件,当我双击它时,它将在Excel中打开。 它提供与SYLK相同的控制级别,但XML语法更直观。
答案 5 :(得分:2)
在单元格中添加不间断的空间可能有所帮助。
例如:
"firstvalue";"secondvalue";"005 ";"othervalue"
它强制Excel将其视为文本,并且空间不可见。 在Windows上,您可以通过tiping alt + 0160添加不间断的空间。 有关详细信息,请参阅此处:http://en.wikipedia.org/wiki/Non-breaking_space
尝试使用Excel 2010。 希望这可以帮助仍然为这个问题寻找一个非常合适的解决方案的人。
答案 6 :(得分:2)
从C#代码导出CSV数据时出现此问题,并通过在前导零数据前加上制表符\ t来解决此问题,因此数据在Excel中被解释为文本而不是数字(但不像其他字符前面那样,它不会被看到)。
我确实喜欢=“001”方法,但这不允许将导出的CSV数据重新导入我的C#应用程序而不从导入CSV文件中删除所有这些格式(相反,我只是修剪导入数据)。
答案 7 :(得分:1)
我相信在导入文件时,您可以选择列类型。使其成为文本而不是数字。我现在面前没有副本可以查看。
答案 8 :(得分:1)
Load csv into oleDB and force all inferred datatypes to string
我问同样的问题,然后用代码回答。
基本上当加载csv文件时,oledb驱动程序会做出假设,你可以告诉它做出什么样的假设。
我的代码强制所有数据类型为字符串...它很容易更改架构。 为了我的目的,我使用xslt来获取我想要的方式 - 但我正在解析各种各样的文件。
答案 9 :(得分:1)
我知道这是一个老问题,但我有一个未列在此处的解决方案。
当您生成csv时,请在逗号之后但在您的值之前添加空格,例如, 005,
。
无论如何,这都可以防止excel 2007中的自动日期格式化。
答案 10 :(得分:1)
当导入的CSV文件在单元格中有换行符时,文本导入向导方法不起作用。此方法处理此方案(至少使用制表符分隔的数据):
答案 11 :(得分:1)
这让我整天疯狂(因为在打开CSV文件之前确实无法控制Excel列类型),这对我有用,使用VB.NET和Excel Interop:
'Convert .csv file to .txt file.
FileName = ConvertToText(FileName)
Dim ColumnTypes(,) As Integer = New Integer(,) {{1, xlTextFormat}, _
{2, xlTextFormat}, _
{3, xlGeneralFormat}, _
{4, xlGeneralFormat}, _
{5, xlGeneralFormat}, _
{6, xlGeneralFormat}}
'We are using OpenText() in order to specify the column types.
mxlApp.Workbooks.OpenText(FileName, , , Excel.XlTextParsingType.xlDelimited, , , True, , True, , , , ColumnTypes)
mxlWorkBook = mxlApp.ActiveWorkbook
mxlWorkSheet = CType(mxlApp.ActiveSheet, Excel.Worksheet)
Private Function ConvertToText(ByVal FileName As String) As String
'Convert the .csv file to a .txt file.
'If the file is a text file, we can specify the column types.
'Otherwise, the Codes are first converted to numbers, which loses trailing zeros.
Try
Dim MyReader As New StreamReader(FileName)
Dim NewFileName As String = FileName.Replace(".CSV", ".TXT")
Dim MyWriter As New StreamWriter(NewFileName, False)
Dim strLine As String
Do While Not MyReader.EndOfStream
strLine = MyReader.ReadLine
MyWriter.WriteLine(strLine)
Loop
MyReader.Close()
MyReader.Dispose()
MyWriter.Close()
MyWriter.Dispose()
Return NewFileName
Catch ex As Exception
MsgBox(ex.Message)
Return ""
End Try
End Function
答案 12 :(得分:0)
打开CSV时,您将获得文本导入向导。在向导的最后一步,您应该能够将特定列作为文本导入,从而保留“00”前缀。之后,您可以按照您想要的任何方式格式化单元格。
我尝试使用Excel 2007,它似乎有效。
答案 13 :(得分:0)
好吧,excel永远不会弹出CSV文件的向导。如果将其重命名为.txt,则在下次执行文件>在Excel中打开时,您将看到向导。
答案 14 :(得分:0)
在字段前加一个引号。 Excel会将其视为文本,即使它看起来像数字。
...,`005,...
编辑:这是错误的。撇号技巧仅在将数据直接输入Excel时有效。在CSV文件中使用它时,撇号出现在您不想要的字段中。
答案 15 :(得分:0)
只需在CSV文档中添加'之前的数字。