|
导入包 library(magrittr)
library(officer) 创建docx对象 doc = read_docx() 创建表格数据 data1 =data.frame(
"name" = c("jack","rose","tom"),
"age"= c(18,18,22),
"hobby" = c("game","food","sleep")
)
print(data1)
# name age hobby
# 1 jack 18 game
# 2 rose 18 food
# 3 tom 22 sleep 添加表格
body_add_table(
x, # doc对象
value, # 表格数据 dataframe
style = NULL, # 风格
header = TRUE, # 显示标题
alignment = NULL, # 列对齐,参数长度必须与列长度匹配,left ,right , cneter,也可以首字母
align_table = "center", # 表格在文档中的对齐方式 left/right/center
stylenames = table_stylenames(),
)
body_add_flextable(x) # x 为flextable对象 表格属性
prop_table(
style = NA_character_, # 用于格式化表格的表格样式
layout = table_layout(), # 表格宽度布局
width = table_width(), # 文档表格宽度
stylenames = table_stylenames(), # 列样式格式
colwidths = table_colwidths(), # 列宽
tcf = table_conditional_formatting(), # 定义条件
align = "center" # 对齐
)
table_stylenames(stylenames = list())有两种形式定义
# 第一种形式
stylenames <- c(
vs = &#34;centered&#34;, am = &#34;centered&#34;,
gear = &#34;centered&#34;, carb = &#34;centered&#34;
)
# 第二种形式
stylenames <- list(
&#34;centered&#34; = c(&#34;vs&#34;, &#34;am&#34;, &#34;gear&#34;, &#34;carb&#34;)
)
table_stylenames(stylenames = stylenames)
table_colwidths(widths = NULL)
table_layout(type = &#34;autofit&#34;)
# fixed 固定
# autofit 自动 结合flextable包进行美化表格
libary(flextable)
get_table = function(data,bg_color,border_color){
ft = flextable(data) # 创建flextable对象
ft = theme_box(ft) # 添加主题
# 设置线条颜色
ft = border(
ft,
# &#34;none&#34; or &#34;solid&#34; or &#34;dotted&#34; or &#34;dashed&#34;
border=fp_border(color=border_color,style=&#34;solid&#34;,width=0.5),
part=&#34;all&#34;)
# 修改全局字体大小为10
ft = fontsize(ft,size=10,part=&#34;all&#34;)
# 设置边框与文字间距 左右为4 上下为8
ft = padding(
ft,
padding.left=4,
padding.right=4,
padding.top=8,
padding.bottom=8,
part=&#34;all&#34;)
#
ft = width(ft,width=1.654)
# 文字对齐方式 &#39;left&#39;、&#39;right&#39;、&#39;center&#39;、&#39;justify&#39;
ft = align(ft,align=&#34;center&#34;,part=&#34;all&#34;)
# 背景色
ft = bg(ft,bg=bg_color,part=&#34;header&#34;)
# 字体
ft = font(ft,fontname=&#34;微软雅黑&#34;,part=&#34;all&#34;)
# 返回表格
return(ft)
}
t = get_table(data,&#34;#DDECEE&#34;,&#34;#0096B2&#34;)
doc %>%
body_add_flextable(t)
print(doc,&#39;1.docx&#39;)

flextable还有一些其他常见的函数
# 合并单元格,所有行和列必须是连续的
merge_at(
x, # flextable对象
i = NULL, # 行
j = NULL, # 列
part = &#34;body&#34; # 表的部分
)
# 当连续单元格具有相同的值时,水平合并
merge_h(
x, # flextable对象
i = NULL, # 行
part = &#34;body&#34; # 表的部分
)这些行和列也支持布尔值选择
t = get_table(data,&#34;#DDECEE&#34;,&#34;#0096B2&#34;)
# 合并了年龄等于22的,即tom
t = merge_at(t,i = ~age == 22,part = &#34;body&#34;)
doc %>%
body_add_flextable(t)
print(doc,&#39;1.docx&#39;)
 |
|