使用JavaScript使用UTF-8(例如希腊语)编码将JSON导出为CSV或Excel

 披着狼皮的卷毛羊万_784 发布于 2023-02-08 15:14

我试图导出并下载JSON对象到CSV文件,我有希腊字符的问题.我的代码有效; 它并不完美,但它确实有效.

问题是希腊字符看起来像垃圾.

这是我现有的代码:

function downloadJsonToCsv(jsonObject) {
    var array = typeof jsonObject != "object" ? JSON.parse(jsonObject) : jsonObject;

    if (array == null) {
        return; // No data found on the jsonObject
    }

    var str = "";

    for (var i = 0; i < array.length; i++) {
        var line = "";

        for (var index in array[i]) {
            line += array[i][index] + ";"; // Set delimiter
        }

        // Here is an example where you would wrap the values in double quotes
        // for (var index in array[i]) {
        //    line += '"' + array[i][index] + '",';
        // }

        line.slice(0,line.Length-1); 

        str += line + "\r\n";
    }

    window.open("data:text/csv;charset=utf-8," + encodeURI(str));
}

我有两个问题.

    如何使用正确的希腊语字符导出此CSV文件?

    如何以Excel格式而非CSV格式导出此数据?

stv.. 35

导出为CSV

导出为具有非ASCII字符的CSV需要在文件前加上字节顺序标记也称为BOM.在你的代码更改

var str = "";

至:

var str = "\uFEFF";

您需要一个现代版本的Excel来识别BOM.正如这篇有用的StackOverflow文章所述,Excel 2003及更早版本不会正确地遵循 BOM.我只能在Windows上访问Excel 2003,所以我暂时无法对此进行测试,但是它的记录非常清楚.

遗憾的是,Excel 2011 for the Macintosh在这个意义上并不是一个"现代Excel".令人高兴的是,Google表格做了正确的事情.

直接导出到Excel

这是下面代码的jsFiddle实现.它生成一个 SpreadsheetXml文档.这种方法的好处是你可能会非常棘手......添加公式并做更多特定于Excel的事情.

// Test script to generate a file from JavaScript such
// that MS Excel will honor non-ASCII characters.

testJson = [
    {
        "name": "Tony Peña",
        "city": "New York",
        "country": "United States",
        "birthdate": "1978-03-15",
        "amount": 42

    },
    {
        "name": "??????? Thessaloniki",
        "city": "Athens",
        "country": "Greece",
        "birthdate": "1987-11-23",
        "amount": 42
    }
];

// Simple type mapping; dates can be hard
// and I would prefer to simply use `datevalue`
// ... you could even add the formula in here.
testTypes = {
    "name": "String",
    "city": "String",
    "country": "String",
    "birthdate": "String",
    "amount": "Number"
};

emitXmlHeader = function () {
    var headerRow =  '\n';
    for (var colName in testTypes) {
        headerRow += '  \n';
        headerRow += '    ';
        headerRow += colName + '\n';
        headerRow += '  \n';        
    }
    headerRow += '\n';    
    return '\n' +
           '\n' +
           '\n' +
           '\n\n' + headerRow;
};

emitXmlFooter = function() {
    return '\n\n' +
           '\n' +
           '\n';
};

jsonToSsXml = function (jsonObject) {
    var row;
    var col;
    var xml;
    var data = typeof jsonObject != "object" 
             ? JSON.parse(jsonObject) 
             : jsonObject;

    xml = emitXmlHeader();

    for (row = 0; row < data.length; row++) {
        xml += '\n';

        for (col in data[row]) {
            xml += '  \n';
            xml += '    ';
            xml += data[row][col] + '\n';
            xml += '  \n';
        }

        xml += '\n';
    }

    xml += emitXmlFooter();
    return xml;  
};

console.log(jsonToSsXml(testJson));

这将生成下面的XML文档.如果此XML保存在名为test.xls的文件中,则Excel应识别此项并使用正确的编码将其打开.







  
    name
  
  
    city
  
  
    country
  
  
    birthdate
  
  
    amount
  



  
    Tony Peña
  
  
    New York
  
  
    United States
  
  
    1978-03-15
  
  
    42
  


  
    ??????? Thessaloniki
  
  
    Athens
  
  
    Greece
  
  
    1987-11-23
  
  
    42
  





但是,我必须承认,如果可能的话,我强烈倾向于做这个服务器端.我过去使用Python库openpyxl来做这件事,而且非常简单.大多数服务器端语言都有一个生成Excel文件的库,它们应该提供比字符串连接更好的构造.

无论如何,请参阅此MSDN博客了解基础知识.这篇StackOverflow文章提供了各种其他选项的优缺点.

