Gerando arquivo CSV para Excel, como ter uma nova linha dentro de um valor

158

Eu preciso gerar um arquivo para o Excel, alguns dos valores nesse arquivo contêm várias linhas.

também há texto em inglês, portanto, o arquivo deve ser Unicode.

O arquivo que estou gerando agora tem a seguinte aparência: (em UTF8, com texto não em inglês misturado e com muitas linhas)

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"

Observe que o valor de várias linhas está entre aspas duplas, com uma nova linha normal do dia-a-dia.

De acordo com o que eu achei na Web, isso deveria funcionar, mas, pelo menos, não vence os arquivos do Excel 2007 e UTF8, o Excel trata a terceira linha como a segunda linha de dados e não como a segunda linha da primeira linha de dados .

Isso deve ser executado nas máquinas dos meus clientes e não tenho controle sobre a versão do Excel, portanto, preciso de uma solução que funcione com o Excel 2000 e versões posteriores.

obrigado

EDIT: "resolvi" o meu problema tendo duas opções de CSV, uma para o Excel (Unicode, tabulação separada, sem novas linhas nos campos) e uma para o resto do mundo (UTF8, CSV padrão).

Não é o que eu estava procurando, mas pelo menos funciona (até agora)

Nir
fonte
1
FYI: Tudo isso funciona perfeitamente no LibreOffice e importar um CSV é muito mais fácil em primeiro lugar.
user2061057
9
A resposta aceita sobre os espaços extras é incrivelmente confuso agora que você editou suas perguntas e removido os espaços ...
Matti Virkkunen

Respostas:

70

Você deve ter caracteres de espaço SOMENTE no início dos campos, onde os caracteres de espaço fazem parte dos dados. O Excel não removerá os espaços à esquerda. Você receberá espaços indesejados em seus cabeçalhos e campos de dados. Pior, o "que deveria estar "protegendo" essa quebra de linha na terceira coluna será ignorado porque não está no início do campo.

Se você tiver caracteres não ASCII (codificados em UTF-8) no arquivo, deverá ter uma BOM UTF-8 (3 bytes hex EF BB BF) no início do arquivo. Caso contrário, o Excel interpretará os dados de acordo com a codificação padrão do código de idioma (por exemplo, cp1252) em vez de utf-8, e seus caracteres não ASCII serão descartados.

Os comentários a seguir se aplicam ao Excel 2003, 2007 e 2013; não testado no Excel 2000

Se você abrir o arquivo clicando duas vezes em seu nome no Windows Explorer, tudo funcionará bem.

Se você abri-lo no Excel, os resultados variam:

  1. Você possui apenas caracteres ASCII no arquivo (e nenhuma BOM): funciona.
  2. Você possui caracteres não ASCII (codificados em UTF-8) no arquivo, com uma lista técnica de UTF-8 no início: reconhece que seus dados estão codificados em UTF-8, mas ignora a extensão csv e o coloca no texto Importe não um assistente , infelizmente com o resultado que você obtém o problema de quebra de linha.

