繁体   English   中英

如何将表格添加到我的 rmarkdown html output 中,该表格将粘贴到 Excel 格式中?

[英]How can I add a table to my rmarkdown html output that will paste into Excel with formatting?

我想在 rmarkdown 文件中创建按钮(或可选表格),允许用户复制表格并将其粘贴到 word 或 excel 中,并带有一些预定义的格式。

有没有办法生产:

  • 保留表格格式的副本 function,尤其是单元格的边框
  • 捕获整个表的副本 function

使用这个非常简单的 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,我可能会将其视为无效的解决方案。 我没有尝试使用不同版本的流行浏览器打开。

编织到 html 后,按钮将出现在表格下方,如下所示: 在此处输入图像描述

点击按钮后,粘贴到 Excel 中,边框、粗体标题和标题就显示出来了!

在此处输入图像描述

在 excel 中,列宽并不能神奇地让事情看起来很好,但这是另一天的一步。

图书馆kableExtra将为您提供帮助。 尝试这个:

library(kableExtra)
data %>%
  kbl() %>%
  kable_paper("hover", full_width = F)

还有其他的styles,请搜索Rdocumentation。 该表如下所示:

在此处输入图像描述

然后我复制:

在此处输入图像描述

最后,粘贴到 Excel 中:

在此处输入图像描述

有时您需要粘贴为“Unicode 文本”或“文本”(可以通过特殊粘贴来完成)。 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM