You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:05:11