【问题标题】:Save javascript data to Excel将 JavaScript 数据保存到 Excel
【发布时间】:2013-07-25 20:59:51
【问题描述】:

我有一个 Web 应用程序,它需要能够将一些 javascript 数据(主要是数组)导出到 Microsoft Excel。有人告诉我最好的方法是将我的数据保存为 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!");        

    }

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

【问题讨论】:

  • 你有没有注意到orderedDatafor 循环之后变成了空? Appart 从我下载后得到的文件看起来很好(仅限标题)。这是fiddle
  • 对我来说,文件只有标题,所有数据都进入一个 Excel 单元格,而不是正确分布在整个表格中......
  • 你想用forloop 完成什么?

标签: javascript uri


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的耐心等待。我仍然只在表格的一个单元格中得到我的结果(Excel 版本中有 2 个单元格)。有没有办法让所有数据正确分布在表格单元格中?
  • 你下载的文件内容是什么样的?
  • 它只是一个标题和四个双精度数组。我最终让我的解决方案使用 FileSaver.js 工作。我将发布我在编辑中所做的事情。
【解决方案2】:

Easy way to turn Javascript array into comma-separated list?

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

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

编辑:

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

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

还有这个: How can i generate a file and offer it for download in plain javascript?

【讨论】:

  • 我有一个清单,这不是问题。我想将列表下载为带有下载提示的 CSV 或 Excel 文件。
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多