Knitr& Rmarkdown docx表格

时间:2016-06-07 06:20:40

标签: r knitr r-markdown docx pandoc

knitrrmarkdown一起用于创建Word文档时,您可以使用现有文档来设置输出的样式。

例如在我的yaml标题中:

output: 
  word_document:
    reference_docx: style.docx
    fig_caption: TRUE

在这种风格中,我创建了一个默认的表格样式 - 这里的目标是以正确的样式输出kable表格。

当我编写word文档并使用style.docx时,表格不会根据表格进行样式化。

到目前为止,使用样式检查器没有帮助,不确定默认表格样式是否是要修改的错误样式。

示例代码:

```{r kable}
n <- 100
x <- rnorm(n)
y <- 2*x + rnorm(n)
out <- lm(y ~ x)
library(knitr)
kable(summary(out)$coef, digits=2, caption = "Test Captions")
```

不幸的是,我没有可以上传的程式化文档进行测试。

TL; DR:想要自动设定rmarkdown和knitr的表输出(通过kable)

更新:到目前为止,我发现更改了&#39; compact&#39; docx中的样式将自动更改表格的文本内容 - 但这并不能解决整个表格样式,如单元格颜色和对齐方式。

更新2:经过更多研究和创建样式后,我发现knitr似乎没有问题来访问段落样式。但是,表格样式不属于该样式类别,并且似乎不适用于我的个人测试。

更新3:涉及ReporteRs软件包 - 虽然它能够生成表格,但是这样做所需的语法很费力。更确切地说,风格会自动应用。

更新4:您无法更改TableNormal样式,也无法设置“表格正常”样式。 XML方法不是我们想要的。我有一个VBA宏可以解决这个问题,只是想在可能的情况下删除该过程。

6 个答案:

答案 0 :(得分:12)

这实际上是the answer that recommends TableNormalthis post on rmarkdown.rstudio.com和我自己的实验的组合,以展示如何使用TableNormal样式来自定义由kable生成的表格:< / p>

<强> RMD

---
output:
  word_document
---

```{r}
knitr::kable(cars)
```
  • 点击RStudio中的“Knit Word”。 →文档在Word中打开,没有任何自定义样式。
  • 在该文档中(新文档中),添加所需的样式。 This article解释了基础知识。关键是不应用直接样式,而是修改样式。见this article on support.office.com on Style basics in Word
  • 具体来说,要设置表格样式,您需要添加表格样式。我的Word版本是非英语的,但根据上面链接的文章,表格样式可以通过“设计选项卡,在表格工具上下文选项卡上”获得。
  • 选择TableNormal作为样式名称并定义所需的样式。在我的实验中,大多数样式都有效,但有些样式没有。 (向第一列添加颜色并使第一行变为粗体没有问题;忽略每一秒的突出显示。)此答案中的最后一个屏幕截图说明了此步骤。
  • 保存文档,例如为styles.docx
  • 修改RMD文件中的标题以使用参考DOCX(参见here;不要搞砸缩进 - 花了我10分钟发现这个错误):

    ---
    output:
      word_document:
        reference_docx: styles.docx
    ---
    
  • 再次编织到DOCX - 现在应该应用样式。

按照上面描述的步骤产生此输出:

Output

这里是用于定义TableNormal的表格样式对话框的屏幕截图。不幸的是,这是德语,但也许有人可以提供它的英文版本:

Table Style

由于这似乎对大多数用户(除了我......之外的任何人)都不起作用,我建议我们系统地测试一下。基本上,有4个步骤可能出错:

  • 错误的RMD(不太可能)。
  • 最初生成的DOCX的差异。
  • DOCX中保存TableNormal样式的方式不同。
  • 参考DOCX如何用于格式化最终DOCX的差异。

因此,我建议使用上面发布的相同的最小RMD(full code on pastebin)来找出结果开始的位置不同:

这三个文件在以下系统上生成:Windows 7 / R 3.3.0 / RStudio 0.99.896 / pandoc 1.15.2 / Office 2010。

我在使用Windows 7 / R 3.2.4 / RStudio 0.99.484 / pandoc 1.13.1 / Office 2010的系统上获得相同的结果。

我认为最有可能的罪魁祸首是pandoc和Office版本。不幸的是,我目前无法测试其他配置。现在看到以下内容会很有趣:对于不起作用的用户,会发生什么......

  • ...如果你从initial.docx开始?
  • 如果这不起作用,如果您使用我的reference.docx作为参考文件怎么办?
  • 如果没有任何效果,生成的XML文件(DOCX容器内)是否存在引人注目的差异?请分享您的文件和确切的版本信息。

有许多用户运行这些测试,应该可以找出导致问题的原因。

答案 1 :(得分:4)

