2009-08-06 20 views
119

Necesito generar un archivo para Excel, algunos de los valores en este archivo contienen varias líneas.Generar archivo CSV para Excel, cómo tener una nueva línea dentro de un valor

también hay texto que no está en inglés, por lo que el archivo debe ser Unicode.

El archivo que estoy generando ahora se ve así: (en UTF8, con el texto Inglés no mezclarse en y con una gran cantidad de líneas)

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

Nota el valor de varias líneas se encierra entre comillas dobles , con una línea nueva normal todos los días.

De acuerdo con lo que encontré en la web, se supone que debe funcionar, pero no, al menos no gana archivos Excel 2007 y UTF8, Excel trata la tercera línea como la segunda fila de datos, no como la segunda línea de la primera fila de datos.

Esto tiene que ejecutarse en las máquinas de mis clientes y no tengo control sobre su versión de Excel, por lo que necesito una solución que funcione con Excel 2000 y posterior.

Gracias

EDIT: "resuelto" mi problema por tener dos opciones CSV, uno para Excel (Unicode, separadas por tabuladores, no hay saltos de línea en los campos) y otro para el resto del mundo (UTF8, estándar CSV)

No era lo que estaba buscando, pero al menos funciona (hasta ahora)

+1

FYI: Todo esto funciona perfectamente en LibreOffice e importar un CSV es mucho más fácil en primer lugar. – user2061057

+2

La respuesta aceptada sobre los espacios adicionales es increíblemente confusa ahora que ha editado sus preguntas y eliminado los espacios ... –

Respuesta

54

Debe tener caracteres de espacio al comienzo de los campos SÓLO donde los caracteres de espacio son parte de los datos. Excel no se despojará de los espacios principales. Obtendrá espacios no deseados en sus títulos y campos de datos. Peor aún, el " que debería estar "protegiendo" ese salto de línea en la tercera columna será ignorado porque no está al comienzo del campo.

Si tiene caracteres no ASCII (codificados en UTF-8) en el archivo, debe tener una BOM UTF-8 (3 bytes, hex EF BB BF) al comienzo del archivo. De lo contrario, Excel interpretará los datos de acuerdo con la codificación predeterminada de su configuración regional (por ejemplo, cp1252) en lugar de utf-8, y los caracteres que no sean ASCII se descartarán.

Los siguientes comentarios se aplican a Excel 2003, 2007 y 2013; no probado en Excel 2000

Si abre el archivo haciendo doble clic en su nombre en el Explorador de Windows, todo funciona bien.

Si abre desde dentro de Excel, los resultados varían:

  1. Usted tiene sólo caracteres ASCII en el archivo (y sin BOM): obras.
  2. Tiene caracteres no ASCII (codificados en UTF-8) en el archivo, con una lista de materiales UTF-8 al inicio: reconoce que sus datos están codificados en UTF-8, pero ignora la extensión csv y lo deja caer en el Text Import not-a-Wizard, desafortunadamente con el resultado de que obtiene el problema de salto de línea.

