如何将 Excel 设置为始终将 CSV 文件的所有列作为文本导入?

Wil*_*unn 75 formatting microsoft-excel

虽然我尽量避免它,但我偶尔不得不在 Excel 中打开一个 CSV 文件。当我这样做时,它会格式化包含数字的列,这使它们对我的目的毫无用处。据我所知,防止在导入时发生这种情况的唯一方法是重命名文件,使扩展名不是 .csv 并使用导入向导分别指定每列的格式。对于 50-60 列的文件,这是不切实际的。

由于互联网上这个经常被问到的问题的每个答案都暗示了在文件打开后将格式化数字转换回的某种方法(这对我不起作用 - 我想解决一般问题,而不是一些特定情况)或手动选择每列的格式类型(我不想这样做),我正在寻找一种设置全局首选项或样式的方法,以便打开的所有 CSV 文件的所有列始终格式化为文本。我也知道用引号“保护”数字,但我得到的文件不是那样的,我希望避免对文件进行预处理,这样 Excel 就不会把它们搞砸。

有没有办法专门做到这一点:始终将打开的 CSV 文件中的所有列格式化为文本,而无需在导入过程中每次手动选择每一列?

我使用的是 Excel 2003,但如果您知道的话,我会回答 2007 年的问题。

nix*_*xda 77

如何在 Excel 中打开 CSV

好办法

  • Excel ? 数据 ?获取外部数据 ? 选择所有列Shift并选择文本

    好处:将所有值正确地视为文本,无一例外

    缺点:比简单的双击更多的步骤

不好的方式

  • 双击打开 CSV或 Excel 的打开方式对话框

    缺点:Excel 的内部 CSV 处理程序将带有前导-=符号的值误解为公式而不是文本

    缺点:0001由于 Excel 的自动检测列格式,您将丢失二进制值的前导零

好方法(对于 VBA)

  • 使用 QueryTables(VBA 对应物Get external data)?示例代码

    好处:将所有值正确地视为文本,无一例外

    缺点:代码比OpenText方法多一点

糟糕的方式(对于 VBA)

  • 使用Workbooks.OpenText方法 ? 示例代码

    缺点:此方法仍然使用 Excel 的内部 CSV 导入处理程序,但存在所有缺陷

    缺点:此外,如果扩展名是 CSV fieldinfoOpenText则忽略参数。通常,此参数可让您选择每种列格式,但如果扩展名是 CSV,则不能。您可以在Stack Overflow上阅读有关此行为的更多信息

    如果您可以完全控制源文件,则将源扩展名暂时从 CSV 重命名为 TXT,然后再重命名为 CSV 是一种有效的解决方法

附加方法

  • 如果您有权访问创建 CSV 的源,则可以更改 CSV 语法。
    用双引号将每个值括起来,并="00001"在每个值前面加上一个等号,例如或在每个值前面加上一个制表符。两种方式都将强制 Excel 将值视为文本

    原始 CSV 内容
    在此处输入图片说明

    通过双击打开 Excel 中的 CSV
    在此处输入图片说明

    请注意第 2 行(双引号方法)和第 3 行(制表符方法)如何不被 Excel 更改

  • 记事本中打开 CSV并将所有值复制并粘贴到 Excel。然后使用Data - Text to Columns
    Downside:用于将列格式从常规更改为文本的列中的文本会产生不一致的结果。如果值包含-由字符包围的a (例如“=E1-S1”),Excel 会尝试将该值拆分为多个列。位于该单元格右侧的值可能会被覆盖

    文本到列的行为在 Excel 2007 和 2013 之间的某处发生了更改,因此不再起作用)


用于打开 CSV 并将所有值作为文本导入的 Excel 插件

这是一个 Excel 插件,用于简化 CSV 导入操作。
主要优点:它是一键式解决方案,使用QueryTables获取外部数据相同的防弹方法

  • 它向 Excel 添加了一个新的菜单命令,允许您导入 CSV 和 TXT 文件。所有值都从当前选定的单元格开始导入到活动工作表中
  • Excel 插件适用于 Windows 和 Mac 上的所有 Office 版本
  • 整个插件只有 35 行代码。如果您好奇,请查看注释的源代码
  • 使用的 CSV 列表分隔符(逗号或分号)取自您本地的 Excel 设置
  • 编码设置为 UTF-8

安装

  1. 下载加载项并将其保存到您的外接程序文件夹:%appdata%\Microsoft\AddIns
  2. 打开 Excel 并激活加载项:File tab ? Options ? Add-Ins ? Go To并选择ImportCSV.xla
  3. 启用 VBA 宏: File tab ? Options ? Trust Center ? Trust Center Settings ? Macro Settings ? Enable all macros
  4. 重新启动 Excel

您会注意到一个名为 Add-Ins 的新菜单栏条目,您可以使用此按钮快速打开 CSV 文件,而无需经历“导入”对话框的麻烦

在此处输入图片说明


直接从 Windows 资源管理器打开 CSV 的 PowerShell 脚本

您可以使用 PowerShell 脚本打开 CSV 文件并自动将它们传递到 Excel。该脚本默默地使用 Excel 的文本导入方法,该方法始终将值视为文本,并且作为奖励,处理 UTF-8 编码

  1. 创建一个新的文本文件并粘贴以下脚本。可以在此处找到评论版本
