R Markdown knit导出Word时如何实现动态页眉页脚?
问题核心原因
你当前配置不生效有两个核心问题:
header-includes中填写的fancyhdr相关配置是LaTeX语法,仅对PDF输出生效,Word渲染时不会解析这类命令,完全不生效- 静态Word参考文档的页眉是固定内容,无法跟随
params参数动态更新
解决方案
使用officer和officedown包实现Word输出的动态页眉,操作步骤如下:
1. 安装依赖包
install.packages(c("officer", "officedown"))
2. 修改YAML配置
删除原有LaTeX相关的header-includes配置,调整output格式为officedown的docx输出,修改后YAML如下:
--- title: "test doc" author: - Author 1 - Author 2 date: "`r format(Sys.time(), '%B %d, %Y')`" output: officedown::rdocx_document: reference_docx: test1.docx params: client: "Steve" always_allow_html: true ---
注意:请先清空你的参考文档test1.docx里原有的静态页眉,避免和动态生成的页眉冲突,文档其他格式(字体、段落样式等)可以正常保留。
3. 添加动态页眉配置代码块
在YAML结束后的第一行,添加一个不显示输出的R代码块:
```{r setup, echo=FALSE, message=FALSE, warning=FALSE} library(officer) # 构造三行页眉内容 header <- block_list( # 第一行:客户名称 fpar(ftext(params$client, prop = fp_text(font.size = 10.5, font.family = "宋体"))), # 第二行:日期 fpar(ftext(format(Sys.time(), '%B %d, %Y'), prop = fp_text(font.size = 10.5, font.family = "宋体"))), # 第三行:页码,固定总页数为3的写法 fpar( ftext("Page ", prop = fp_text(font.size = 10.5, font.family = "宋体")), run_word_field(field = "PAGE"), ftext(" of 3", prop = fp_text(font.size = 10.5, font.family = "宋体")) ) ) # 给所有页面应用页眉 default_section <- section_properties(header = header) body_set_default_section(current_doc(), property = default_section)
> 如果需要动态计算总页数,把第三行的`" of 3"`替换为`ftext(" of ", prop = fp_text(font.size = 10.5, font.family = "宋体")), run_word_field(field = "NUMPAGES")`即可。 #### 4. 批量渲染脚本示例 循环遍历客户列表生成报告时,传入对应client参数即可自动更新页眉: ```r client_list <- c("Steve", "张三", "李四") for (c in client_list) { rmarkdown::render( input = "你的报告脚本路径.Rmd", output_file = paste0(c, "_定制报告.docx"), params = list(client = c) ) }
内容的提问来源于stack exchange,提问作者LTravis
相关产品推荐
相关产品推荐

