![](/img/trans.png)
[英]How can I get a copy button in my Rmarkdown html output to copy a table generated in R code to the clipboard?
[英]How can I add a table to my rmarkdown html output that will paste into Excel with formatting?
我想在 rmarkdown 文件中创建按钮(或可选表格),允许用户复制表格并将其粘贴到 word 或 excel 中,并带有一些预定义的格式。
有没有办法生产:
使用这个非常简单的 dataframe:
data<-data.frame(Variable=c('Amount','Age','Happiness','Favorite Color'),
Value=c(15,25,7,'Yellow'))
我希望用户能够单击 html 文件中的按钮,这样当他们粘贴到 excel 或 word 中时,他们会看到:
或者
取决于指定的格式。
就目前而言,我可以制作一张带有kable
单元格边框的表格,
data%>%
kable("html",align = 'clc')%>%
kable_styling(full_width = F,position="left",bootstrap_options =
c("striped","bordered"))
此表位于使用 rmarkdown 生成的 html 文件中,显示单元格边框并具有可接受的间距和清晰度(列足够宽以显示完整的列标题,并且网格清楚地定义了单元格。
当我突出显示表格并将其粘贴到 Excel 中时,我得到:
一个不满意的结果。
使用DT
生成表,我使用:
datatable(data,extensions='Buttons',rownames=FALSE,filter=c("top"),options=list(dom='Bfrtip',buttons=c('csv','copy','excel')))
这将生成一个带有 CSV、复制和 Excel 按钮的表。
使用复制按钮并粘贴到 Excel 的结果是:
用户有可以粘贴的数据,但缺少任何格式(并将文件中的标题放在数据表本身上方两行?)
有没有办法修改DT
表的“复制”按钮的代码以包含某些指定的格式,例如缺少的参数,它提供了将某些格式复制到剪贴板的选项? 还是一种生成独立按钮的方法,我可以在后面存储一个 excel 格式的表格,以便用户可以以一种对 excel 友好的格式化形式复制我的表格?
注意:我不想从 R 写入 excel 文件。 似乎有很多选项可用于格式化表格和使用 openxlsx 写入openxlsx
和此处的解决方案: 从 R 写入 excel 中的模板,同时保留格式,但这并不能回答我的问题。
编辑:似乎可以将格式添加到 Excel 按钮,此处提到: https://datatables.net/extensions/buttons/examples/html5/excelBorder.ZFC35FDC70D228C755
这给了我希望,也许格式的.attr()
规范可以以某种方式添加到copy
按钮中。
作为尝试测试我是否可以让这个中间步骤发挥作用的第一步,我尝试了:
jscode<-"function ( xlsx ){var sheet = xlsx.xl.worksheets['sheet1.xml']; $('row c[r*=10]', sheet).attr( 's', '25' ); }"
datatable(data1,class='cell-border',extensions='Buttons',rownames=FALSE,filter=c("top"),options=list(dom='Blfrtip',buttons=list(list(extend='excel',customize=jscode))))
结果是一无所有的旋转按钮。
当我尝试:
library(jsonlite)
datatable(data1,class='cell-border',extensions='Buttons',rownames=FALSE,filter=c("top"),options=list(dom='Blfrtip',buttons=list(list(extend='excel',customize=fromJSON(jscode)))))
我收到一个错误:
由于这个问题的解决方案似乎取决于一些 javascript (至少如果答案基于datatable
,我添加了 javascript 标记。
复制并删除表标题时,此代码应为您提供整个表(尽管没有任何格式,也许有人可以扩展此答案):
library(DT)
DT::datatable(mtcars,
filter = 'top',
class = 'cell-border stripe',
extensions = 'Buttons',
options = list(scrollY = 600,
scrollX = TRUE,
dom = 'lBfrtip',
lengthMenu= list(c(10, 25, 100, -1),
c('10', '25', '100','All')),
buttons = list(
list(extend = "copy", text = "copy",
title= "",
exportOptions = list(
modifier = list(page = "all")
)
)
),
scrollCollapse= TRUE,
lengthChange = TRUE,
widthChange= TRUE,
format = list(
header = TRUE
)))
#If you don't want rownames then you can have:
#DT::datatable(mtcars,
# filter = 'top',
# class = 'cell-border stripe',
# extensions = 'Buttons',
# rownames = FALSE,
# extensions = 'Buttons',
# options = list(
# ......)))
当您点击“复制”并将其粘贴到 excel 中时,您应该会看到以下内容 -
可以在此处找到与 DT 相关的更多选项: https://datatables.net/reference/option/
我在 rmarkdown 文件中找到了使用 javascript 和用于创建表的kableExtra
package 的工作解决方案。
在使用kableExtra
生成表时,您使用table.attr
将 ID 添加到 html 表中,最终生成如下:
data%>%
kable("html",align = 'clc',table.attr="id=tableofdata")%>%
kable_styling(full_width = F,position="left",bootstrap_options = c("striped","bordered"))%>%
add_header_above(c("Pretty Table"=2))
在{r}
代码块之后,粘贴以下脚本,在此处找到: How to copy table html (data and format) to clipboard using javascript (microsoft edge browser)
<script type="text/javascript">
function selectElementContents(el) {
let body = document.body, range, sel;
if (document.createRange && window.getSelection) {
range = document.createRange();
sel = window.getSelection();
sel.removeAllRanges();
try {
range.selectNodeContents(el);
sel.addRange(range);
} catch (e) {
range.selectNode(el);
sel.addRange(range);
}
} else if (body.createTextRange) {
range = body.createTextRange();
range.moveToElementText(el);
range.select();
}
document.execCommand("Copy");}
</script>
这将在 javascript 中创建副本 function。 接下来,创建一个按钮,使用此 function 将表格和格式复制到剪贴板。 请注意,我们在创建表时使用的table.attr
ID 需要在getElementByID
中使用相同的术语来复制内容。
<button type="button" onclick="selectElementContents( document.getElementById('tableofdata') );">Copy Table</button>
笔记:
我发现当我编织 my.Rmd 文件并尝试使用 Rstudio 浏览器中出现的按钮时,单击该按钮并没有达到我想要的效果。 但是,当我打开生成的 html 文件 Chrome 时,单击按钮成功复制了格式化的表格。 如果我没有尝试过 chrome,我可能会将其视为无效的解决方案。 我没有尝试使用不同版本的流行浏览器打开。
点击按钮后,粘贴到 Excel 中,边框、粗体标题和标题就显示出来了!
在 excel 中,列宽并不能神奇地让事情看起来很好,但这是另一天的一步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.