2010-03-18 4 views
8

Cách dễ nhất/nhanh nhất để lấy dữ liệu ra khỏi một DataTable YUI và biến nó thành một chuỗi CSV hoặc TSV đơn lẻ là gì? Về cơ bản, tôi chỉ muốn thực hiện một cách bấm một lần để có được toàn bộ DataTable (nó nên bảo toàn việc sắp xếp hiện hành) thành một biểu mẫu mà người dùng có thể dán vào một bảng tính.Xuất dữ liệu từ một DataTable YUI

DataTable của tôi có thể nhận được khá lớn - 5000 đến 10000 hàng, 5 đến 10 cột - vì vậy hiệu quả không thành vấn đề.

Trả lời

6

Làm thế nào về một cái gì đó như thế này:

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

Nó sẽ làm cho nội dung bảng dữ liệu như TSV vào một cửa sổ mới. Nó không xử lý dữ liệu với các tab trong đó, nhưng đó chỉ là một số thay thế phụ trên oData[aCols[j].key].

+0

Bạn biết đấy, tôi ngạc nhiên khi thấy cách nhanh chóng mà là. –

+0

... Và nó bảo tồn phân loại. Tuyệt vời! –

+1

Bất kỳ ý tưởng làm thế nào sau đó để làm cho popup mở một hộp thoại lưu/tải xuống? Có thể yêu cầu thay đổi loại nội dung của tài liệu bật lên hoặc như vậy, điều mà tôi nhận ra có thể không khả thi, nhưng nếu bạn có cách để làm điều đó, điều đó sẽ rất tuyệt. – Meligy

0

Câu trả lời ở trên hoạt động tốt cho YUI lên phiên bản 3.4. Tuy nhiên, bảng dữ liệu đã được cấu trúc lại bắt đầu bằng phiên bản 3.5. Trình biến đổi của tôi bao quanh các giá trị ô trong dấu nháy kép, thoát khỏi dấu ngoặc kép trong các giá trị ô và xử lý một mức cột làm tổ, nếu nó tồn tại.

Đây là một fiddle thể hiện chuyển đổi của tôi: 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; 
}