我有一个示例 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);
})();
```
它的工作原理是这样的。但你必须设置
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()
```