在RMD文件中导出到xlsx时如何保留DT的colspan属性?

问题描述 投票:0回答:1

我有一个示例 RMD,其中包含带有自定义容器的 DT。我的问题是,我无法将 DT 下载为 Excel 格式,以保留主列标题,因为它们包含子标题。

在示例中,使用按钮扩展时,下面的“Sepal”和“Petal”不会出现在最终输出中。

此外,我尝试重新设计这个解决方案。 (R 数据表按钮使用格式化单元格导出)。但我无法让它在 RMD 与闪亮的环境中正常工作。

上述解决方案要求以下文件与rmd位于同一目录下。我在我的 rmd 中使用它。

https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.core.min.js https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js https://cdnjs.cloudflare.com/ajax/libs/TableExport/5.2.0/js/tableexport.min.js

现在,在编织到 html 时,看起来并没有检索到表 ID

myID
。然而,当 js 块代码被编织后直接在浏览器控制台中运行时(通过检查器使用控制台),它确实会拉出正确的元素。

# Init result
$table
S.fn.init(0)


# Result from running in console after file has been knit
var $table = $('#myID').find('table');
$table
S.fn.init [table#DataTables_Table_0.display.fill-container.dataTable.no-footer, prevObject: S.fn.init(1)]

然后导出时,仅包含主标题,但没有实际数据。

我愿意接受任何直接解决此问题的解决方案。或者是否有办法让前端的表格保持原样,然后创建一个伪下载按钮来下载原始数据。

---
title: "Test"
output: 
  flexdashboard::flex_dashboard:
    theme: bootstrap
    orientation: rows
---

<script src="xlsx.core.min.js"></script>
<script src="FileSaver.min.js"></script>
<script src="tableexport.min.js"></script>

```{r setup, include=FALSE}
library(flexdashboard)
library(DT)
library(dplyr)
library(htmltools)
```

Preserve Colspans
=======================================  

### my table

```{r}
sketch = htmltools::withTags(table(
  class = 'display',
  thead(
    tr(# this is missing in the clipboard excel: 
      th(rowspan = 2, 'Species'),
      th(colspan = 2, 'Sepal'),
      th(colspan = 2, 'Petal')
    ),
    tr(
      lapply(rep(c('Length', 'Width'), 2), th)
    )
  )
))

datatable(iris[1:5, c(5, 1:4)],
          container = sketch, 
          rownames = FALSE, 
          elementId = "myID",
          extensions = c('Buttons'),
          options = list(dom = 'B',
                         buttons = list(
                           list(extend = "excel", filename = "Test_excel"))
                         ))

```

```{js, echo=FALSE}

(function() {

  var $table = $('#myID').find('table');
  console.log($table)
  
  <!-- var instance = $table.tableExport({ -->
  <!--   formats: ['xlsx'], -->
  <!--   filename: 'myTable', -->
  <!--   sheetname: 'Sheet1' -->
  <!-- }); -->
  
  var instance = $table.tableExport();
  
  var exportData0 = instance.getExportData();
  
  var exportData = exportData0[Object.keys(exportData0)[0]]['xlsx'];
  
  instance.export2file(exportData.data, exportData.mimeType, exportData.filename, 
                       exportData.fileExtension, exportData.merges, 
                       exportData.RTL, exportData.sheetname);
})();
```
javascript jquery r dt
1个回答
0
投票

它的工作原理是这样的。但你必须设置

runtime:shiny
。开发者工具检测到了一个 JavaScript 错误,但看起来是无害的。

---
title: "Test"
output: 
  flexdashboard::flex_dashboard:
    theme: bootstrap
    orientation: rows
runtime: shiny
---

<script src="xlsx.core.min.js"></script>
<script src="FileSaver.min.js"></script>
<script src="tableexport.min.js"></script>

```{r setup, include=FALSE}
library(flexdashboard)
library(DT)
library(dplyr)
library(htmltools)
```

```{js}
var js_export = function() {
var $table = $("#myID").find('table');
var instance = $table.tableExport({
  formats: ['xlsx'],
  exportButtons: false,
  filename: 'myTable',
  sheetname: 'Sheet1'
});
var exportData0 = instance.getExportData();
var exportData = exportData0[Object.keys(exportData0)[0]]['xlsx'];
instance.export2file(exportData.data, exportData.mimeType, exportData.filename, 
                     exportData.fileExtension, exportData.merges, 
                     exportData.RTL, exportData.sheetname);
} 
```

```{r}
actionButton("export", "Export table", onClick="js_export()")
```




Preserve Colspans
=======================================  

### my table

```{r}
sketch = htmltools::withTags(table(
  class = 'display',
  thead(
    tr(# this is missing in the clipboard excel: 
      th(rowspan = 2, 'Species'),
      th(colspan = 2, 'Sepal'),
      th(colspan = 2, 'Petal')
    ),
    tr(
      lapply(rep(c('Length', 'Width'), 2), th)
    )
  )
))

datatable(iris[1:5, c(5, 1:4)],
          container = sketch, 
          rownames = FALSE, 
          elementId = "myID",
          extensions = c('Buttons'),
          options = list(dom = 'B',
                         buttons = list(
                           list(extend = "excel", filename = "Test_excel"))
                         ))
br()
```
© www.soinside.com 2019 - 2024. All rights reserved.