$CSVs = @()
$args.ForEach({
    If ((Test-Path $_) -and ($_ -Match "\.csv$|\.txt$")) {
        $CSVs += ,$_
    } 
})

if (-Not $null -eq $CSVs) {

    $excel = New-Object -ComObject excel.application 
    $excel.visible = $true
    $excel.SheetsInNewWorkbook = $CSVs.Count    
    $workbook = $excel.Workbooks.Add()

    for ($i=0; $i -lt $CSVs.Count; $i++){

        $csv = Get-Item $CSVs[$i]
        $worksheet = $workbook.worksheets.Item($i + 1)
        $worksheet.Name = $csv.basename

        $TxtConnector = ("TEXT;" + $csv.fullname)
        $Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
        $query = $worksheet.QueryTables.item($Connector.name)
        $query.TextFilePlatform = 65001
        $query.TextFileTextQualifier = 1
        $query.TextFileOtherDelimiter = $Excel.Application.International(5) 
        $query.TextFileParseType  = 1
        $arrFormats = ,2 * $worksheet.Cells.Columns.Count
        $query.TextFileColumnDataTypes = $arrFormats
        $query.AdjustColumnWidth = 1
        $query.Refresh()
        $query.Delete()
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 将其保存在类似C:\my\folder\myScript.ps1. (注意扩展名.ps1
    • 通过WinR» shell:sendto» 打开您的 sendto 文件夹Enter
  2. 通过右键单击»新建»快捷方式创建一个新快捷方式并粘贴此行。不要忘记将路径更改为您自己放置脚本的路径。命名快捷方式,例如Excel

"%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -NonInteractive -WindowStyle Hidden -File "C:\my\folder\myScript.ps1"

现在您可以选择(多个)CSV 并通过以下方式在 Excel 中打开它们 Right-click » SendTo » Excel

  • @nixda 到 ge.tt 的链接再次断开。大多数人说他们不可用,因为 _owner_ 违反了 TOS。然而,[OpenCSV.exe](http://ge.tt/6hJnm3n/v/0) 的一个说“这些**文件**不再可用,因为它们违反了服务条款。” 这让我想问,你是ImportMyCSV Excel函数的作者吗?(源代码仍然在 pastebin 上可用)这是一个很棒的工具 - 我在工作中使用它并推荐给其他人。但我对代码的来源很感兴趣,如果没有别的,正确地归功于作者。 (3认同)

Jea*_*ett 8

这有效:

Sub OpenCsvAsText(ByVal strFilepath As String)

    Dim intFileNo As Integer
    Dim iCol As Long
    Dim nCol As Long
    Dim strLine As String
    Dim varColumnFormat As Variant
    Dim varTemp As Variant

    '// Read first line of file to figure out how many columns there are
    intFileNo = FreeFile()
    Open strFilepath For Input As #intFileNo
    Line Input #intFileNo, strLine
    Close #intFileNo
    varTemp = Split(strLine, ",")
    nCol = UBound(varTemp) + 1

    '// Prepare description of column format
    ReDim varColumnFormat(0 To nCol - 1)
    For iCol = 1 To nCol
        varColumnFormat(iCol - 1) = Array(iCol, xlTextFormat)
        ' What's this? See VBA help for OpenText method (FieldInfo argument).
    Next iCol

    '// Open the file using the specified column formats
    Workbooks.OpenText _
            Filename:=strFilepath, _
            DataType:=xlDelimited, _
            ConsecutiveDelimiter:=False, Comma:=True, _
            FieldInfo:=varColumnFormat

End Sub
Run Code Online (Sandbox Code Playgroud)

用法:

OpenCsvAsText "C:\MyDir\MyFile.txt"
Run Code Online (Sandbox Code Playgroud)

逗号分隔的文件现在作为 Excel 工作表打开,所有列都设置为文本格式。

请注意,@Wetmelon 的向导解决方案工作得很好,但是如果您要打开许多文件,那么您可能会像我一样厌倦每次滚动到第 60 列以按住 Shift 键单击它。

编辑@GSerg 在下面的评论中指出这“不起作用”和“吃空格和前导零”。我将引用对该问题的评论,它更具描述性:

由于未知的原因,即使您明确为 VBA 中的所有列提供格式,如果文件扩展名是 CSV,Excel 也会忽略它。只要您更改扩展名,相同的代码就会产生正确的结果。

所以上面的代码“有效”,但被这种荒谬的 Excel 行为杀死了。无论您以哪种方式剪切它,您都不得不将扩展名更改为“.csv”以外的其他内容,抱歉!在那之后,你就可以自由回家了。


小智 5

您可以尝试先打开 .xlsx,然后创建数据连接并导入 .csv。选择“逗号”分隔,然后选择将所有列视为文本而不是“常规”的选项。

编辑:哦,我没有完全阅读这个问题。在导入向导中,选择要作为文本导入的第一个列标题,滚动到最后一个列标题,然后按 Shift+单击标题。然后选择“文本”径向选项。

  • 是的,这很好用——只要文件的扩展名不是“.csv”。+1 (2认同)