As opções incluem:

  1. Treine os usuários para não abrir os arquivos no Excel :-(
  2. Considere escrever um arquivo XLS diretamente ... existem pacotes / bibliotecas disponíveis para fazer isso em Python / Perl / PHP / .NET / etc
John Machin
fonte
1
Obrigado, corrigi o problema de espaços à esquerda na pergunta, digitei o exemplo CSV manualmente e não copiei e colei de um arquivo real, o arquivo real não inclui esses espaços, boa captura.
Nir
@ Nir: Agora vamos falar sobre o seu problema real. Isso significa que você tinha uma lista técnica UTF-8, abriu o arquivo no Excel e fez com que o Assistente para importação de texto não reconhecesse que sua nova linha Value3 deveria estar "protegida" - correto? Ou talvez você não tenha uma lista técnica UTF-8 e tenha que informar à TIW que seus dados foram codificados em UTF-8 e ainda assim atrapalhou a nova linha?
John Machin
E se eu quiser usar | como separador de campos, nova linha como separador de registros, use "para proteger o conteúdo dos campos de texto, e os campos de texto podem conter |," e nova linha. Isso é possível?
Giorgio
1
FYI: Eu tenho o Excel2007 e o CSV exportados do sistema Redmine. Após adicionar o UTF-8 BOM (EFBBBF) no início, o Excel abriu o arquivo perfeitamente. Novas linhas incorporadas no colun "descrição do problema" são processadas corretamente, a estrutura da linha não é danificada e todos os caracteres nacionais são lidos corretamente (eles foram lixeira na leitura sem a UTF8 BOM). O Excel nem mesmo exibiu o assistente de importação de texto. Atualmente, esse CSV agora tem EFBBBFcabeçalho, usa 0Acomo separador de linha e 0D0Acomo nova linha dentro de cadeias de caracteres nas células de texto.
quetzalcoatl
1
Se você está tentando fazer com que o Excel para OS X leia seu CSV corretamente, assim como o Excel para Windows, aqui está um ótimo recurso: stackoverflow.com/questions/4348802/…
Alexandre R. Janini
25

Após muitos ajustes, eis uma configuração que funciona gerando arquivos no Linux, lendo no Windows + Excel, embora o formato de nova linha incorporado não esteja de acordo com o padrão :

  • Novas linhas em um campo precisam ser \ n (e obviamente entre aspas duplas)
  • Fim do registro: \ r \ n
  • Certifique-se de não iniciar um campo com iguais, caso contrário, ele será tratado como uma fórmula e truncado

No Perl, usei Text :: CSV para fazer o seguinte:

use Text::CSV;

open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!";
my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" });

#for each row...:
$csv -> print ($FO, \@row);
Ian
fonte
3
Sim, isso foi feito. Posso confirmar que isso funciona com Windows + Excel, OSX + Numbers e Google Docs.
Yorick Sijsling
3
Usando \ n (também tentei \ n) em um campo delimitado por "e usando \ r \ n para dividir linhas. Ainda não corrigi esse problema para mim no Excel 2010. Tentei ANSI e UTF8-with-BOM. Sem sucesso
nl-x
1
Mas isso é porque eu uso | como separador de campos. Se eu usar; como separador de campos, o problema ainda existe ao importar dados CSV, mas desaparece ao abrir o CSV clicando duas vezes no Gerenciador de Arquivos.
Nl-x
2
A resposta de Ian não está funcionando para mim no Excel 2003/2010 no Windows 7. Tentei usar um editor hexadecimal para editar meu arquivo UTF-8 BOM e removi 0D (\ r) dos bits '0D0A' (\ r \ n) para novas linhas nos campos. Mas isso não funciona.
Dan W
Esta resposta funcionou para mim (com zero modificações!) Usando o Excel 2010 e o Windows 7; usando também o perl v5.14.2 que acompanha o cygwin. Minhas novas linhas incorporadas eram todas \n. Obrigado
ardnew
21

Recentemente tive um problema semelhante, resolvi-o importando um arquivo HTML , o exemplo da linha de base seria assim:

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
  <head>
    <style>
      <!--
      br {mso-data-placement:same-cell;}
      -->
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td>first line<br/>second line</td>
        <td style="white-space:normal">first line<br/>second line</td>
      </tr>
    </table>
  </body>
</html>

Eu sei, não é um CSV e pode funcionar de maneira diferente para várias versões do Excel, mas acho que vale a pena tentar.

Eu espero que isso ajude ;-)

dtldarek
fonte
35
@GusDeCooL A redação da primeira frase do OP "Preciso gerar um arquivo para o Excel, alguns dos valores desse arquivo contêm várias linhas". sugere que talvez ele não precise ser um arquivo CSV. Além disso, o formato de perguntas e respostas também se aplica a outros leitores e pode ser uma opção viável para alguns deles (mesmo que o OP tenha que usar CSV). Acho seu voto negativo irracional (ainda assim, obrigado por explicar o porquê).
dtldarek
1
Essa foi a melhor opção para mim; obrigado por sugerir!
Jordan Gray
8

