通过上下文菜单将rhandsontable导出为CSV时仅选择特定列

yrdbyhpb  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(156)

https://jrowen.github.io/rhandsontable/中,给出了如何使用hot_context_menucustomOpts参数添加“下载到CSV”条目的示例,该条目将以CSV格式保存表。

library(rhandsontable)
MAT = matrix(rnorm(50), nrow = 10, dimnames = list(LETTERS[1:10],
                                                   letters[1:5]))

rhandsontable(MAT, width = 550, height = 300) %>%
  hot_context_menu(
    customOpts = list(
      csv = list(name = "Download to CSV",
                    callback = htmlwidgets::JS(
                      "function (key, options) {
                         var csv = csvString(this, sep=',', dec='.');

                         var link = document.createElement('a');
                         link.setAttribute('href', 'data:text/plain;charset=utf-8,' +
                           encodeURIComponent(csv));
                         link.setAttribute('download', 'data.csv');

                         document.body.appendChild(link);
                         link.click();
                         document.body.removeChild(link);
                       }"))))

由于我对JS完全没有经验,我很难只选择特定的列进行导出。例如上面示例中的列1、3和5。谢谢你,谢谢!
编辑:有趣的是,chatGPT给了我一个可行的解决方案。但我还是有兴趣去看一个人。

kwvwclae

kwvwclae1#

要保存特定列,可以使用以下JS代码扩展customOpts

library(rhandsontable)
MAT = matrix(rnorm(50), nrow = 10, dimnames = list(LETTERS[1:10],
                                                   letters[1:5]))

rhandsontable(MAT, width = 550, height = 300) %>%
  hot_context_menu(allowRowEdit = FALSE,
                   allowColEdit = FALSE,
    customOpts = list(
      csv = list(name = "Download to CSV",
                 callback = htmlwidgets::JS(
                   "function (key, options) {
                         var hot = this; // hot is equal to the rendered table
                   
                         var selectedColumns = [0, 2, 4]; // Define columns to be selected
                   
                         var columnNames = ['one', 'two', 'three']; // Define custom column names
                   
                         var data = []; // empty data
                   
                         data.push(columnNames.join(',')); // add column names
                   
                         for (var row = 0; row < hot.countRows(); row++) {  // add data based on  selectedColumns
                          var rowData = [];
                          for (var col = 0; col < selectedColumns.length; col++) {
                            rowData.push(hot.getDataAtCell(row, selectedColumns[col]));
                          }
                         data.push(rowData.join(','));
                         }    
                   
                         var csv = data.join('\\n'); // final data for export    
          
                         var link = document.createElement('a');
                         link.setAttribute('href', 'data:text/plain;charset=utf-8,' +
                           encodeURIComponent(csv));
                         link.setAttribute('download', 'data.csv');

                         document.body.appendChild(link);
                         link.click();
                         document.body.removeChild(link);
                       }"))))

代码中的注解指示添加的行的作用。

相关问题