【问题标题】:Using javascript to download file as a.csv file使用 javascript 将文件下载为 .csv 文件
【发布时间】:2013-07-07 23:55:33
【问题描述】:

您好,我正在尝试将文件导出为 .csv 文件,这样当用户单击下载按钮时,浏览器会自动将文件下载为 .csv。 我还希望能够为要导出的 .csv 文件设置一个名称

我正在使用 javascript 来执行此操作

代码如下:

 function ConvertToCSV(objArray) {
            var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
            var str = '';

            for (var i = 0; i < array.length; i++) {
                var line = '';
            for (var index in array[i]) {
                if (line != '') line += ','

                line += array[i][index];
            }

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

        return str;
    }

    // Example
    $(document).ready(function () {

        // Create Object
        var items = [
              { "name": "Item 1", "color": "Green", "size": "X-Large" },
              { "name": "Item 2", "color": "Green", "size": "X-Large" },
              { "name": "Item 3", "color": "Green", "size": "X-Large" }];

        // Convert Object to JSON
        var jsonObject = JSON.stringify(items);

        // Display JSON
        $('#json').text(jsonObject);

        // Convert JSON to CSV & Display CSV
        $('#csv').text(ConvertToCSV(jsonObject));

        $("#download").click(function() {
            alert("2");
            var csv = ConvertToCSV(jsonObject);
            window.open("data:text/csv;charset=utf-8," + escape(csv))
            ///////


        });

    });

请就此提出建议 我的老板在这个问题上喘不过气来

请帮忙

【问题讨论】:

  • 你碰巧得到这个工作了吗?

标签: javascript csv


【解决方案1】:

我在这个帖子里写了一个解决方案:how to set a file name using window.open

这是简单的解决方案:

 $("#download_1").click(function() {
var json_pre = '[{"Id":1,"UserName":"Sam Smith"},{"Id":2,"UserName":"Fred Frankly"},{"Id":1,"UserName":"Zachary Zupers"}]';
var json = $.parseJSON(json_pre);

var csv = JSON2CSV(json);
var downloadLink = document.createElement("a");
var blob = new Blob(["\ufeff", csv]);
var url = URL.createObjectURL(blob);
downloadLink.href = url;
downloadLink.download = "data.csv";

document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
});

JSON2CSV 函数

function JSON2CSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = '';
    var line = '';

    if ($("#labels").is(':checked')) {
        var head = array[0];
        if ($("#quote").is(':checked')) {
            for (var index in array[0]) {
                var value = index + "";
                line += '"' + value.replace(/"/g, '""') + '",';
            }
        } else {
            for (var index in array[0]) {
                line += index + ',';
            }
        }

        line = line.slice(0, -1);
        str += line + '\r\n';
    }

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

        if ($("#quote").is(':checked')) {
            for (var index in array[i]) {
                var value = array[i][index] + "";
                line += '"' + value.replace(/"/g, '""') + '",';
            }
        } else {
            for (var index in array[i]) {
                line += array[i][index] + ',';
            }
        }

        line = line.slice(0, -1);
        str += line + '\r\n';
    }
    return str;
}

【讨论】:

  • 你从哪里得到 JSON2CSV(json) 的库
  • 谢谢@Jewel,这很有帮助...我在这里保存了一个 JS 小提琴,包括标题行:jsfiddle.net/m788fu63/1
【解决方案2】:

在现代浏览器中,锚点中有一个新属性。

download

http://caniuse.com/download

所以而不是使用

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

创建下载链接:

<a href="data:text/csv;charset=utf-8,'+escape(csv)+'" download="filename.csv">download</a>

另一种解决方案是使用php

编辑

我不使用 jQuery,但您需要编辑代码以添加下载链接 在你的函数中有类似的东西。

var csv=ConvertToCSV(jsonObject),
a=document.createElement('a');
a.textContent='download';
a.download="myFileName.csv";
a.href='data:text/csv;charset=utf-8,'+escape(csv);
document.body.appendChild(a);

【讨论】:

  • 您好,但是我无法下载我想要的内容是否还有更多代码需要编辑
  • 你是什么意思?使用 onefo 支持的浏览器(例如 chrome)。使用 javascript 动态插入 href 数据和下载文件名。
  • '+escape(csv)+' 这是我在excel文件中看到的
  • 因为您可能已将 html 复制到页面。他建议您使用 javascript“创建” csv 链接,因此 '+escape(csv)+' 将打破 html 的单引号字符串并将转义的 csv 插入到 href 链接中。
【解决方案3】:

试试这些例子:

示例 1:

JsonArray = [{
    "AccountNumber": "1234",
    "AccountName": "abc",
    "port": "All",
    "source": "sg-a78c04f8"

}, {
    "Account Number": "1234",
    "Account Name": "abc",
    "port": 22,
    "source": "0.0.0.0/0",
}]

JsonFields = ["Account Number","Account Name","port","source"]

function JsonToCSV(){
    var csvStr = JsonFields.join(",") + "\n";

    JsonArray.forEach(element => {
        AccountNumber = element.AccountNumber;
        AccountName   = element.AccountName;
        port          = element.port
        source        = element.source

        csvStr += AccountNumber + ',' + AccountName + ','  + port + ',' + source + "\n";
        })
        return csvStr;
}

您可以使用以下代码下载 csv 文件:

function downloadCSV(csvStr) {

    var hiddenElement = document.createElement('a');
    hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvStr);
    hiddenElement.target = '_blank';
    hiddenElement.download = 'output.csv';
    hiddenElement.click();
}