2 个回答
  • 导出为CSV

    导出为具有非ASCII字符的CSV需要在文件前加上字节顺序标记也称为BOM.在你的代码更改

    var str = "";

    至:

    var str = "\uFEFF";

    您需要一个现代版本的Excel来识别BOM.正如这篇有用的StackOverflow文章所述,Excel 2003及更早版本不会正确地遵循 BOM.我只能在Windows上访问Excel 2003,所以我暂时无法对此进行测试,但是它的记录非常清楚.

    遗憾的是,Excel 2011 for the Macintosh在这个意义上并不是一个"现代Excel".令人高兴的是,Google表格做了正确的事情.

    直接导出到Excel

    这是下面代码的jsFiddle实现.它生成一个 SpreadsheetXml文档.这种方法的好处是你可能会非常棘手......添加公式并做更多特定于Excel的事情.

    // Test script to generate a file from JavaScript such
    // that MS Excel will honor non-ASCII characters.
    
    testJson = [
        {
            "name": "Tony Peña",
            "city": "New York",
            "country": "United States",
            "birthdate": "1978-03-15",
            "amount": 42
    
        },
        {
            "name": "??????? Thessaloniki",
            "city": "Athens",
            "country": "Greece",
            "birthdate": "1987-11-23",
            "amount": 42
        }
    ];
    
    // Simple type mapping; dates can be hard
    // and I would prefer to simply use `datevalue`
    // ... you could even add the formula in here.
    testTypes = {
        "name": "String",
        "city": "String",
        "country": "String",
        "birthdate": "String",
        "amount": "Number"
    };
    
    emitXmlHeader = function () {
        var headerRow =  '<ss:Row>\n';
        for (var colName in testTypes) {
            headerRow += '  <ss:Cell>\n';
            headerRow += '    <ss:Data ss:Type="String">';
            headerRow += colName + '</ss:Data>\n';
            headerRow += '  </ss:Cell>\n';        
        }
        headerRow += '</ss:Row>\n';    
        return '<?xml version="1.0"?>\n' +
               '<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">\n' +
               '<ss:Worksheet ss:Name="Sheet1">\n' +
               '<ss:Table>\n\n' + headerRow;
    };
    
    emitXmlFooter = function() {
        return '\n</ss:Table>\n' +
               '</ss:Worksheet>\n' +
               '</ss:Workbook>\n';
    };
    
    jsonToSsXml = function (jsonObject) {
        var row;
        var col;
        var xml;
        var data = typeof jsonObject != "object" 
                 ? JSON.parse(jsonObject) 
                 : jsonObject;
    
        xml = emitXmlHeader();
    
        for (row = 0; row < data.length; row++) {
            xml += '<ss:Row>\n';
    
            for (col in data[row]) {
                xml += '  <ss:Cell>\n';
                xml += '    <ss:Data ss:Type="' + testTypes[col]  + '">';
                xml += data[row][col] + '</ss:Data>\n';
                xml += '  </ss:Cell>\n';
            }
    
            xml += '</ss:Row>\n';
        }
    
        xml += emitXmlFooter();
        return xml;  
    };
    
    console.log(jsonToSsXml(testJson));
    

    这将生成下面的XML文档.如果此XML保存在名为test.xls的文件中,则Excel应识别此项并使用正确的编码将其打开.

    <?xml version="1.0"?>
    <ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
    <ss:Worksheet ss:Name="Sheet1">
    <ss:Table>
    
    <ss:Row>
      <ss:Cell>
        <ss:Data ss:Type="String">name</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">city</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">country</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">birthdate</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">amount</ss:Data>
      </ss:Cell>
    </ss:Row>
    
    <ss:Row>
      <ss:Cell>
        <ss:Data ss:Type="String">Tony Peña</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">New York</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">United States</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">1978-03-15</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="Number">42</ss:Data>
      </ss:Cell>
    </ss:Row>
    <ss:Row>
      <ss:Cell>
        <ss:Data ss:Type="String">??????? Thessaloniki</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">Athens</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">Greece</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="String">1987-11-23</ss:Data>
      </ss:Cell>
      <ss:Cell>
        <ss:Data ss:Type="Number">42</ss:Data>
      </ss:Cell>
    </ss:Row>
    
    </ss:Table>
    </ss:Worksheet>
    </ss:Workbook>
    

    但是,我必须承认,如果可能的话,我强烈倾向于做这个服务器端.我过去使用Python库openpyxl来做这件事,而且非常简单.大多数服务器端语言都有一个生成Excel文件的库,它们应该提供比字符串连接更好的构造.

    无论如何,请参阅此MSDN博客了解基础知识.这篇StackOverflow文章提供了各种其他选项的优缺点.

    2023-02-08 15:17 回答
  • 要使Excel读取Unicode CSV文件,您必须添加字节顺序标记作为csv中的第一个字符串.这可以通过JavaScript在代码中添加以下行来完成:

    line="\ufeff"+line
    

    2023-02-08 15:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有