【问题标题】:How can I add a table to my rmarkdown html output that will paste into Excel with formatting?如何将表格添加到我的 rmarkdown html 输出中,该表格将粘贴到 Excel 中并进行格式化?
【发布时间】:2021-03-24 15:14:06
【问题描述】:

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

有没有办法制作:

  • 保留表格格式的复制功能,尤其是单元格的边框
  • 捕获整个表的复制函数

使用这个非常简单的数据框:

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 和解决方案来格式化表格和写入 Excel:Write from R into template in excel while preserving formatting,但这并不能回答我的问题问题。

编辑:似乎可以将格式添加到 Excel 按钮,此处提到:https://datatables.net/extensions/buttons/examples/html5/excelBorder.html

这给了我希望,也许格式的.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标签。

【问题讨论】:

  • 似乎可以对datatable 进行一些自定义,但我不知道如何将其应用于我的 r 代码,或者这是否有助于开发一种应用所需格式的方法从datatable复制按钮:datatables.net/extensions/buttons/examples/html5/…
  • 正如我之前在answer 的评论中所说,复制不会保留任何格式。这些是与您的问题相关的一些问题:github.com/rstudio/DT/issues/449github.com/rstudio/DT/issues/445 这些问题被发布了“不会修复”标签,因为复制仅用于保留文本。它只会使用原始数据而不是 HTML 节点。复制后,您可能不得不依赖手动工作。对不起。
  • 很好的发现。我想知道是否有一个创造性的解决方案,我们可以使用其中一个以 excel 为重点的 R 包和一些通用的 htmlwidget 作为按钮,该按钮可以将该表复制到剪贴板。在这里,cran.r-project.org/web/packages/basictabler/vignettes/… 等其他地方,我发现 Excel 格式化是在 R 中完成的,但在制作一个按钮的途径上没有运气,该按钮只会将格式化的表格复制到剪贴板,而不是读取/写入 excel 文件。
  • 我看到了这个问题,它向我介绍了 BIFF 格式:stackoverflow.com/questions/6299824/…。也许这会有所帮助

标签: javascript r r-markdown


【解决方案1】:

此代码应在复制并删除表格标题时为您提供整个表格(尽管没有任何格式,也许有人可以扩展此答案):

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/

【讨论】:

  • 粘贴到 excel 中时,似乎没有单元格格式、粗体标题或任何其他格式。您的链接是数据表功能的良好资源,但我无法弄清楚如何为剪贴板上的复制数据指定格式?您可以编辑您的代码以使您的“复制”按钮包含一些格式吗?
  • 我对这个包的了解也很有限,但是从我使用 DT 的时间来看,我可以定义。说包装有限制。 Copy 只是逐行获取所有文本并用制表符将它们分层(因此,如果在 Word 或 Excel 中粘贴,为什么看不到边框)。我认为Copy 不会为您提供所需的任何格式。您最终将不得不使用 Copy 进行手动工作。这个解决方案至少减少了手工工作......对不起朋友,帮不上忙:(
  • 虽然这个答案没有回答这个问题,但它是目前最好的答案,关于这个问题和原始问题的 cmets 有助于确定可能需要一个新的方向。因此奖励这个答案!非常感谢对话。
  • 感谢@Pake 的 cmets 和赏金。希望在不久的将来一切都对你有用:) 祝你好运朋友。
【解决方案2】:

我在 rmarkdown 文件和 kableExtra 包中找到了一个可行的解决方案,用于创建表。

在使用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 中创建复制功能。接下来,创建一个使用此功能将表格和格式复制到剪贴板的按钮。请注意,我们在创建表时使用的 table.attr ID 需要在此处使用 getElementByID 中的相同术语来复制内容。

<button type="button" onclick="selectElementContents( document.getElementById('tableofdata') );">Copy Table</button>

注意:

我发现当我编织我的 .Rmd 文件并尝试使用 Rstudio 浏览器中出现的按钮时,单击该按钮并没有达到我想要的效果。但是,当我打开生成的 html 文件 Chrome 时,单击按钮成功复制了带有格式的表格。如果我没有尝试过 chrome,我可能会将其视为无效的解决方案。我还没试过用不同版本的流行浏览器打开。

编织成 html 后,按钮将出现在表格下方,如下所示:

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

列宽不会神奇地让 excel 中的东西看起来很好,但这是另一天的一步。

【讨论】:

    【解决方案3】:

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

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

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

    然后我复制:

    最后,粘贴到 Excel 中:

    有时您需要粘贴为“Unicode 文本”或“文本”(可以通过特殊粘贴来完成)。

    【讨论】:

    • 我编辑了我的答案。也许我添加的内容可以帮助你。
    • 表格已粘贴,但似乎没有粘贴任何格式(单元格边框、粗体或彩色文本等)。我添加了另一张图片,希望能提高问题的清晰度。
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多