【讨论】:

    【解决方案4】:

    我只是想在这里为将来的人们添加一些代码,因为我试图将 JSON 导出为 CSV 文档并下载它。

    我使用$.getJSON从外部页面提取json数据,但如果你有一个基本数组,你可以使用它。

    这使用Christian Landgren's 代码来创建 csv 数据。

    $(document).ready(function() {
        var JSONData = $.getJSON("GetJsonData.php", function(data) {
            var items = data;
            const replacer = (key, value) => value === null ? '' : value; // specify how you want to handle null values here
            const header = Object.keys(items[0]);
            let csv = items.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(','));
            csv.unshift(header.join(','));
            csv = csv.join('\r\n');
    
            //Download the file as CSV
            var downloadLink = document.createElement("a");
            var blob = new Blob(["\ufeff", csv]);
            var url = URL.createObjectURL(blob);
            downloadLink.href = url;
            downloadLink.download = "DataDump.csv";  //Name the file here
            document.body.appendChild(downloadLink);
            downloadLink.click();
            document.body.removeChild(downloadLink);
        });
    });
    

    编辑:值得注意的是JSON.stringify 将通过添加\" 来转义引号中的引号。如果您在 excel 中查看 CSV,它不喜欢将其作为转义字符。

    您可以将.replace(/\\"/g, '""') 添加到JSON.stringify(row[fieldName], replacer) 的末尾以在excel 中正确显示(这会将\" 替换为"",这是excel 喜欢的)。

    全线:JSON.stringify(row[fieldName], replacer).replace(/\\"/g, '""')

    【讨论】:

      【解决方案5】:

      带有静态标题的简单 JSON 的单行函数

      假设 arr 为 JSON 数组,也可以将第一个字符串替换为逗号分隔的以\n结尾的标题

      arr.reduce((acc, curr) => (`${acc}${Object.values(curr).join(",")}\n`), "")
      

      或者配合前面提到的window.open函数

      window.open(`data:text/csv;charset=utf-8,${arr.reduce((acc, curr) => (`${acc}${Object.values(curr).join(",")}\n`), "")}`)
      

      您还应该考虑escape 字符串或替换, 以避免多余的单元格

      【讨论】:

        【解决方案6】:

        如果您的数据来自 SQL 数据库,那么您的所有行都应该具有相同的结构,但如果来自 NoSQL 数据库,您可能无法使用标准答案。对于这种情况,我在上面详细说明了 JSON2CSV。 Json数据示例

          [ {"meal":2387,"food":"beaf"},
            {"meal":2387,"food":"apple","peeled":"yes", "speed":"fast" },
            {"meal":2387,"food":"pear", "speed":"slow", "peeled":"yes" } ]
        

        回答

        "meal","food","peeled","speed"
        "2387","beaf","",""
        "2387","apple","yes","fast"
        "2387","pear","yes","slow"
        

        为简单起见,标题和双引号的代码。

        function JSON2CSV(objArray) {
          var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
        
          var str = '';
          var line = '';
        
          // get all distinct keys      
          let titles = [];
          for (var i = 0; i < array.length; i++) {
            let obj = array[i];
            Object.entries(obj).forEach(([key,value])=>{
              //console.log('key=', key, "   val=", value );
              if (titles.includes(key) ) {
                // console.log (key , 'exists');
                null;
              }
              else {
                titles.push(key);
              }
            })
          }
          let htext =  '"' + titles.join('","') + '"';
          console.log('header:', htext);
          // add to str
          str += htext + '\r\n';
          //
          // lines
          for (var i = 0; i < array.length; i++) {
            var line = '';
            // get values by header order
            for (var j = 0; j < titles.length; j++) {
              // match keys with current header
              let obj = array[i];
              let keyfound = 0;    
              // each key/value pair
              Object.entries(obj).forEach(([key,value])=>{
                if (key == titles[j]) {
                  // console.log('equal tit=', titles[j] , ' e key ', key ); // matched key with header
                  line += ',"' + value +  '"';
                  keyfound = 1; 
                  return false;
                }
        
              })
              if (keyfound == 0) {
                line += ',"'  +  '"';   // add null value for this key
              } // end loop of header values
        
            }
        
            str += line.slice(1) + '\r\n';
          }
          return str;
        }
        

        【讨论】:

          猜你喜欢
          • 2014-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-25
          • 1970-01-01
          • 2011-08-03
          • 2018-08-02
          • 2020-10-28
          相关资源
          最近更新 更多