2011-07-05 00:01:28 +0000 2011-07-05 00:01:28 +0000
69
69

如何设置Excel总是将CSV文件的所有列导入为文本?

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

由于互联网上对这个经常被问到的问题的每一个答案都建议在文件打开后用某种方法将格式化的数字转换回来(这对我来说是行不通的–我想解决的是一般的问题,而不是几个特定的情况),或者手动选择每一列的格式类型(我不想这样做),我正在寻找一种方法来设置一个全局的偏好或风格,使所有打开的CSV文件的所有列的格式总是文本。我也知道用引号来 “武装 "数字,但我得到的文件不是这样的,我希望避免对文件进行预处理,这样Excel就不会把它们搞乱。

有没有一种方法可以做到特别。始终将打开的CSV文件中的所有列都格式化为文本,而不需要在导入时每次都手动选择每一列?

我用的是Excel 2003,但如果你知道的是2007年的答案,我也会接受。

答案 (9)

73
73
73
2013-01-04 01:38:39 +0000

如何在Excel中打开CSV

好的方法

  • Excel → 数据 → 获取外部数据 → 用Shift选择所有列,然后选择Text

坏的方法

  • 双击或Excel的Open with对话框打开CSV

好的方法(适用于VBA)

-。使用 QueryTables(VBA 对应 Get external data) → 示例代码

坏方法(对于 VBA)

附加方法

  • 如果你可以访问创建 CSV 的源。你可以改变CSV的语法。
    将每个值用双引号括起来,并在前面加上等号,如="00001"或在每个值后面加上制表符。这两种方法都会迫使Excel将值视为文本

  • 记事本 打开CSV,并将所有值复制粘贴到Excel。然后使用数据-文本到列 缺点。Text in Columns用于改变列格式,从一般的回到文本,产生不一致的结果。如果一个值包含一个由字符包围的-(例如"=E1-S1"),Excel会尝试将该值分割成多个列。位于该单元格右侧的值可能会被覆盖 (Text to columns的行为在Excel 2007和2013年之间的某个地方发生了改变,所以它不再工作了)


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

这是一个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 文件,而不需要经历导入对话框的麻烦

  • *

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

你可以使用 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()
    }
}

1.将其保存在某个地方,比如C:\my\folder\myScript.ps1。(注意扩展名 .ps1) - 通过 WinR 打开你的 sendto 文件夹 “ shell:sendto ” 输入 2. 通过右键 “ 新建 ” 快捷方式创建一个新的快捷方式,并粘贴这一行。不要忘了把路径改成你自己放脚本的地方。给快捷方式命名,例如,Excel

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

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

7
7
7
2011-07-06 19:13:20 +0000

这就可以了。

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

使用。

OpenCsvAsText "C:\MyDir\MyFile.txt"

逗号分隔的文件现在以Excel表格的形式打开,所有列的格式都是文本。

请注意,@Wetmelon的向导解决方案工作得很好,但是如果你打开了很多文件,那么你可能会像我一样,每次都会厌烦地滚动到第60列,以便Shift-Click它。

EDIT @GSerg 在下面的评论中说这个 “不能用","会吃掉空格和前导零"。我只引用问题的评论,它的描述性更强:

不知道为什么,即使你在VBA中明确提供了所有列的格式,如果文件扩展名是CSV,Excel也会忽略它。只要你改变扩展名,同样的代码就会产生正确的结果。

所以上面的代码 "工作 "了,但却被Excel这种可笑的行为杀死了。无论你用哪种方式切开它,你都必须将扩展名改为”.csv “以外的其他文件,抱歉! 之后,你就可以自由回家了。

4
4
4
2013-01-03 22:42:44 +0000

Wetmelon的建议有效(即使是.CSV),如果你做以下工作。

1.打开Excel的空白工作簿或工作表 2. 点击 “数据”/>“从文本获取外部数据 ” 3. 使用Wetmelon描述的 “文本导入向导"(逗号去掉,选择第一列,SHIFT+CLICK最后一列,将所有内容设置为文本)。

我知道步骤比较多,但至少它让我可以这样打开CSV,而不用改变扩展名。

2
2
2
2015-12-02 14:21:59 +0000

小心!

当使用手动方法 “Excel→数据→获取外部数据→选择所有列并选择文本”……。