É importante observar que, quando um arquivo .CSV tiver campos agrupados entre aspas duplas que contenham quebras de linha, o Excel não importará o arquivo .CSV corretamente se o arquivo .CSV for gravado no formato UTF-8. O Excel trata a quebra de linha como se fosse CR / LF e inicia uma nova linha. A planilha está ilegível. Isso parece verdade mesmo se ponto-e-vírgula forem usados ​​como delimitadores de campo (em vez de vírgulas).

O problema pode ser resolvido usando o Bloco de notas do Windows para editar o arquivo .CSV, usando Arquivo> Salvar como ... para salvar o arquivo e, antes de salvar o arquivo, altere a codificação do arquivo de UTF-8 para ANSI. Depois que o arquivo é salvo no formato ANSI, acho que o Microsoft Excel 2013 em execução no Windows 7 Professional importará o arquivo corretamente.

OneSkyWalker
fonte
7

A nova linha dentro de um valor parece funcionar se você usar ponto e vírgula como separador, em vez de vírgula ou tabulação, e usar aspas.

Isso funciona para mim no Excel 2010 e no Excel 2000. No entanto, surpreendentemente, funciona apenas quando você abre o arquivo como uma nova planilha, e não quando o importa para uma planilha existente usando o recurso de importação de dados.

Esben
fonte
sim, mas então eu não encontrou opção de fazer a linha final com ponto e vírgula em excel
GusDeCooL
E se alguns dos dados de texto reais contiverem ponto e vírgula? Isso não funcionaria.
Htm11h
4

Em um PC, o caractere ASCII nº 10 é o que você deseja colocar em uma nova linha dentro de um valor.

No entanto, depois de inseri-lo no Excel, verifique se a quebra de linha está ativada para as células com várias linhas ou se a nova linha aparecerá como uma caixa quadrada.

devuxer
fonte
3

Isso não funcionará se você tentar importar o arquivo para o Excel.

Associe a extensão de arquivo csv ao EXCEL.EXE para poder chamar o EXCEL clicando duas vezes no arquivo csv.

Aqui, coloco algum texto seguido pelo NewLine Char seguido de mais texto E colocando a string inteira entre aspas duplas.

Não use um CR, pois o EXCEL colocará parte da string na próxima célula.

""text" + NL + "text""

Ao invocar o EXCEL, você verá isso. Talvez você precise dimensionar automaticamente a altura para ver tudo. Onde as quebras de linha dependerá da largura da célula.

2

ENCONTRO

Aqui está o código no Basic

CHR$(34,"2", 10,"DATE", 34)
Peabody
fonte
2

Eu encontrei isso e funcionou para mim

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

Então, onde você precisa ter coisas fechadas

$myfile = ('/path/to/myfile.csv');
//erase any previous contents
$fp = fopen($myfile, 'w+');
fwrite($fp, $enc1 .  'Column Heading 1' . $enc1 . $delimiter );
//append to new file
$fp2 = fopen($myfile, 'a');
fwrite($fp2, $enc1 .  'Column Heading 2' . $enc1 . $delimiter );

.....

fwrite($fp2, $enc1 .  'Last Column Heading' . $enc1 . $delimiter. PHP_EOL );

Então, quando você precisar escrever algo, como HTML, que inclui o "você pode fazer isso

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

Novas linhas terminam com . PHP_EOL

O final do script imprime um link para que o usuário possa baixar o arquivo.

echo 'Click <a href="myfile.csv">here</a> to download file';
Lisa Simpson
fonte
1

Os arquivos UTF que contêm uma BOM farão com que o Excel trate novas linhas literalmente, mesmo nesse campo, entre aspas. (Mac testado do Excel 2008)

A solução é tornar qualquer nova linha um retorno de carro (CHR 13) em vez de um avanço de linha.

Stephen
fonte
O Excel 2016 parece tratar meu arquivo CSV corretamente, mesmo que tenha uma BOM UTF8. No entanto, o que fez toda a diferença é usar ';' como um separador de campos (que é o que o Excel faz para todas as localidades que possuem ',' como separador decimal).
Ale
1

Teste isto: Funciona totalmente para mim: Coloque as seguintes linhas em um xxxx.csvarquivo

hola_x,="este es mi text1"&CHAR(10)&"I sigo escribiendo",hola_a

hola_y,="este es mi text2"&CHAR(10)&"I sigo escribiendo",hola_b

