Como posso definir o Excel para importar sempre todas as colunas de arquivos CSV como texto?

68

Embora tente evitá-lo, ocasionalmente tenho que abrir um arquivo CSV no Excel. Quando o faço, formata colunas contendo números, o que os torna inúteis para meus propósitos. Pelo que sei, a única maneira de impedir que isso aconteça na importação é renomear o arquivo para que a extensão não seja .csv e usar o assistente de importação para especificar o formato de cada coluna individualmente. Para arquivos com 50 a 60 colunas, isso é impraticável.

Como todas as respostas para essa pergunta freqüente na Internet sugerem alguns meios de converter os números formatados novamente quando o arquivo for aberto (o que não funcionará para mim - quero resolver o problema geral, não alguns casos específicos) ou selecionando manualmente o tipo de formato de cada coluna (o que não quero fazer), estou procurando uma maneira de definir uma preferência ou estilo global, de modo que todas as colunas de todos os arquivos CSV abertos sejam sempre formatadas como texto. Também sei como "blindar" os números com aspas, mas os arquivos que recebo não são assim e esperava evitar ter que pré-processar os arquivos para que o Excel não estrague tudo.

Existe uma maneira de fazer isso especificamente : sempre formate todas as colunas nos arquivos CSV abertos como texto, sem selecionar manualmente cada coluna todas as vezes durante a importação?

Estou usando o Excel 2003, mas receberei respostas para 2007 se é isso que você sabe.

William Gunn
fonte
11
Hey Scripting Guy publicou um artigo de blog sobre a importação de CSV para o Excel que pode ter alguns detalhes úteis para você. Brincar com o objeto de dados no PowerShell pode permitir que você faça o que deseja. Não postado como resposta, pois é essencialmente apenas um link externo, mas pode ser útil para você.
Matrix Mole

Respostas:

7

Isso funciona:

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

Uso:

OpenCsvAsText "C:\MyDir\MyFile.txt"

O arquivo separado por vírgula agora está aberto como planilha do Excel com todas as colunas formatadas como texto.

Observe que a solução do assistente do @ Wetmelon funciona muito bem, mas se você estiver abrindo muitos arquivos, poderá, como eu, se cansar de cada vez, rolando para a coluna 60 para clicar com a tecla Shift pressionada.

EDIT @GSerg afirma no comentário abaixo que isso "não funciona" e "consome espaços e zeros à esquerda". Vou apenas citar o comentário para a pergunta, que é mais descritiva:

Por motivos desconhecidos, mesmo que você forneça explicitamente formatos para todas as colunas no VBA, o Excel o ignorará se a extensão do arquivo for CSV. Assim que você alterar a extensão, esse mesmo código produzirá os resultados corretos.

Portanto, o código acima "funciona", mas é morto por esse comportamento ridículo do Excel. Qualquer que seja a maneira como você o corta, você está preso tendo que alterar a extensão para algo diferente de ".csv", desculpe! Depois disso, você estará em casa livre.

Jean-François Corbett
fonte
11
Não funciona Come espaços, come zeros à esquerda etc.
GSerg
11
O método usado Workbooks.OpenTexttem suas falhas por design (veja minha resposta abaixo). Use em QueryTablesvez disso.
Nixda
71

Como abrir CSVs no Excel

Bom caminho

  • Excel → Dados → Obter dados externos → Selecione todas as colunas com Shifte escolha Texto

    Cabeça: trata todos os valores corretamente como texto, sem exceção

    Desvantagem: mais etapas do que um simples clique duplo

Maneira ruim

  • Abra um CSV com clique duplo ou a caixa de diálogo Abrir do Excel com

    Desvantagem: o manipulador CSV interno do Excel interpreta mal os valores com um sinal à esquerda -ou inicial =como uma fórmula, em vez de texto

    Desvantagem: você perderá zeros à esquerda de valores binários, 0001devido ao formato de coluna detectado automaticamente pelo Excel

