Excel CSV - formato de célula numérica

86

Eu produzo um relatório como um arquivo CSV. Quando tento abrir o arquivo no Excel, ele faz uma suposição sobre o tipo de dados com base no conteúdo da célula e o reformata de acordo.

Por exemplo, se o arquivo CSV contém

...,005,...

Em seguida, o Excel mostra como 5. Existe uma maneira de substituir isso e exibir 005?

Eu preferiria fazer algo no próprio arquivo, para que o usuário pudesse apenas clicar duas vezes no arquivo CSV para abri-lo.

Eu uso o Excel 2003.

Sergey Stadnik
fonte
Veja esta questão para uma solução macro para este problema.
Adam Jensen
Hoje em dia existem muitas bibliotecas de escrita em Excel por aí. Deve ser muito fácil criar arquivos .xlsx no idioma de sua escolha. Se os seus usuários ainda estiverem usando o Excel 2003 por algum motivo (comum quando essa pergunta foi feita originalmente, mas espero que não seja muito provável hoje), também existem algumas opções de produção de .xls. Para as pessoas que estão se deparando com essa pergunta hoje, é muito provável que você não precise fazer a sua própria pergunta.
John Y

Respostas:

129

Não há uma maneira fácil de controlar a formatação que o Excel aplica ao abrir um arquivo .csv. No entanto, estão listadas abaixo três abordagens que podem ajudar.

Minha preferência é a primeira opção.

Opção 1 - Alterar os dados no arquivo

Você pode alterar os dados no arquivo .csv da seguinte maneira ..., = ”005” , ... Isso será exibido no Excel como ..., 005 , ...

O Excel terá mantido os dados como uma fórmula, mas copiar a coluna e usar os valores especiais colar irá livrar-se da fórmula, mas manterá a formatação

Opção 2 - formatar os dados

Se for simplesmente um problema de formato e todos os seus dados nessa coluna tiverem um comprimento de três dígitos. Em seguida, abra os dados no Excel e formate a coluna que contém os dados com este formato personalizado 000

Opção 3 - Alterar a extensão do arquivo para .dif (formato de intercâmbio de dados)

Altere a extensão do arquivo e use o assistente de importação de arquivo para controlar os formatos. Arquivos com extensão .dif são abertos automaticamente pelo Excel ao clicar duas vezes em.

Passo a passo:

  • Altere a extensão do arquivo de .csv para .dif
  • Clique duas vezes no arquivo para abri-lo no Excel.
  • O 'Assistente de importação de arquivo' será iniciado.
  • Defina o 'Tipo de arquivo' como 'Delimitado' e clique no botão 'Avançar'.
  • Em Delimitadores, marque 'Vírgula' e clique no botão 'Avançar'.
  • Clique em cada coluna de seus dados exibida e selecione um 'Formato de dados da coluna'. A coluna com o valor '005' deve ser formatada como 'Texto'.
  • Clique no botão finalizar, o arquivo será aberto pelo Excel com os formatos que você especificou.
Robert Mearns
fonte
8
.dif não funcionou na minha máquina; a abertura manual com o Excel 2007 não funcionou (avisou que o tipo de arquivo era diferente da extensão) e parece que .DIF está associado ao Quicktime em muitos computadores. Apenas para sua informação :) Caso contrário, ótimas dicas!
Nicholas
15
Acho que a opção 1 é a melhor, se você quiser uma maneira descomplicada de gerar um arquivo que "simplesmente funcione" - ou seja, ele abre no computador do usuário no Excel sem exigir que eles façam nenhum trabalho adicional.
Kip
Eu tenho o mesmo problema e nenhuma das opções acima é apropriada, desculpe. Pensando que posso exportar como XML e usar XSLT para ir para CSV. Preciso que o arquivo CSV esteja correto para que possa ser importado para outro aplicativo
Matt
1
Observe que a opção 1 nem sempre é boa, se você tiver uma célula, digamos "1E02, qualquer texto" e, em seguida, colocar um igual na frente, o Excel irá imaginar que você inseriu uma fórmula. Primeiro, a fórmula estará errada, mas, em segundo lugar, e o mais importante, ela dividirá seu texto em 2 células.
ghiscoding de
1
Obrigado pela opção 1. Corrigido meu problema de notação científica sem nenhum trabalho extra.
NaN
28

Não use CSV, use SYLK.
http://en.wikipedia.org/wiki/SYmbolic_LinK_(SYLK)

Ele oferece muito mais controle sobre a formatação e o Excel não tentará adivinhar o tipo de um campo examinando o conteúdo. Parece um pouco complicado, mas você pode se safar usando um subconjunto muito pequeno.

Mark Ransom
fonte
2
+1 Escrever para SYLK é simples de implementar, fiz isso como novato.
Matt H
1
Eu não sabia sobre esse formato. Parece algo que eu poderia usar. 1 para isso!
Buggabill
1 Levei cinco minutos para mudar de CSV para SYLK. Meu formato de saída goto de agora em diante!
TheFish
@xamde, você está certo. É estranho que eles nunca tenham estendido o formato para suportá-lo, como fizeram com o RTF.
Mark Ransom
WTF, ou o que alguém recomendaria, cito da Wikipedia: "A Microsoft não publica uma especificação SYLK."
Sorin
14

Isso funciona para Microsoft Office 2010, Excel Versão 14