Las opciones incluyen:

  1. Tren de los usuarios que no abran los archivos desde dentro de Excel :-(
  2. que no escribe un archivo XLS directamente ... hay paquetes/bibliotecas disponibles para hacer eso en Python/Perl/PHP/.NET/etc
+1

Gracias, solucioné el problema de los espacios iniciales en la pregunta, escribí el ejemplo CSV manualmente y no copié -paso de un archivo real, el archivo real no incluye esos espacios, buena captura. – Nir

+0

@Nir: Ahora hablemos de su problema real. Eso significa que tenía una lista de materiales UTF-8, y abrió el archivo desde Excel e hizo que el Asistente de importación de texto no reconociera que su nueva línea Value3 debería estar "protegida", ¿correcto? ¿O quizás no tenías una BOM UTF-8 y tenías que decirle al TIW que tus datos estaban codificados en UTF-8 y aún así cometió un error en la nueva línea? –

+0

¿Qué sucede si quiero usar | como separador de campo, nueva línea como separador de registros, use "para proteger el contenido de los campos de texto, y los campos de texto pueden contener |," y una nueva línea. es posible? – Giorgio

3

En un PC, caracteres ASCII # 10 es lo que desea colocar una nueva línea dentro de un valor.

Una vez que lo tiene en Excel, sin embargo, debe asegurarse de que el ajuste de palabras está activado para las celdas de varias líneas o la nueva línea aparecerá como un recuadro cuadrado.

0

la forma en que lo hacemos (usamos VB.Net) es encerrar el texto con nuevas líneas en Chr (34), que es el carbón que representa las comillas dobles y reemplace todos los caracteres CR-LF por LF.

0

me encontré con esto y que ha trabajado para mí

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

Entonces, ¿dónde es necesario tener cosas encerrado

$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); 

Luego, cuando se necesita escribir algo, como HTML que incluye el "usted puede hacer esto

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

nuevas líneas terminan con . PHP_EOL

El final de la secuencia de comandos imprime un enlace de manera que el usuario puede descargar el archivo.

echo 'Click <a href="myfile.csv">here</a> to download file'; 
5

nueva línea dentro de un valor parece funcionar si se utiliza punto y coma como separador, en lugar de la coma o ficha, y el uso de comillas.

Esto me funciona tanto en Excel 2010 como en Excel 2000. Sin embargo, sorprendentemente, funciona solo cuando abre el archivo como una nueva hoja de cálculo, no cuando la importa a una hoja de cálculo existente utilizando la función de importación de datos.

+0

sí, pero luego no encontré la opción para hacer que la línea final con punto y coma en excel – GusDeCooL

+0

¿Qué pasa si algunos de los datos de texto reales contienen punto y coma? Esto no funcionaria – htm11h

1

Los archivos UTF que contienen una lista de materiales provocarán que Excel trate nuevas líneas literalmente, incluso en ese campo está rodeado por comillas. (Probado Excel 2008 Mac)

La solución es hacer que cualquier línea nueva sea un retorno de carro (CHR 13) en lugar de un avance de línea.

20

Después de un montón de ajustes, aquí es una configuración que funciona generar archivos en Linux, la lectura en Windows + Excel

  • saltos de línea dentro de un campo necesita ser \ n (y, obviamente, citado entre comillas dobles)
  • final de la comunicación: \ r \ n
  • Asegúrese de que no se empieza un campo con los iguales, de lo contrario, se trata como una fórmula y truncada

En Perl, solía Texto :: CSV hacer esta de la siguiente manera:

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); 
+2

Sí eso \ r \ n lo hizo. Puedo confirmar que esto funciona con Windows + Excel, OSX + Numbers y Google Docs. –

+1

Usando \ n (también intenté \ n) en un campo adjunto con ", y usando \ r \ n para dividir filas. Todavía no solucioné este problema en Excel 2010. Probé ANSI y UTF8-with-BOM No éxito –

+0

Pero esto es porque utilizo | como separador de campo. Si lo utilizo como separador de campo, el problema persiste al importar datos CSV, pero el problema desaparece al abrir el archivo CSV al hacer doble clic en él en el Explorador de archivos –

-2

Aquí es un enfoque interesante el uso de 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");     
13

recientemente he tenido problema similar, que lo resolvió mediante la importación de un archivo HTML , el ejemplo de referencia sería como esto:

<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> 

lo sé, no es un CSV y funcionen de forma diferente según las diferentes versiones de Excel, pero creo que vale la pena intentarlo.

espero que esto ayuda ;-)

+0

downvote, no es un CSV. – GusDeCooL

+20