Boa maneira (para VBA)

  • Use QueryTables (a contrapartida do VBA para Get external data) → Código de exemplo

    Cabeça: trata todos os valores corretamente como texto, sem exceção

    Desvantagem: um pouco mais de código que OpenTextmétodo

Mau caminho (para VBA)

  • Use Workbooks.OpenTextmétodo → Código de exemplo

    Desvantagem: esse método ainda está usando o manipulador de importação CSV interno do Excel com todas as suas falhas

    Desvantagem: Além disso, o fieldinfoparâmetro de OpenTexté ignorado se a extensão for CSV. Normalmente, esse parâmetro permite escolher todos os formatos de coluna, mas não se a extensão for CSV. Você pode ler mais sobre esse comportamento no Stack Overflow

    Renomear temporariamente a extensão de origem de CSV para TXT e depois para CSV é uma solução válida se você tiver controle total sobre o arquivo de origem

Métodos adicionais

  • Se você tiver acesso à fonte que cria seu CSV, poderá alterar a sintaxe do CSV.
    Coloque todo valor entre aspas duplas e prefixe um sinal de igual como ="00001"ou adicione uma tabulação a cada valor. Ambas as formas forçarão o Excel a tratar o valor como texto

    Conteúdo original do CSV
    insira a descrição da imagem aqui

    CSV no Excel quando aberto via clique duplo
    insira a descrição da imagem aqui

    Observe como a linha 2 (método de aspas duplas) e a linha 3 (método de tabulação) não são alteradas pelo Excel

  • Abra o CSV no bloco de notas e copie e cole todos os valores no Excel. Em seguida, use Dados - texto em colunas
    Posterior: O texto em Colunas para alterar os formatos das colunas, de geral para o texto, gera resultados inconsistentes. Se um valor contiver um -caractere entre caracteres (por exemplo, "= E1-S1"), o Excel tentará dividir esse valor em mais de uma coluna. Os valores localizados à direita dessa célula podem ser substituídos

    (o comportamento do texto nas colunas foi alterado em algum lugar entre o Excel 2007 e 2013, para que não funcione mais)


Suplemento do Excel para abrir CSVs e importar todos os valores como texto

Este é um plug-in do Excel para simplificar as ações de importação de CSV.
A principal vantagem: é uma solução e usos com um clique QueryTables, o mesmo método à prova de balas por trás de Obter dados externos

  • Ele adiciona um novo comando de menu ao Excel que permite importar arquivos CSV e TXT. Todos os valores são importados para a planilha ativa, começando na célula selecionada no momento
  • O suplemento do Excel está disponível para todas as versões do Office no Windows e Mac
  • Todo o suplemento possui apenas 35 linhas de código. Verifique o código-fonte comentado se você estiver curioso
  • O separador de lista CSV usado (vírgula ou ponto e vírgula) é obtido das configurações locais do Excel
  • Codificação está definida como UTF-8

Instalação

  1. Faça o download do Add-In e guardá-lo para a pasta Add-Ins:%appdata%\Microsoft\AddIns
  2. Abra o Excel e ative o Suplemento: File tab → Options → Add-Ins → Go Toe selecioneImportCSV.xla
  3. Habilite macros VBA: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Reinicie o Excel

Você notará uma nova entrada da barra de menus chamada Suplementos e usará esse botão para abrir rapidamente seus arquivos CSV sem passar pelo incômodo da caixa de diálogo Importar

insira a descrição da imagem aqui


Script do PowerShell para abrir CSVs diretamente do Windows Explorer

Você pode usar um script do PowerShell para abrir arquivos CSV e passá-los automaticamente para o Excel. O script usa silenciosamente o método de importação de texto do Excel, que trata os valores sempre como texto e, como bônus, lida com a codificação UTF-8

  1. Crie um novo arquivo de texto e cole o script abaixo. Uma versão comentada pode ser encontrada aqui
$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. Salve em algum lugar como C:\my\folder\myScript.ps1. (Observe a extensão .ps1)
    • Abra sua pasta sendto através de WinR» shell:sendto» Enter
  2. Crie um novo atalho via Clique com o botão direito do mouse em »Novo» Atalho e cole esta linha. Não se esqueça de mudar o caminho para o seu próprio local em que você colocou seu script. Nomeie o atalho, por exemplo, Excel

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

Agora você pode selecionar (vários) CSVs e abri-los no Excel via Right-click » SendTo » Excel

nixda
fonte
11
O
suplemento
A melhor "melhor maneira" é exatamente o que eu precisava para uma importação única. Não há necessidade de mexer com o VBA e pode até controlar quais colunas são tomadas como data / números (com o restante como texto). Eu gostaria que o Excel oferecesse a abertura desse assistente de importação ao clicar duas vezes em CSV.
ADTC
Olá, agradeço o seu esforço para corrigir links mortos. De fato, o ge.tt apresenta alguns problemas nos últimos meses. Mas acho que corrigi todos os problemas e os links originais antigos devem funcionar novamente. Não sei por que o Google Chrome avisa antes de baixar qualquer coisa do ge.tt. Mas todos os outros navegadores funcionam normalmente e posso garantir que eles não são malware
nixda 7/16/16
@nixda, obrigado por reviver as ligações e para a grande resposta
Vadzim
@nixda Os links para ge.tt estão novamente quebrados. A maioria diz que não está disponível porque o proprietário violou os Termos de Serviço. No entanto, aquele do OpenCSV.exe diz "Esses arquivos não estão mais disponíveis porque violaram os termos de serviço". O que me leva a perguntar: você é o autor da função ImportMyCSV Excel? (código-fonte ainda está disponível no pastebin) Esta é uma ferramenta incrível - eu uso-a no trabalho e a recomendei a outras pessoas. Mas estou interessado na origem do código, se nada mais, para creditar corretamente o autor.
GlennFromIowa
5

Você pode tentar primeiro abrir um .xlsx, depois criar uma conexão de dados e importar o .csv. Selecione delimitado por "vírgula" e, em seguida, selecione a opção para tratar todas as colunas como texto em vez de "Geral".

Edit: Ah, eu não li completamente a pergunta. No assistente de importação, selecione o cabeçalho da primeira coluna que você deseja importar como texto, role até o cabeçalho da coluna final e Shift + Clique no cabeçalho. Em seguida, selecione a opção radial "Texto".


fonte
2
Sim, isso funciona muito bem - desde que a extensão do arquivo não seja ".csv". +1
Jean-François Corbett
4

A sugestão de Wetmelon funciona (mesmo com .CSV) se você fizer o seguinte:

  1. Abra o Excel em uma pasta de trabalho ou planilha em branco
  2. Clique em Dados> [Obter dados externos] do texto
  3. Use o "Assistente para importação de texto", como o Wetmelon descreve (delimitado por vírgulas, selecione a primeira coluna, SHIFT + CLIQUE na última coluna, defina tudo como Texto).

Sei que são mais etapas, mas pelo menos me permite abrir CSVs dessa maneira sem precisar alterar a extensão

Colorado Techie
fonte
2

Cuidado!

Ao usar o método manual "Excel → Dados → Obter dados externos → Selecione todas as colunas e escolha Texto" ......

Isso definirá apenas as colunas para o texto "com dados na primeira linha" (normalmente uma linha de cabeçalho). Este assistente não mostra as colunas mais à direita que podem ter dados mais abaixo, mas não na primeira linha. Por exemplo:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

Você nunca verá a Col 4 no assistente de importação, portanto não terá a opção de alterá-la do geral para o formato de texto antes de importar !!!!

PeterV
fonte
11
Um bom aviso: desde 99,9999% do tempo, as pessoas não rolam para baixo no assistente de importação e, mesmo assim, é difícil capturar todas as colunas. No entanto, tecnicamente, você pode rolar para baixo enquanto estiver no assistente de Importação e capturar colunas adicionais que não possuem dados na primeira linha.
GlennFromIowa
1

Aqui está o procedimento alternativo ao código postado acima por Jean-François Corbett

