officedown文档中flextable表格标题与表格异页问题解决方案
问题描述
编制R Markdown导出Word文档时,若在文末设置「表格」专章集中展示全文引用表格,会遇到如下排版异常:flextable生成的跨多页长表格,无论页面为纵向/横向模式,均出现表格标题单独占据一页、表格主体从下一页开始排布的问题。
- 纵向模式表现:仅调用
head()展示表格前几行时排版正常,全量展示长表格时出现标题、表格异页异常,内容跨两页显示
- 横向模式表现:存在完全相同的标题、表格异页异常

目标效果:表格标题始终位于关联表格正上方,二者保持在同一页面。
问题根源
异常由三个配置问题共同导致:
- officedown默认生成的表格标题段落,未开启「与下段同页」属性
- flextable默认未配置表格首行与上方内容的绑定规则,长表格自动跨页时,Word分页逻辑会把标题单独留在上一页
- 分节符函数
block_section()和表格生成代码写在同一个代码块,分节符插入位置不当会干扰表格分页逻辑
修复方案
通过3处调整即可解决问题:
- 全局开启knitr表格标题的「与下段同页」属性
- 全局配置flextable允许长表格跨页,且强制表格首行与上方标题绑定
- 将
block_section()从表格生成代码块中拆分,放在独立代码块中,避免分节符干扰分页
修复后完整可运行代码
--- output: officedown::rdocx_document --- ```{r setup, echo=F, message=F, warning=F} knitr::opts_chunk$set(echo = F, collapse = T, fig.align = "center", fig.width = 6, fig.height = 8, fig.cap = T, fig.pos = "!h", message = F, warning = F, # 表格标题强制与后续表格同页 tab.cap.keep_with_next = TRUE) library(magrittr) library(dplyr) library(officedown) library(officer) library(flextable) # 全局配置flextable跨页规则 set_flextable_defaults( split = TRUE, # 允许长表格跨页拆分 keep_with_next = TRUE # 表格首行与上方标题绑定 ) # 纵向分节配置 portrait <- prop_section(type = "continuous") # 横向分节配置 landscape <- prop_section(page_size = page_size(orient = "landscape"), type = "continuous") # 表格宽度适配页面函数 FitFlextableToPage <- function(ft, pgwidth = 6){ ft_out <- ft %>% autofit() ft_out <- width(ft_out, width = dim(ft_out)$widths*pgwidth /(flextable_dim(ft_out)$widths)) return(ft_out) } set.seed(12345) # 保证示例数据可复现
# 构造测试表格数据 years <- 1990:2022 table1 <- tibble(year = years, dat1 = sample(rnorm(n = 1000, 0, 2), size = length(years), replace = T)) %>% mutate(year = as.character(year), dat2 = dat1 * 10, dat3 = dat1 * 1000)
纵向页面表格测试
foot <- "Preliminary data." # 脚注内容 col_names <- c("Year", "Column 1", "Column 2", "Column 3") # 表头 cor <- which(with(table1, year %in% 2021:2022)) # 脚注对应行位置 names(table1) <- col_names
table1 %>% head() %>% flextable() %>% autofit()
\newpage
table1 %>% flextable() %>% footnote(i = cor, j = 1, value = as_paragraph(foot), ref_symbols = "a", part = "body")
# 分节符单独放在独立代码块,避免干扰表格分页 block_section(portrait)
横向页面表格测试
Let's put these same tables on a landscape page.
table1 %>% head() %>% flextable() %>% autofit()
\newpage
table1 %>% flextable() %>% footnote(i = cor, j = 1, value = as_paragraph(foot), ref_symbols = "a", part = "body") %>% FitFlextableToPage(pgwidth = 9.5)
block_section(landscape)
后续纵向内容
bla bla bla.
> 配置生效后,无论纵向/横向页面,长表格跨页时标题都会和表格第一行固定在同一页,不会再出现标题独占一页的异常。 内容的提问来源于stack exchange,提问作者jordan_oplante
相关产品推荐
相关产品推荐

