我将报告生成为 CSV 文件。当我尝试在 Excel 中打开文件时,它会根据单元格的内容对数据类型进行假设,并相应地重新格式化。
例如,如果 CSV 文件包含
...,005,...
然后 Excel 将其显示为 5。有没有办法覆盖它并显示 005?
我更愿意对文件本身做一些事情,这样用户就可以双击 CSV 文件来打开它。
我使用 Excel 2003。
我将报告生成为 CSV 文件。当我尝试在 Excel 中打开文件时,它会根据单元格的内容对数据类型进行假设,并相应地重新格式化。
例如,如果 CSV 文件包含
...,005,...
然后 Excel 将其显示为 5。有没有办法覆盖它并显示 005?
我更愿意对文件本身做一些事情,这样用户就可以双击 CSV 文件来打开它。
我使用 Excel 2003。
不要使用 CSV,使用 SYLK。
http://en.wikipedia.org/wiki/SYmbolic_LinK_(SYLK)
它提供了对格式的更多控制,并且 Excel 不会尝试通过检查内容来猜测字段的类型。它看起来有点复杂,但你可以使用一个非常小的子集。
这适用于 Microsoft Office 2010,Excel 版本 14
我误读了 OP 的偏好“对文件本身做一些事情”。我仍然为那些想要直接格式化导入的解决方案保留这个
您可以简单地将您的范围格式化为文本。
这里还有一篇关于数字格式以及如何对其进行编程的好文章。
实际上我发现,至少从 Office 2003 开始,您可以将 Excel 电子表格保存为 XML 文件。因此,我可以生成一个 XML 文件,当我双击它时,它将在 Excel 中打开。它提供与 SYLK 相同级别的控制,但 XML 语法更直观。
在单元格中添加一个不间断的空间可能会有所帮助。例如:
"firstvalue";"secondvalue";"005 ";"othervalue"
它强制 Excel 将其视为文本,并且空格不可见。在 Windows 上,您可以通过提示 alt+0160 添加不间断空格。有关更多信息,请参见此处:http ://en.wikipedia.org/wiki/Non-breaking_space
在 Excel 2010 上尝试过。希望这可以帮助那些仍在为这个问题寻找一个非常合适的解决方案的人。
我在从 C# 代码导出 CSV 数据时遇到了这个问题,并通过在前导零数据前加上制表符 \t 解决了这个问题,因此数据在 Excel 中被解释为文本而不是数字(但与附加其他字符不同,它不会看不见)。
我确实喜欢 ="001" 方法,但这不允许在不从导入 CSV 文件中删除所有这些格式的情况下将导出的 CSV 数据重新导入到我的 C# 应用程序(相反,我将只修剪导入数据) .
我相信当您导入文件时,您可以选择列类型。将其设为文本而不是数字。不过,目前我面前没有副本可供检查。
将 csv 加载到 oleDB 并强制所有推断的数据类型为字符串
我问了同样的问题,然后用代码回答了。
基本上,当加载 csv 文件时,oledb 驱动程序会做出假设,您可以告诉它要做出哪些假设。
我的代码虽然强制所有数据类型为字符串……但更改架构非常容易。出于我的目的,我使用 xslt 以我想要的方式获得 ti - 但我正在解析各种各样的文件。
我知道这是一个老问题,但我有一个未在此处列出的解决方案。
当您生成 csv 时,在逗号之后但在您的值之前添加一个空格,例如, 005,
.
无论如何,这可以防止 excel 2007 中的自动日期格式。
当导入的 CSV 文件在单元格中有换行符时,文本导入向导方法不起作用。此方法处理这种情况(至少使用制表符分隔的数据):
只需在 CSV 文档中的数字前添加 '。
这让我整天发疯(因为在打开 CSV 文件之前确实无法控制 Excel 列类型),这对我有用,使用 VB.NET 和 Excel 互操作:
'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
打开 CSV 时,您将获得文本导入向导。在向导的最后一步,您应该能够将特定列作为文本导入,从而保留“00”前缀。之后,您可以以任何您想要的方式格式化单元格。
我尝试使用 Excel 2007,它似乎可以工作。
好吧,excel 永远不会弹出 CSV 文件的向导。如果您将其重命名为 .txt,您将在下次执行“文件”>“在 Excel 中打开”时看到该向导。
在字段前加上单引号。Excel 会将其视为文本,即使它看起来像一个数字。
...,`005,...
编辑:这是错误的。撇号技巧仅在将数据直接输入 Excel 时才有效。当您在 CSV 文件中使用它时,撇号会出现在您不想要的字段中。