2010-03-18 12 views
8

¿Cuál es la forma más fácil/rápida de extraer datos de una YUI DataTable y convertirla en una sola cadena CSV o TSV? Básicamente, solo quiero implementar una forma de un clic para obtener todo el DataTable (debe conservar el ordenamiento actualmente aplicado) en una forma que los usuarios puedan pegar en una hoja de cálculo.Exportación de datos desde una YUI DataTable

Mi DataTable puede ser bastante grande - 5000 a 10000 filas, 5 a 10 columnas - por lo que la eficiencia sí importa.

Respuesta

6

¿Qué tal algo como esto:

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(); 
} 

va a proporcionar el contenido de la tabla de datos como TSV en una nueva ventana. No maneja datos con pestañas, pero eso sería solo algunas sustituciones adicionales en oData[aCols[j].key].

+0

Sabes, me sorprende lo rápido que es. –

+0

... Y conserva la clasificación. ¡Increíble! –

+1

¿Alguna idea de cómo hacer que la ventana emergente abra un cuadro de diálogo de guardar/descargar? Probablemente requiera cambiar el tipo de contenido del documento emergente más o menos, y me doy cuenta de que puede que no sea posible, pero si tienes una forma de hacerlo, será genial. – Meligy

0

La respuesta anterior funciona muy bien para YUI hasta la versión 3.4. Sin embargo, la tabla de datos se refactorizó comenzando con la versión 3.5. Mi convertidor incluye valores de celdas entre comillas dobles, escapa de comillas dobles en valores de celdas y maneja un nivel de anidación de columna, si existe.

Aquí es un violín que demuestra mi convertidor: 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; 
} 
Cuestiones relacionadas