2010-03-18 3 views
8

Какой самый простой/быстрый способ захватить данные из YUI DataTable и превратить его в одну строку CSV или TSV? Я просто хочу реализовать один клик, чтобы получить весь DataTable (он должен сохранить применяемую в настоящее время сортировку) в форме, которую пользователи могут вставлять в электронную таблицу.Экспорт данных из YUI DataTable

My DataTable может стать довольно большим - от 5000 до 10000 строк, от 5 до 10 столбцов, поэтому эффективность имеет значение.

ответ

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].

+0

Вы знаете, я удивлен, как быстро это. –

+0

... И он сохраняет сортировку. Потрясающие! –

+1

Любая идея, как заставить всплывающее окно открыть диалог сохранения/загрузки? Вероятно, требуется изменить тип содержимого всплывающего документа или так, что я понимаю, что это может быть невозможно, но если у вас есть способ сделать это, это будет просто здорово. – Meligy

0

Вышеупомянутый ответ отлично подходит для YUI до версии 3.4. Однако таблица данных была реорганизована начиная с версии 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; 
}