@GusDeCooL La fraseología de la primera oración de OP "Necesito generar un archivo para Excel, algunos de los valores en este archivo contienen múltiples líneas". sugiere que tal vez no necesite ser un archivo CSV. Además, el formato de preguntas y respuestas también se aplica a otros lectores, y podría ser una opción viable para algunos de ellos (incluso si el OP tuviera que usar CSV). Creo que su voto negativo es irracional (aún así, gracias por explicarme por qué). – dtldarek

+0

Es una buena idea. –

2

Esto no funcionará si intenta importar el archivo en Excel.

Asociar la extensión de archivo csv con EXCEL.EXE para que pueda invocar EXCEL haciendo doble clic en el archivo csv.

Aquí coloco un texto seguido de NewLine Char seguido de un poco más de texto Y encerrando toda la cadena con comillas dobles.

No use un CR ya que EXCEL colocará parte de la cadena en la celda siguiente.

""text" + NL + "text"" 

Cuando se invoca EXCEL, verá esto. Es posible que tenga que ajustar automáticamente la altura para verlo todo. Donde la línea se rompe dependerá del ancho de la celda.

FECHA

Aquí está el código en Básico

CHR$(34,"2", 10,"DATE", 34) 
-3

Impresión de una nueva línea de HTML <br/> en el contenido y la apertura en Excel no tendrán ningún problema en cualquier sobresalen

-1

que pueda hacer el siguiente "\" Value3 Line1 Value3 Line2 \ "". Funciona para mí generar un archivo csv en java

5

Vale la pena señalar que cuando un archivo .CSV tiene campos envueltos entre comillas dobles que contienen saltos de línea, Excel no importará el archivo .CSV correctamente si el archivo .CSV es escrito en formato UTF-8. Excel trata el salto de línea como si fuera CR/LF y comienza una nueva línea. La hoja de cálculo está distorsionada. Eso parece ser cierto incluso si se usan puntos y comas como delimitadores de campo (en lugar de comas).

El problema se puede resolver usando el Bloc de notas de Windows para editar el archivo .CSV, usando Archivo> Guardar como ... para guardar el archivo, y antes de guardarlo, cambiando la codificación del archivo de UTF-8 a ANSI. Una vez que el archivo se guarda en formato ANSI, entonces descubro que Microsoft Excel 2013 ejecutándose en Windows 7 Professional importará el archivo correctamente.

+0

Gracias, esto funcionó para Excel 2016. – Henry

0

Normalmente, una nueva línea es "\ r \ n". En mi CSV, reemplacé "\ r" con el valor vacío. Aquí es código en Javascript:

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

Al abrir el CSV en MS Excel, funcionó bien. Si un valor tiene varias líneas, permanecerá dentro de 1 sola celda en la hoja de Excel.

1

Prueba esto: Funciona totalmente para mí: Poner las siguientes líneas en un archivo xxxx.csv

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 

Abrir con Excel.

en algunos casos se abrirá directamente, de lo contrario tendrá que usar la conversión de columna a datos. expanda el ancho de la columna y presione el botón Ajustar texto. o formatee celdas y active texto envolvente.

y gracias por las otras sugerencias, pero no funcionó para mí. Estoy en un entorno de Windows puro, y no quería jugar con unicode u otra cosa graciosa.

De esta manera usted pone una fórmula de csv para sobresalir. Puede ser muchos usos para este método de trabajo. (observe el = antes de las comillas)

pd: En sus sugerencias, por favor ponga algunas muestras de los datos, no solo el código.

1

poner "\ r" al final de cada fila en realidad tuvo el efecto de saltos de línea en excel, pero en .csv desapareció y dejó un feo lío donde cada fila se aplastó contra la siguiente sin espacio y sin saltos de línea

0

Puede usar el atajo de teclado ALT + Intro.

  1. Seleccione la celda que desea editar
  2. entrar en el modo de edición haciendo doble clic en él o pulsando F2 3.Press Alt + Enter. Esto creará una nueva línea en la celda
Cuestiones relacionadas