R中flextable调整单元格高度后文本垂直对齐失效问题求助
问题:R中flextable单元格文本垂直居中失效解决办法
我正尝试在R中还原一个原本用Word制作的表格,目的是通过Rmarkdown生成带有该表格模板的Word文档。已按照原表格调整了单元格的宽度和高度,但修改高度后,单元格内的文本并未随之调整位置。尝试使用valign参数设置文本垂直居中,但没有效果,请问如何实现表格单元格内的垂直对齐?
预期效果

当前实际效果

用到的代码
数据准备代码
column_names <- c("Date", "DD(Month)2024") row_names <- c("identifier", "diameter", "depth", "type", "duration (hh:mm:ss)") pil_table <- data.frame(Date = row_names, DD.Month.2024 = rep(NA, length(row_names)))
flextable设置代码
set_flextable_defaults(font.family = "Arial Nova Cond", font.size = 9, theme_fun = theme_box) pil_table <- flextable(pil_table) pil_table <- pil_table %>% width(j = 1, width = 3.8) %>% width(j = 2, width = 1.36) %>% align(align = "center", part = "header") %>% valign(valign = "center", part = "all") %>% height_all(height = 0.2) %>% hrule(rule = "exact", part = "all") %>% bg(i = 1, j = 1:2, bg = "#034F94", part = "header") %>% color(pil_table, i = 1, j = 1:2, color = "white", part = "header")
加载的库
library("officedown") library("officer") library("bookdown") library("here") library("xlsx") library("DescTools") library("reshape2") library("ggplot2") library("grid") library("colf") library("dplyr") library("lubridate") library("gridExtra") library("bookdown") library("knitr") library("kableExtra") library("ftExtra") library("tidyverse") library("png") library("gridExtra") library("flextable")
解决办法
问题出在hrule(rule = "exact")的设置上:当使用exact规则时,flextable会严格锁定行高,但会导致valign的垂直对齐设置失效。以下是两种可行的解决方案:
方案1:修改行高规则为atleast
将行高规则从exact改为atleast,这样行高会保持不小于设定值,同时允许垂直对齐生效:
pil_table <- pil_table %>% width(j = 1, width = 3.8) %>% width(j = 2, width = 1.36) %>% align(align = "center", part = "header") %>% valign(valign = "center", part = "all") %>% height_all(height = 0.2) %>% hrule(rule = "atleast", part = "all") %>% # 修改行高规则 bg(i = 1, j = 1:2, bg = "#034F94", part = "header") %>% color(i = 1, j = 1:2, color = "white", part = "header")
方案2:用officer段落样式强制居中
如果必须保留exact行高规则,可以通过officer包定义段落样式来强制垂直居中:
# 创建垂直居中的段落样式 centered_par <- fp_par(text.align = "center", vertical.align = "center") pil_table <- pil_table %>% width(j = 1, width = 3.8) %>% width(j = 2, width = 1.36) %>% align(align = "center", part = "header") %>% height_all(height = 0.2) %>% hrule(rule = "exact", part = "all") %>% bg(i = 1, j = 1:2, bg = "#034F94", part = "header") %>% color(i = 1, j = 1:2, color = "white", part = "header") %>% style(pr_p = centered_par, part = "all") # 应用段落样式
额外注意事项
- 确保使用最新版
flextable,旧版本可能存在垂直对齐的bug,可通过update.packages("flextable")更新。 - 原代码中
color()函数的调用有误,链式管道中无需重复传入pil_table参数,保持代码风格一致性。
内容的提问来源于stack exchange,提问作者Elizabeth Küsel
相关产品推荐
相关产品推荐

