Google Visualization Datatable to CSV下载

时间:2013-07-25 08:49:18

标签: javascript json google-chrome google-visualization

在浸出足够长时间后添加到Stack Overflow。

我有什么:

  • Google可视化产品
  • 从数据库或表中读取数据并加载到数据表中。
  • Datatable用于创建Google Visualization图形。
  • 按钮或链接到“下载到CSV”,我需要按照此处加载 当前的数据配置。即经过全部处理和 变化,包括控制。

现在我想用带有文件名的数据表(不幸的是全局)按下downloadCSV javascript函数。 我从线程中的一个答案中获取了下载代码... is there any way to specify a suggested filename when using data uri

我希望人们觉得这很有帮助。

乌鸦

<html>
  <head>
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
    // Initial Part extracted from [Visualization: Area Chart][2]

      google.load("visualization", "1", {packages:["corechart"]});

      google.setOnLoadCallback(drawChart);
      var data;

      function drawChart() {
        data = google.visualization.arrayToDataTable([
          ['Year', 'Sales', 'Expenses'],
          ['2004',  1000,      400],
          ['2005',  1170,      460],
          ['2006',  660,       1120],
          ['2007',  1030,      540]
        ]);

        var options = {
          title: 'Company Performance',
          hAxis: {title: 'Year',  titleTextStyle: {color: 'red'}}
        };

        var chart = new google.visualization.AreaChart(document.getElementById('chart_div'));
        chart.draw(data, options);
      }


// Additional Code

    function downloadCSV(filename) {
        jsonDataTable = data.toJSON();
        var jsonObj = eval('(' + jsonDataTable + ')'); 
        output = JSONObjtoCSV(jsonObj,',');
    }

    function JSONObjtoCSV(jsonObj, filename){
    filename = filename || 'download.csv';
        var body = '';      var j = 0;
        var columnObj = []; var columnLabel = []; var columnType = [];
        var columnRole = [];    var outputLabel = []; var outputList = [];
        for(var i=0; i<jsonObj.cols.length; i++){
            columnObj = jsonObj.cols[i];
            columnLabel[i] = columnObj.label;
            columnType[i] = columnObj.type;
            columnRole[i] = columnObj.role;
            if (columnRole[i] == null) {
                outputLabel[j] = '"' + columnObj.label + '"';
                outputList[j] = i;
                j++;
            }           
        }
        body += outputLabel.join(",") + String.fromCharCode(13);

        for(var thisRow=0; thisRow<jsonObj.rows.length; thisRow++){
            outputData = [];
            for(var k=0; k<outputList.length; k++){
                var thisColumn = outputList[k];
                var thisType = columnType[thisColumn];
                thisValue = jsonObj.rows[thisRow].c[thisColumn].v;
                switch(thisType) {
                    case 'string':
                        outputData[k] = '"' + thisValue + '"'; break;
                    case 'datetime':
                        thisDateTime = eval("new " + thisValue);
                        outputData[k] = '"' + thisDateTime.getDate() + '-' + (thisDateTime.getMonth()+1) + '-' + thisDateTime.getFullYear() + ' ' + thisDateTime.getHours() + ':' + thisDateTime.getMinutes() + ':' + thisDateTime.getSeconds() + '"';  
                        delete window.thisDateTime;
                        break;
                    default:
                        outputData[k] = thisValue;
                }
            }
            body += outputData.join(",");
            body += String.fromCharCode(13);
        }       
        uriContent = "data:text/csv;filename=download.csv," + encodeURIComponent(body);
        newWindow=downloadWithName(uriContent, 'download.csv');
        return(body);
    }

    function downloadWithName(uri, name) {
     // https://stackoverflow.com/questions/283956/is-there-any-way-to-specify-a-suggested-filename-when-using-data-uri
    function eventFire(el, etype){
        if (el.fireEvent) {
            (el.fireEvent('on' + etype));
        } else {
            var evObj = document.createEvent('Events');
            evObj.initEvent(etype, true, false);
            el.dispatchEvent(evObj);
        }
    }
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    eventFire(link, "click");
    }
    </script>
  </head>
  <body>
    <div id="chart_div" style="width: 900px; height: 500px;"></div>
        <button id="CSVDownload" onclick="downloadCSV('download.csv')" title="Download to CSV">Download to CSV</Button>

  </body>
</html>

1 个答案:

答案 0 :(得分:4)

我要添加一种稍微简单的方法来将Google桌面导出为CSV。您可以使用Google Visualization API。假设您的范围内有名为dataTable的Google桌面。然后使用以下代码将其下载为.csv。

<强>代码:

$('#Export').click(function () {
        var csvFormattedDataTable = google.visualization.dataTableToCsv(dataTable);
        var encodedUri = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csvFormattedDataTable);
        this.href = encodedUri;
        this.download = 'table-data.csv';
        this.target = '_blank';
    });

说明:

此处#Export是在您的网页中设置为<a id="Export" href="#">Download as csv</a>的锚元素。谷歌可视化api的

google.visualization.dataTableToCsv()

将表格对象重新格式化为csv的所有艰苦工作。有关此问题的更多信息,请访问Google Visualization Doc

我在这里使用jQuery选择器$。如果您想在没有jQuery的情况下执行此操作,请将$('#Export').click(function () { // Function definition here.});替换为document.getElementById("Export").onclick = function() { // function definition here};

通过上述方法返回csv格式的数据后,我们利用download属性将数据下载为文件名为table-data的csv文件(您可以随意命名。< / p>

重要说明:此答复时Internet Explorer不支持download属性。这已经过Google Chrome和Mozilla Firefox的测试。有关更多信息download attribute