这只会将列设置为 “第一行有数据"(通常是标题行)的文本。这个向导不会向你显示更右边的列,这些列可能有更下面的数据,但不在第一行。例如:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

你永远不会在导入向导中看到Col 4,所以在导入之前,你不会得到把它从一般格式改为文本格式的选项!!!!。

1
1
1
2015-12-04 09:21:54 +0000

下面是Jean-François Corbett发布的代码的替代过程

该过程将把csv文件导入Excel,所有列的格式为Text

Public Sub ImportCSVAsText()
    Dim TempWorkbook As Workbook
    Dim TempWorksheet As Worksheet
    Dim ColumnCount As Integer
    Dim FileName As Variant
    Dim ColumnArray() As Integer

    'Get the file name
    FileName = Application.GetOpenFilename(FileFilter:="All Files (*.*),*.*", FilterIndex:=1, Title:="Select the CSV file", MultiSelect:=False)

    If FileName = False Then Exit Sub

    Application.ScreenUpdating = False

    'Open the file temporarily to get the count of columns
    Set TempWorkbook = Workbooks.Open(FileName)
    ColumnCount = TempWorkbook.Sheets(1).Range("A1").SpecialCells(xlCellTypeLastCell).Column
    TempWorkbook.Close SaveChanges:=False

    'Resize the array to number of columns
    ReDim ColumnArray(1 To ColumnCount)

    For i = 1 To ColumnCount
        ColumnArray(i) = xlTextFormat
    Next i

    Set TempWorkbook = Workbooks.Add
    Set TempWorksheet = TempWorkbook.Sheets(1)

    Application.DisplayAlerts = False
    TempWorkbook.Sheets(2).Delete
    TempWorkbook.Sheets(2).Delete
    Application.DisplayAlerts = True

    With TempWorksheet.QueryTables.Add("TEXT;" & FileName, TempWorksheet.Cells(1, 1))
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1251
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = ColumnArray
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

End Sub
```。
0
0
0
2011-07-05 01:20:26 +0000

如果你总是导入相同的数据(恒定的记录格式、布局等),你可以使用导入规范编写一个Access宏,然后将数据转储回Excel。这样做的次数可能很多。我做过的另一种方法是使用VBA,每次把数据读到工作表中的一条记录,然后在读的时候把它解析出来。据我所知,在Excel中没有办法在导入过程中设置默认格式,即使你可以设置,也会导致你尝试解析的下一个文件类型出现问题。

0
0
0
2011-07-05 17:29:47 +0000

按照要求,提交我的评论作为回答(添加了更多的信息):

Hey Scripting Guy在博客上写了一篇关于将CSV导入Excel的文章,可能对你有一些有用的小知识。在 powershell 中玩数据对象可能会让你做你想要的事情。

虽然文章中特别提到了将数据导入到单元格中,这可能会留下数字格式,但可能可以使用Excel ComObject的一些属性和方法来强制数据以原始文本的形式进入单元格(或者在导入之前或之后强制将单元格格式化为文本)。

0
0
0
2011-07-06 19:45:53 +0000

由于未知的原因,即使您明确提供所有列的格式,如果文件扩展名是CSV,Excel也会忽略它。

一些选项。

  • 创建一个查询来导入数据,正如Wetmelon 建议 .
    缺点:在64位机器上,你可能缺少CSV数据库驱动程序。

  • 使用Jean的代码,但要把文件复制到一个临时文件夹,并改变副本的扩展名。
    缺点。没有原始文件的链接(保存会覆盖副本),你将不得不手动删除副本。不过,你还是可以在原CSV上手动另存为。

  • 用记事本打开CSV,Ctrl+A,Ctrl+C,粘贴到Excel,然后是数据–文字转列,然后就是常用的向导,你可以一次性将所有列设置为文字。这和前面的选项有异曲同工之妙,因为它还隐藏了Excel中珍贵的扩展名。
    缺点:手动。

  • 有一个非常简单的VBA循环,将整个文件读取到内存中,然后逐个单元格放到工作表上。
    缺点:慢、丑。

-2
-2
-2
2013-03-12 21:37:27 +0000

如果我对这个问题的理解是正确的,使用Paste-Special中的Transpose选项可以很容易地解决这个问题这里