这实际上是a known issue。幸运的是,它在pandoc的v2.0或更高版本中得到了解决。

我测试了新版本,发现有一个新添加的隐藏样式称为“”。关注@ CL。建议改变reference.docx中的“表格”风格现在没问题。

此外,请查看pandoc的v2.0发行说明的此条目:

  

对表格样式(#3275)使用Table而不是Table NormalTable Normal是默认的表格样式,无法修改。

答案 2 :(得分:3)

截至 2021 年,我无法获得任何其他建议的答案。

但是,我确实发现了 {officedown} 包,它支持 .docx 文档中表格的样式。您可以使用 {officedown}

安装 remotes::install_github("davidgohel/officedown")

要使用 {officedown}.Rmd 渲染为 .docx,您必须替换

output:
  word_document

在您的文档标题中使用

output:
  officedown::rdocx_document

除此之外,{officedown} 包必须加载到您的 .Rmd 中。

word_document 输出格式一样,{officedown} 允许我们使用模板文档中的样式和设置,再次使用 reference_docx 参数。

对于参考文档 styles.docx,最小示例 .Rmd 可能如下所示:

---
date: "2038-01-19"
author: "The Reasonabilists"
title: "The end of time as we know it"
output: 
  officedown::rdocx_document:
    reference_docx: styles.docx
---

```{r setup, include = FALSE}
# Don't forget about me: I'm important!
library(officedown)
```

{officedown} 允许我们更进一步,指定要在文档前端使用的表格样式的名称。此表格样式可以是我在 styles.docx 中创建的自定义样式,也可以是我喜欢的 Word 内置样式之一。

假设我创建了一个样式 My Table

enter image description here

我可以告诉 {officedown} 在我的前台使用这种表格样式:

output: 
  officedown::rdocx_document:
    reference_docx: styles.docx
    tables:
      style: My Table

总之,编织最小的.Rmd

---
date: "2038-01-19"
author: "The Reasonabilists"
title: "The end of time as we know it"
output: 
  officedown::rdocx_document:
    reference_docx: styles.docx
    tables:
      style: My Table
---

```{r setup, include = FALSE}
# Don't forget about me: I'm important!
library(officedown)
```

```{r}
head(mtcars)
```

生成一个 .docx 文档,如下所示:

enter image description here

答案 3 :(得分:2)

您需要有一个reference_docx: style.docx,其中带有“表格”样式。 (请参见上面的@Liang Zhang的说明和链接)。

  1. 使用pandoc(source)创建基础参考文档。在命令行(或Windows上的cmd.exe)中运行: pandoc -o custom-reference.docx --print-default-data-file reference.docx
  2. 在这个新创建的reference.docx文件中,找到创建的表(带标题的基本1行表)。
  3. 选中表格后,点击“表格设计”,然后找到“修改表格样式”:

enter image description here

  1. 根据需要修改表的样式,并在RMD文档中使用此参考文档(请参阅@CL的第一个答案。)。

使用此参考文档,您还可以更改表格和图形标题的样式。

答案 4 :(得分:0)

TableNormal也不适合我。

在我的荷兰语版本的Word 2016(Office 365)上,我发现我可以使用 Compact 样式标记表格。

输入(refdoc.docx包含Compact样式):

---
title: "Titel"
subtitle:  "Ondertitel"
author: "`r Sys.getenv('USERNAME')`"
output:
  word_document:
    toc: true
    toc_depth: 2
    fig_width: 6.5
    fig_height: 3.5
    fig_caption: true
    reference_docx: "refdoc.docx"
---

和RMarkdown:

# Methoden {#methoden}
```{r}
kable(cars)
```

输出:

img

答案 5 :(得分:0)

我能够将单词输出设置为使用我在参考.docx中定义的默认表格样式。

而不是&#39; TableNormal&#39;,它默认为的表样式是&#39;表&#39;。

我通过用kable编织rmarkdown来发现这一点。

---
date: "December 1, 2017"
output: 
  word_document:
    reference_docx: Template.docx
---
`r knitr::kable(source)`

然后,我查看了生成的文档的XML,看看它默认的样式。

require(XML)

docx.file <- "generated_doc.docx"

## unzip the docx converted by Pandoc
system(paste("unzip", docx.file, "-d temp_dir"))
document.xml <- "temp_dir/word/document.xml"

doc <- xmlParse(document.xml)
tblStyle <- getNodeSet(xmlRoot(doc), "//w:tblStyle")

tblStyle

我定义了&#39;表&#39;样式在参考docx中放置一些颜色和边框。这适用于整个文档中的一种标准表格样式,我还没有找到一种方法来使用不同的样式。

即使在我打开参考文档并对其进行编辑之后,这仍然存在。