从YUI DataTable导出数据

时间:2010-03-18 18:35:15

标签: javascript html yui yui-datatable

从YUI DataTable中获取数据并将其转换为单个CSV或TSV字符串的最简单/最快方法是什么?我基本上只想实现一键式方法,将整个DataTable(它应保留当前应用的排序)保存到用户可以粘贴到电子表格中的表单中。

我的DataTable可以变得非常大 - 5000到10000行,5到10列 - 所以效率很重要。

2 个答案:

答案 0 :(得分:6)

这样的事情怎么样:

function dataTableAsCSV (myDataTable) {

    var i, j, oData, newWin = window.open(),
        aRecs = myDataTable.getRecordSet().getRecords(),
        aCols = myDataTable.getColumnSet().keys;

    newWin.document.write("<pre>");

    for (i=0; i<aRecs.length; i++) {
        oData = aRecs[i].getData();

        for (j=0; j<aCols.length; j++) {
            newWin.document.write( oData[aCols[j].key] + "\t");

        }
        newWin.document.write("\n");

    }

    newWin.document.write("</pre>n");
    newWin.document.close();
}

它将数据表内容作为TSV呈现到一个新窗口中。它不处理带有标签的数据,但这只是oData[aCols[j].key]上的一些额外替换。

答案 1 :(得分:0)

上述答案适用于最高版本为3.4的YUI。但是,数据表从3.5版开始重构。我的转换器用双引号括起单元格值,在单元格值中转义双引号并处理一个列嵌套级别(如果存在)。

这是一个演示我的转换器的小提琴:http://jsfiddle.net/geocolumbus/AFB3h/3/

// Function to convert a DataTable with zero or one nested columns to CSV
function convertToCSV(myDataTable) {
    var col,
    colIndex = 0,
        colKey,
        rowString,
        ret,
        cell,
        headerString = "";

    while (col = myDataTable.getColumn(colIndex++)) {
        if (col.children == null) {
            headerString += '"' + col.key + '",';
        } else {
            Y.Array.each(col.children, function (child) {
                headerString += '"' + child.key + '",';
            });
        }
    }
    ret = headerString.replace(/,$/, '\n');

    Y.Array.each(myDataTable.data.toJSON(), function (item) {
        colIndex = 0;
        rowString = "";
        while (col = myDataTable.getColumn(colIndex++)) {
            if (col.children == null) {
                cell = item[col.key].replace(/"/g, "\\\"");
                rowString += '"' + cell + '",';
            } else {
                Y.Array.each(col.children, function (child) {
                    cell = item[child.key].replace(/"/g, "\\\"");
                    rowString += '"' + cell + '",';
                });
            }
        }
        ret += rowString.replace(/,$/, '') + "\n";
    });

    return ret;
}