Javascript to csv export encoding issue

前端 未结 8 1361
Happy的楠姐
Happy的楠姐 2020-11-29 00:33

I need to export javascript array to excel file and download it I\'m doing it in this code. data is a javascript object array.

var csvContent = \"data:t         


        
相关标签:
8条回答
  • 2020-11-29 01:02

    You should add the UTF-8 BOM at the start of the text, like:

    var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF";
    

    It worked for me with Excel 2013.

    Demo Fiddle

    0 讨论(0)
  • 2020-11-29 01:04

    To export CSV containing multibyte characters and make it readable on text editor and Excel in multiple OS platforms (Windows, Linux, MacOS), the following rules should be applied:

    1. Separate the field with tab instead of comma (so that Excel on MacOS can properly display the generated CSV file)
    2. Encode the string / content with UTF-16 little endian (UTF16-LE) instead of UTF-8
    3. Add byte order mark (BOM) 0xFEFF as specified in RFC2781 section 3.2 at the beginning of the serialized stream to explicitly provide "signature" of content encoded with UTF16-LE

    Further elaboration, use cases and sample code with NodeJS can be seen in this article.

    0 讨论(0)
  • 2020-11-29 01:05

    Excel is really bad at detecting encoding, especially Excel on OSX.

    The best solution would be to encode your CSV in the default Excel encoding: windows-1252 (also called ANSI, which is basically a subset of ISO-8859-1).

    I put a complete example of how to do that at: https://github.com/b4stien/js-csv-encoding.

    The 2 main parts are stringencoding (to encode the content of your CSV in windows-1252) and FileSaver.js (to download the generated Blob).

    It looks like:

    var csvContent = 'éà; ça; 12\nà@€; çï; 13',
        textEncoder = new TextEncoder('windows-1252');
    
    
    var csvContentEncoded = textEncoder.encode([csvContent]);
    var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
    saveAs(blob, 'some-data.csv');
    
    0 讨论(0)
  • 2020-11-29 01:13

    Option 1

    use iconv-lite library and encode your output to ascii before send it back to the user. Example:

    var iconv = require('iconv-lite');
    buf = iconv.encode(str, 'win1255'); // return buffer with windows-1255 encoding
    

    Option 2

    Write on the head of the file the BOM header of UTF-8 encoding. Example:

    res.header('Content-type', 'text/csv; charset=utf-8');
    res.header('Content-disposition', 'attachment; filename=excel.csv'); 
    res.write(Buffer.from('EFBBBF', 'hex')); // BOM header
    
    // rest of your code
    

    Option 3

    Use base64 url format like data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==. This method will work on client-side also (IE10+, FF, Chrome, Opera, Safari).

    For example:

    window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb");
    
    0 讨论(0)
  • 2020-11-29 01:20

    somehow found Tab-Separated-CSV with utf-16le encoding with BOM works on WIN/MAC Excel

    followed b4stien's answer but make a little difference to archive:

    var csvContent = 'éà; ça; 12\nà@€; çï; 13',
        textEncoder = new TextEncoder('utf-16le');
    var csvContentEncoded = textEncoder.encode([csvContent]);
    var bom = new Uint8Array([0xFF, 0xFE]);
    var out = new Uint8Array( bom.byteLength + csvContentEncoded.byteLength );
    out.set( bom , 0 );
    out.set( csvContentEncoded, bom.byteLength );
    var blob = new Blob([out]);
    saveAs(blob, 'some-data.csv');
    

    with Linux /usr/bin/file tests:

    Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators
    
    0 讨论(0)
  • 2020-11-29 01:27

    You can add the BOM at first, use this code and try

    var BOM = "\uFEFF"; 
    var csvContent = BOM + csvContent;
    

    and then crate the file headers with the data: "text/csv;charset=utf-8"

    0 讨论(0)
提交回复
热议问题