Não entendi bem a preferência do OP de "fazer algo com o próprio arquivo". Ainda estou guardando para quem deseja uma solução para formatar a importação diretamente

  1. Abra um arquivo em branco (novo) (Arquivo -> Novo da pasta de trabalho)
  2. Abra o Assistente de Importação (Dados -> Do Texto)
  3. Selecione seu arquivo .csv e importe
  4. Na caixa de diálogo, escolha 'Delimitado' e clique em Avançar.
  5. Escolha seus delimitadores (desmarque tudo, exceto 'vírgula'), escolha seus qualificadores de texto (provavelmente {Nenhum}), clique em Próximo
  6. No campo Visualização de dados , selecione a coluna que você deseja que seja o texto. Deve destacar.
  7. No campo Formato de dados da coluna , selecione 'Texto'.
  8. Clique em concluído.

fonte
explicado com imagens: support.insight.ly/hc/en-us/articles/…
Yo Ludke
2

Você pode simplesmente formatar seu intervalo como Texto.

Também aqui está um bom artigo sobre os formatos de número e como você pode programá-los.

Ólafur Waage
fonte
Isso afetará apenas como o valor é exibido. Você precisa convertê-lo em texto, com uma fórmula ou durante a importação, com um dos muitos métodos disponíveis neste tópico
leo
2

Na verdade, descobri que, pelo menos a partir do Office 2003, você pode salvar uma planilha do Excel como um arquivo XML. Assim, posso produzir um arquivo XML e ao clicar duas vezes nele, ele será aberto no Excel. Ele fornece o mesmo nível de controle que SYLK, mas a sintaxe XML é mais intuitiva.

Sergey Stadnik
fonte
2

Adicionar um espaço ininterrupto na célula pode ajudar. Por exemplo: "firstvalue";"secondvalue";"005 ";"othervalue"

Isso força o Excel a tratá-lo como um texto e o espaço não fica visível. No Windows, você pode adicionar um espaço ininterrupto digitando alt + 0160. Veja aqui para mais informações: http://en.wikipedia.org/wiki/Non-breaking_space

Tentei no Excel 2010. Espero que isso possa ajudar as pessoas que ainda buscam uma solução bastante adequada para este problema.

Kloe2378231
fonte
2

Eu tive esse problema ao exportar dados CSV do código C # e resolvi isso adicionando o caractere de tabulação \ t antes dos dados do zero à esquerda, então os dados foram interpretados como texto em vez de numéricos no Excel (mas ao contrário de outros caracteres, não ser visto).

Eu gostei da abordagem = "001", mas isso não permitiria que os dados CSV exportados fossem reimportados para meu aplicativo C # sem remover toda a formatação do arquivo CSV de importação (em vez disso, apenas cortarei os dados de importação) .

Richard Pursehouse
fonte
1

Acredito que quando você importa o arquivo, você pode selecionar o tipo de coluna. Torne-o Texto em vez de Número. Não tenho uma cópia na minha frente no momento para verificar, no entanto.

Harley Holcombe
fonte
1

Carregar csv em oleDB e forçar todos os tipos de dados inferidos para string

Eu fiz a mesma pergunta e respondi com o código.

basicamente, quando o arquivo csv é carregado, o driver oledb faz suposições, você pode dizer quais suposições fazer.

Meu código força todos os tipos de dados a uma string ... é muito fácil alterar o esquema. para meus propósitos, usei um xslt para fazer o ti da maneira que queria - mas estou analisando uma grande variedade de arquivos.

João nicholas
fonte
1

Sei que essa é uma pergunta antiga, mas tenho uma solução que não está listada aqui.

Quando você produz o csv, adicione um espaço após a vírgula, mas antes do seu valor, por exemplo , 005,.

Isso funcionou para evitar a formatação automática de data no Excel 2007 de qualquer maneira.

plntxt
fonte
2
Acabei de testar, não parece funcionar com Excel 2007 e uma coluna de número. : - /
Norman H
1

O método do Assistente de importação de texto NÃO funciona quando o arquivo CSV importado tem quebras de linha em uma célula. Este método lida com este cenário (pelo menos com dados delimitados por tabulação):

  1. Criar novo arquivo Excel
  2. Ctrl + A para selecionar todas as células
  3. Na caixa de combinação Number Format, selecione Text
  4. Abrir arquivo delimitado por tabulação no editor de texto
  5. Selecione tudo, copie e cole no Excel
Picles
fonte
1

Basta adicionar 'antes do número no documento CSV.

MNassar
fonte
Isso não funcionou no Excel 2010 ('torna-se parte do conteúdo da célula).
sancho.s ReinstateMonicaCellio
1

Isso tem me deixado louco o dia todo (já que você não pode controlar os tipos de coluna do Excel antes de abrir o arquivo CSV), e funcionou para mim, usando VB.NET e Excel Interop:

        '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
Ellen
fonte
0

Ao abrir um CSV, você obtém o assistente de importação de texto. Na última etapa do assistente, você deve ser capaz de importar a coluna específica como texto, mantendo assim o prefixo '00'. Depois disso, você pode formatar a célula da maneira que desejar.

Tentei com o Excel 2007 e pareceu funcionar.

Marca
fonte
1
O Excel 2003 não abre o assistente.
Sergey Stadnik
0

Bem, o Excel nunca exibe o assistente para arquivos CSV. Se você renomeá-lo para .txt, verá o assistente quando fizer um Arquivo> Abrir no Excel na próxima vez.

Narayanan
fonte
0

Coloque uma aspa simples antes do campo. O Excel o tratará como texto, mesmo que se pareça com um número.

...,`005,...

EDIT: Isso está errado. O truque do apóstrofo só funciona ao inserir dados diretamente no Excel. Quando você o usa em um arquivo CSV, o apóstrofo aparece no campo, o que você não quer.

http://support.microsoft.com/kb/214233

JW.
fonte
4
Isso é algo que as pessoas provavelmente tentarão. Portanto, saber que não funcionará é útil e economiza tempo.
AndyM