如何防止excel在打开CSV文件时对其进行任何更改
Posted
技术标签:
【中文标题】如何防止excel在打开CSV文件时对其进行任何更改【英文标题】:How to prevent excel frommaking any changes in a CSV file when opening it 【发布时间】:2017-10-28 20:33:32 【问题描述】:我有多个 .csv 文件,其中包含我在另一个程序上生成的数据。我想打开这些文件中的每一个,从中复制所有数据并将其全部粘贴到 Excel 上的现有工作簿上。我的问题是,当我用 excel 打开 csv 文件时,它会自动将 csv 文本分成三列或更多列,这样以后,我就无法使用 Text to Columns 数据工具(或任何其他工具,因为这excel 的自动转换会破坏两个不同数字中的一些单个值)。当我打开一个 csv 文件时,有什么方法可以阻止 excel 进行任何更改?
【问题讨论】:
您知道 Excel 究竟为什么会破坏您的数据吗?值本身是否存在不应被视为定界符的定界符实例(例如逗号)?还是 Excel 按固定宽度拆分数据? CSV 是纯文本文件,因此理论上该任务可以根据需要使用自定义 VBA 代码来处理。 将演示问题的示例测试文件上传到某些公共文件共享站点。很可能你可以IMPORT
而不是OPEN
文件来做你想做的事。
【参考方案1】:
避免在 Windows 资源管理器中双击直接将 CSV 打开到 Excel 中,并考虑以下两个选项之一:
手动用户界面
在没有任何文件的情况下自行打开 Excel 程序。在打开下,浏览并选择 csv 文件。然后,您将完成导入过程向导。一定要选择 1) delimited (not fixed) - 逗号类型; 2)标题在第一行; 3) 重要:将每一列定义为 Text 类型。
您可能需要选中引号选项以包含值,因为逗号可能放在文本字符串中,并且可能与分隔的逗号分隔符混淆。因此,在自动双击时,Excel 会为每个逗号分隔返回多列。更重要的是,让软件生成 csv 文件以引用包含在其中的潜在逗号的值。
自动 VBA 代码
使用 QueryTables 将 csv 导入 Excel,但在将所有单元格格式化为 Text 后,保留所有数据类型,特别是将 .NumberFormat 设置为 @
:
Function ImportCSV()
Dim qt As QueryTable
csvfile = "C:\Path\To\CSV\File.csv"
' FORMAT ALL CELLS AS TEXT
ActiveSheet.Cells.NumberFormat = "@"
' ADD QUERYTABLE
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & csvfile, _
Destination:=Range("$A$1"))
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.Refresh BackgroundQuery:=False
End With
' REMOVE QUERYTABLE
For Each qt In currwb.Sheets(2).QueryTables
qt.Delete
Next qt
Set qt = Nothing
End Function
【讨论】:
【参考方案2】:您需要在 csv 文件中指定它是文本。您可以通过将您的号码放在引号中并在前面加上等号来做到这一点,例如:
="001145",="55666",="02133"
最简单的方法是在 , 上进行查找替换,用“,=”替换行尾(您可能需要为此使用 Notepad++ 等高级编辑器)用“\r\n= " 并手动执行文件的开头和结尾。
【讨论】:
我不知道为什么这被否决了,但我投了赞成票。以上是关于如何防止excel在打开CSV文件时对其进行任何更改的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中触摸 UILabel 时对其进行编辑?