hola_z,="este es mi text3"&CHAR(10)&"I sigo escribiendo",hola_c

Abra com o excel.

em alguns casos, será aberto diretamente, caso contrário, será necessário usar a conversão de coluna para dados. expanda a largura da coluna e pressione o botão Quebrar texto. ou formate células e ative o texto de quebra automática.

e obrigado pelas outras sugestões, mas elas não funcionaram para mim. Estou em um ambiente puro do Windows e não queria brincar com unicode ou outra coisa engraçada.

Dessa forma, você coloca uma fórmula do csv para o excel. Pode haver muitos usos para esse método de trabalho. (observe o = antes das aspas)

pd: Em suas sugestões, coloque algumas amostras dos dados e não apenas do código.

Ivan Cev
fonte
1

colocar "\ r" no final de cada linha realmente teve o efeito de quebras de linha no Excel, mas no .csv ele desapareceu e deixou uma bagunça feia, onde cada linha foi comprimida contra a seguinte sem espaço e sem quebras de linha

Duncan Wallace
fonte
0

A maneira como fazemos isso (usamos o VB.Net) é incluir o texto com novas linhas no Chr (34), que é o caractere que representa as aspas duplas e substitui todos os caracteres CR-LF por LF.

Sebastian
fonte
0

Normalmente, uma nova linha é "\ r \ n". No meu CSV, substituí "\ r" por um valor vazio. Aqui está o código em Javascript:

cellValue = cellValue.replace(/\r/g, "")

Quando abro o CSV no MS Excel, funcionou bem. Se um valor tiver várias linhas, ele permanecerá dentro de uma única célula na planilha do Excel.

Tam Tran
fonte
0

Somente para arquivo aberto , a sintaxe é

 ,"one\n
 two",...

O ponto crítico é que não há espaço após o primeiro ",". Normalmente, os espaços são bons e aparados se a sequência não estiver entre aspas. Mas por outro lado desagradável. Levei um tempo para descobrir isso.

Parece que não importa se a linha termina \ n ou \ c \ n.

Certifique-se de expandir a barra de fórmulas para poder ver o texto na célula (depois de um longo dia ...)

Agora, é claro, o File Open não suporta UTF-8 corretamente (a menos que se use truques).

Excel> Dados> Obter dados externos > Do texto

Pode ser definido no modo UTF-8 (está abaixo da lista de fontes). No entanto, nesse caso, as novas linhas parecem não funcionar e não sei como consertar isso.

(Pode-se concluir que, após 30 anos, a EM conseguiria acertar essas coisas.)

Tuntable
fonte
0

No Excel 365 ao importar o arquivo:

Dados -> Do Texto / CSV -> Selecione Arquivo> Transformar Dados -> Configuração da Fonte de Dados -> Selecione Fonte de Dados -> Clique em Editar Origem -> Na lista suspensa de quebra de linha, selecione Ignorar quebras de linha entre aspas.

O texto acima foi traduzido do português para que o texto possa ser diferente em inglês.

Clodoaldo Neto
fonte
-1

você pode fazer o próximo "\"Value3 Line1 Value3 Line2\"". Funciona para mim gerar um arquivo csv em java

Fredy Chica
fonte
-2

Aqui está uma abordagem interessante usando JavaScript ...

  String.prototype.csv = String.prototype.split.partial(/,\s*/);  

  var results = ("Mugan, Jin, Fuu").csv();                        

  console.log(results[0]=="Mugan" &&                                   
         results[1]=="Jin" &&                                     
         results[2]=="Fuu",                                       
         "The text values were split properly");                  
ddeloy
fonte
-3

Imprimir uma nova linha HTML <br/>no conteúdo e abrir no excel funcionará bem em qualquer excel

Shashi
fonte
-3

Você pode usar o atalho de teclado ALT + Enter.

  1. Selecione a célula que você deseja editar
  2. entre no modo de edição clicando duas vezes nele ou pressionando F2. 3. Pressione Alt + enter. Isso criará uma nova linha na célula
Meghana Chamarthy
fonte
Como você integra isso à geração de arquivos CVS?
jikuja