Este procedimento importará o arquivo csv para o Excel com todas as colunas formatadas como texto

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
shivraj
fonte
Bem-vindo ao superusuário, em vez de adicionar uma nova resposta, você deve ter editado a resposta do Corbett e melhorado. Sei que você ainda não tem reputação suficiente para fazer isso, mas você pode vincular suas alterações no comentário, onde pede que ele o leia.
Vlastimil Ovčáčík 04/12/2015
0

Se você estiver sempre importando os mesmos dados (formato de registro constante, layout, etc ...), poderá gravar uma macro do Access usando uma especificação de importação e depois despejar os dados novamente no Excel. Feito isso pode vezes. A outra maneira que eu fiz isso é usar o VBA e ler os dados na planilha, um registro de cada vez, e analisá-los enquanto lê. Tanto quanto sei, não há como definir um formato padrão durante a importação no Excel e, mesmo se você pudesse, isso causaria problemas com o próximo tipo de arquivo que você tenta analisar.

user88859
fonte
11
Aqui está a coisa - eu não estou tentando fazer nenhuma análise, exceto por colocar a cadeia de texto que estava entre as vírgulas em colunas quando a importo. Se eu precisar que ele seja formatado de uma certa maneira, eu posso fazer isso (como criar datas de datas, etc.), mas eu só preciso dos dados deixados em paz inicialmente. Por que isso deveria ser tão difícil?
William Gunn
0

A pedido, enviando meu comentário como resposta (com um pouco mais de informação adicionada):

Hey Scripting Guy publicou um artigo de blog sobre a importação de CSV para o Excel que pode ter alguns detalhes úteis para você. Brincar com o objeto de dados no PowerShell pode permitir que você faça o que deseja.

Embora o artigo mencione especificamente a importação de dados para as células, o que pode deixar o formato numérico, pode ser possível brincar com algumas das propriedades e métodos do Excel ComObject para forçar os dados a inserir as células como texto bruto (ou forçar a formatação das células em texto antes ou depois da importação).

Matrix Mole
fonte
0

Por motivos desconhecidos, mesmo que você forneça explicitamente formatos para todas as colunas, o Excel o ignorará se a extensão do arquivo for CSV.

Algumas opções:

  • Crie uma consulta para importar os dados, como sugere o Wetmelon .
    Desvantagem: pode estar faltando drivers de banco de dados CSV em uma máquina de 64 bits.

  • Use o código de Jean , mas incorpore a cópia do arquivo em uma pasta temporária e altere a extensão da cópia.
    Desvantagem: Nenhum link para o arquivo original (o salvamento substituirá a cópia); você terá que excluir manualmente a cópia posteriormente. Ainda assim, você pode salvar manualmente como no CSV original.

  • Abra o CSV no bloco de notas Ctrl+A, Ctrl+C, cole para o Excel, em seguida, Dados - Texto para colunas, então é o assistente de costume onde você pode definir todas as colunas de texto de uma só vez. É um sabor diferente da opção anterior, porque também oculta a preciosa extensão do Excel.
    Desvantagem: manual.

  • Tenha um loop VBA muito simples que lê o arquivo inteiro na memória e o coloca na planilha, célula por célula.
    Desvantagem: mais lento, feio.

GSerg
fonte
Não é "Nenhum link para o arquivo [CSV] original" uma desvantagem de todos esses métodos? Eu gosto da ideia de copiar para uma pasta temporária e alterar a extensão lá ... Pode até substituir o original (como CSV) assim que a cópia for aberta.
Jean-François Corbett
@ Jean-FrançoisCorbett, eu uso o Assistente de importação o tempo todo para importar arquivos .csv com uma extensão de csv para o Excel 2010. Especifico explicitamente o formato das colunas como texto e ele mantém o formato da célula como texto. Talvez este tenha sido um problema com versões mais antigas do Excel?
GlennFromIowa
-2

Se eu entendi a pergunta corretamente, isso é facilmente resolvido usando a opção Transpose em Paste-Special, conforme descrito aqui .

Rodger
fonte