Reputation: 4671
When using knitr
and rmarkdown
together to create a word document you can use an existing document to style the output.
For example in my yaml header:
output:
word_document:
reference_docx: style.docx
fig_caption: TRUE
within this style i have created a default table style - the goal here is to have the kable
table output in the correct style.
When I knit the word document and use the style.docx the tables are not stylized according to the table.
Using the style inspector has not been helpful so far, unsure if the default table style is the incorrect style to modify.
Example Code:
```{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")
```
I do not have a stylized document I can upload for testing unfortunately.
TL;DR: Want to stylise table output from rmarkdown and knitr automatically (via kable)
Update: So far I have found that changing the 'compact' style in the docx will alter the text contents of the table automatically - but this does not address the overall table styling such as cell colour and alignment.
Update 2: After more research and creation of styles I found that knitr
seems to have no problem accessing paragraph styles. However table styles are not under that style category and don't seem to apply in my personal testing.
Update 3: Dabbled with the ReporteRs
package - whilst it was able to produce the tables as a desired the syntax required to do so is laborious. Much rather the style be automatically applied.
Update 4: You cannot change TableNormal style, nor does setting a Table Normal style work. The XML approach is not what we are looking for. I have a VBA macro that will do the trick, just want to remove that process if possible.
Upvotes: 38
Views: 31562
Reputation: 5686
As of 2021, I could not get any of the other suggested answers to work.
However, I did discover the {officedown}
package, which, amongst other things, supports the styling of tables in .docx
documents. You can install {officedown}
with remotes::install_github("davidgohel/officedown")
To use {officedown}
to render .Rmd
to .docx
you must replace
output:
word_document
in your document header with
output:
officedown::rdocx_document
In addition to this the {officedown}
package must be loaded in your .Rmd
.
As with the word_document
output format, {officedown}
allows us to use styles and settings from template documents, again with the reference_docx
parameter.
With a reference document styles.docx
, a minimal example .Rmd
may look like:
---
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}
allows us to go one step further and specify the name of the table style to use in the document's front matter. This table style could be a custom style we created in styles.docx
, or it could be one of Word's in-built styles you prefer.
Let's say we created a style My Table
:
We could tell {officedown}
to use this table style in our front matter as:
output:
officedown::rdocx_document:
reference_docx: styles.docx
tables:
style: My Table
Putting this altogether, knitting the minimal .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)
```
Resulting in a .docx
document which looks like:
Upvotes: 6
Reputation: 5702
You need to have a reference_docx: style.docx
which has "Table" style in it. (see @Liang Zhang's explanation and links above).
pandoc -o custom-reference.docx --print-default-data-file reference.docx
reference.docx
file, find the table created (a basic 1 row table with a caption).Using this reference document, you can also change the table and figure caption styles.
Upvotes: 2
Reputation: 829
This was actually a known issue. Fortunately, it was solved in v2.0 or later releases of pandoc
.
And I have tested the newer version, and found that there is a newly-added hidden style called "Table". Following @CL.'s suggestions to change "Table" style in reference.docx
will be okay now.
In addition, look at this entry of pandoc
's v2.0 release notes:
Use
Table
rather thanTable Normal
for table style (#3275).Table Normal
is the default table style and can’t be modified.
Upvotes: 7
Reputation: 13
I was able to get my word output to use a default table style that I defined in a reference .docx.
Instead of 'TableNormal', the table style it defaulted to was 'Table'.
I discovered this by knitting an rmarkdown with a kable.
---
date: "December 1, 2017"
output:
word_document:
reference_docx: Template.docx
---
`r knitr::kable(source)`
Then I took a look at that generated document's XML to see what style it had defaulted to.
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
I defined the 'Table' style to put some color and borders in the reference docx. This works for one standard table style throughout the document, I haven't found a way to use different styles throughout.
This stayed true even after I opened the reference doc and edited it.
Upvotes: 0
Reputation: 5259
TableNormal
doesn't work for me too.
On my Dutch version of Word 2016 (Office 365), I found out that I could markup tables with the style Compact
.
Input (refdoc.docx
contains the Compact
style):
---
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"
---
And RMarkdown:
# Methoden {#methoden}
```{r}
kable(cars)
```
Output:
Upvotes: 2
Reputation: 14997
This is essentially a combination of the answer that recommends TableNormal
, this post on rmarkdown.rstudio.com and my own experiments to show how to use a TableNormal
style to customize tables like those generated by kable
:
RMD:
---
output:
word_document
---
```{r}
knitr::kable(cars)
```
TableNormal
as style name and define the desired styles. In my experiments most styles worked, however some did not. (Adding a color to the first column and making the first row bold was no problem; highlighting every second row was ignored.) The last screenshot in this answer illustrates this step.styles.docx
.Modify the header in the RMD file to use the reference DOCX (see here; don't screw up the indentation – took me 10 minutes find this mistake):
---
output:
word_document:
reference_docx: styles.docx
---
Knit to DOCX again – the style should now be applied.
Following the steps I described above yields this output:
And here a screenshot of the table style dialog used to define TableNormal
. Unfortunately it is in German, but maybe someone can provide an English version of it:
As this does not seem to work for most users (anyone but me …), I suggest we test this systematically. Essentially, there are 4 steps that can go wrong:
TableNormal
style is saved in the DOCX.I therefore suggest using the same minimal RMD posted above (full code on pastebin) to find out where the results start do differ:
TableNormal
added: reference.docxThe three files are generated on the following system: Windows 7 / R 3.3.0 / RStudio 0.99.896 / pandoc 1.15.2 / Office 2010.
I get the same results on a system with Windows 7 / R 3.2.4 / RStudio 0.99.484 / pandoc 1.13.1 / Office 2010.
I suppose the most likely culprits are the pandoc and the Office versions. Unfortunately, I cannot test other configurations at the moment. Now it would be interesting to see the following: For users where it does not work, what happens …
With a number of users running these tests it should be possible to find out what is causing the problems.
Upvotes: 23