1

我有一个需要能够将一些 javascript 数据(主要是数组)导出到 Microsoft Excel 的 Web 应用程序。有人告诉我最好的方法是将我的数据保存为 CSV 文件。我知道有很多线程可以处理类似的问题,但到目前为止,我还没有找到我正在寻找的确切内容......我想绕过调用 Web 服务并通过客户端执行此操作。

按照一些建议,我尝试使用数据 URI 将数组写入磁盘。这是我在 javascript 中的代码:

function exportToCsv() {

        var data = [JSONdata.mass, JSONdata.waterMass, JSONdata.bedTemp, JSONdata.evapRate];
        var keys = ["Mass(kg)", "H2O Mass in Bed(kg)", "Bed Temperature(kg)", "Evaporation Rate"];

        var str;
        var orderedData = [];
        for (var i = 0, iLen = data.length; i < iLen; i++) {
            temp = data[i];
            for (var j = 0, jLen = temp.length; j < jLen; j++) {

                if (!orderedData[j]) {
                    orderedData.push([temp[j]]);
                } else {
                    orderedData[j].push(temp[j]);
                }
            }
        }


        str = keys.join(',') + '\r\n' + orderedData.join('\r\n');      



        var uri = 'data:application/csv;charset=UTF-8,' + str;
        window.open(uri);       

}

该字符串str看起来像 CSV 格式,但是当我保存文件时,它变成了空的。我也非常想将str弹出提示中的内容保存到 CSV 文件中。

我查看了 Downloadify 和 FileSaver.js,但找不到好的文档。这似乎应该是一件相当容易的事情......请帮忙!

提前致谢!


编辑/更新

我最终让我的解决方案使用FileSaver.js工作。我的数据是一个标题,后跟四个大型双数组,所以 CVS 对我来说是一种足够好的格式。这是我用来正确保存 CSV 文件的代码:

function exportExcel()
    {
        var data = [JSONdata.mass, JSONdata.waterMass, JSONdata.bedTemp, JSONdata.evapRate];
        //var data = [[1,2,3,4,5],[11,22,33,44,55],[111,222,333,444,555],[1111,2222,3333,4444,5555]];
        var keys = ['"Mass(kg)"', '"H2O Mass in Bed(kg)"', '"Bed Temperature(kg)"', '"Evaporation Rate"'];

        var convertToCSV = function(data, keys) {
            var orderedData = [];
            for (var i = 0, iLen = data.length; i < iLen; i++) {
                temp = data[i];
                for (var j = 0, jLen = temp.length; j < jLen; j++) {

                    quotes = ['"'+temp[j]+'"'];
                    if (!orderedData[j]) {
                        orderedData.push([quotes]);
                    } else {
                        orderedData[j].push(quotes);
                    }
                }
            }
            return keys.join(',') + '\r\n' + orderedData.join('\r\n');
        }


        var str = convertToCSV(data, keys);

        var blob = new Blob([str], {type: "text/plain;charset=utf-8"});
        var filename = prompt("Please enter the filename");
        if(filename!=null && filename!="")
            saveAs(blob, [filename+'.csv']);
        else
            alert("please enter a filename!");        

    }

如果其他人遇到类似的问题,这个解决方案对我来说效果很好,让我可以跳过回到服务器端。感谢大家的帮助。

4

2 回答 2

2

我能够理解并重现您所描述的行为。生成 URI 的代码的问题在于它没有对str.

这是我更改的行,请注意使用内置函数包装str变量:encodeURI()

var uri = 'data:application/csv;charset=UTF-8,' + encodeURI(str);

这是一个生成包含新行的 CSV 文件的小提琴:DEMO。我简化了for循环,因为orderedData它在执行后变成了空的。

请注意,Excel 生成的“CSV”文件实际上并不使用逗号,而是使用分号。因此,如果您想在 Excel 中使用该文件,请将,. ;这是一个与 Excel 兼容的文件生成:DEMO

于 2013-07-26T15:24:33.723 回答
-1

将Javascript数组转换为逗号分隔列表的简单方法?

似乎是一个很好的线程,并且是您想要的功能的相对简单的实现。

是否有某些原因这对您不起作用?

编辑:

您似乎对 HTML5 FileSaver 感兴趣,虽然我不知道它的支持范围有多广,但它似乎可以满足您的功能。

这个: http ://updates.html5rocks.com/2011/08/Saving-generated-files-on-the-client-side

还有这个: 我怎样才能生成一个文件并提供它以纯javascript下载?

于 2013-07-25T21:04:14.443 回答