Saltar al contenido

Los saltos de línea en el archivo csv generado me vuelven loco

Si hallas alguna incompatibilidad con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes aplicar el código al proyecto final.

Solución:

Esto funciona para mí:

un ajuste Response.ContentEncoding = System.Text.Encoding.UTF8 no es suficiente para que Excel abra archivos UTF-8 correctamente. En su lugar, debe escribir manualmente un encabezado de marca de orden de bytes (BOM) para el archivo de Excel:

if (UseExcel2003Compatibility)
    
        // write UTF-16 BOM, even though we export as utf-8. Wrong but *I think* the only thing Excel 2003 understands
        response.Write('uFEFF');
    
    else
    
        // use the correct UTF-8 bom. Works in Excel 2008 and should be compatible to all other editors
        // capable of reading UTF-8 files
        byte[] bom = new byte[3];
        bom[0] = 0xEF;
        bom[1] = 0xBB;
        bom[2] = 0xBF;
        response.BinaryWrite(bom);
    

b) envíe como flujo de octetos, use un nombre de archivo con extensión .csv y cite el nombre de archivo como lo requiere la especificación HTTP:

response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename="" + fileName + """);

c) usar comillas dobles para todos los campos

Acabo de comprobar y, para mí, Excel abre correctamente los archivos descargados como este, incluidos los campos con saltos de línea.

Pero tenga en cuenta que Excel aún no abrirá dicho CSV correctamente en todos los sistemas que tienen un separador predeterminado diferente a “,”. Por ejemplo, si un usuario está ejecutando Excel en un sistema Windows configurado para la configuración regional alemana, Excel no abrirá el archivo correctamente, porque espera un punto y coma en lugar de una coma como separador. No creo que se pueda hacer nada al respecto.

Paso 1: use “n” donde sea necesario dividir el valor del texto en la siguiente línea, como se muestra a continuación.

String value = “No temo al hombre que ha practicado 10.000 patadas una vez, n pero temo al hombre que ha practicado una patada 10.000 veces.”;

Paso 2: Usa el método de extensión. Comprobará el índice de texto para dividir el valor del texto.

public static class ExtensionMethods

    static char[] SpecialCharacters = new char[]  ',', '"', 'r', 'n' ;
    public static string ToWrap(this string val)
    
        StringBuilder builder = new StringBuilder();
        bool firstColumn = true;

        // Add separator if this isn't the first value
        if (!firstColumn)
            builder.Append(',');
        // Implement special handling for values that contain comma or quote
        // Enclose in quotes and double up any double quotes
        if (val.IndexOfAny(SpecialCharacters) != -1)
            builder.AppendFormat(""0"", val.Replace(""", """"));
        else
            builder.Append(val);
        firstColumn = false;

        return builder.ToString();
    

Paso 3: Después de crear el método de extensión. Utilice el método de extensión en string variable que envolver el valor del texto.

Valor.ToWrap();

Se le permite tener un salto de línea en un archivo CSV siempre que el campo esté correctamente entre comillas dobles. El problema aquí parece ser que Excel importe el registro correctamente.

Esto se ha preguntado anteriormente en el sitio, con algunas soluciones posibles:

  • Establezca la codificación en el archivo de salida en ASCII o UTF-8. Como lo está configurando en UTF-8 en la pregunta, intente con ASCII a continuación. (Enlace)

  • Cambie el nombre del archivo a .csvque podría engañar a Excel para que importe el archivo correctamente (enlace)

No se te olvide difundir esta noticia si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *