创建 flextable 后删除 flextable 列

use*_*593 5 flextable

我基于 csv 文件创建了一个 flextable,我在上面添加了一些样式,更改了一些单元格。然后我想将它添加到文档之前删除这个 flextable 的特定列。有没有办法创建 flextable 的副本并指定 col_keys?

mydf <- GetData(....)
cols <- names(mydf)
myft <- flextable(mydf, col_keys = cols)
# Adding style to ft...
# ....

# Here I want to remove one column to the ft (and only here, not when first creating the ft)
# something as:
# ft <- CreateCopyOfFlextable(ft,cols[-which(cols=='COLB')])
#
my_doc <- read_docx()
my_doc <- my_doc %>%  body_add_par("")   %>%
  body_add_flextable(value = ft) 

print(my_doc, target = 'c:/temp/doc.docx')
Run Code Online (Sandbox Code Playgroud)

D. *_*ods 6

我只是遇到了同样的问题,并且有一段时间在谷歌上搜索解决方案。@David-Gohel 在这里确实有答案,但我觉得有必要提供一个类似的解决方案,并提供额外的解释。

我的问题和 OP 是我们想使用不会显示的列中的数据来影响将显示的列的格式。最初并不明显的概念是,您可以将数据帧发送到flextable包含比您打算显示更多的列(而不是显示所有并删除您使用过的列)。然后,通过使用该col_keys参数,您可以只选择那些你想显示,同时保持其余的周围进行额外的处理(例如,对于使用列compose()paragraph()add_chunk())。

如果我理解正确,COLB应该是一个标志,表明COLC应该修改某些行。如果是这样,那么我的解决方案如下所示:

library(flextable)
library(magrittr)
library(officer)

df <- data.frame(COLA=c('a', 'b', 'c'),
                 COLB=c('', 'changevalue', ''),
                 COLC=c(10, 12, 13))

ft <- flextable(df, col_keys = c("COLA", "COLC")) %>% # Retain but don't display COLB
  compose(i = ~ COLB =='changevalue', # Use COLB for conditional modifications
          j = "COLC", 
          value = as_paragraph(as_chunk('100')), 
          part = 'body')  %>% 
  style(i = ~ COLB =='changevalue', # Use COLB for conditional formatting on COLC
        j = "COLC",
        pr_t = fp_text(color = "black", 
                       font.size = 11, 
                       bold = TRUE,
                       italic = FALSE,
                       underline = FALSE,
                       font.family = "Times New Roman"),
        part = "body")

ft
Run Code Online (Sandbox Code Playgroud)

以下是上述代码产生的结果(例如,“changevalue”列是在 COLC 中有条件地插入 100 以及更改格式的触发器):

示例 Flextable


use*_*593 0

我正在基于 COLB 设计另一列的样式。这里有一个例子:

df <- data.frame(COLA=c('a','b','c'),COLB=c('','changevalue',''),COLC=c(10,12,13))
ft<-flextable(df)
ft <- ft %>% style(i=which(ft$body$dataset$COLB=='changevalue'),pr_t=fp_text(color="black",   font.size=11, bold=TRUE,  italic=FALSE, underline=FALSE, font.family="Times New Roman"),part="body")
ft<-compose(ft, i=2,j=3, value = as_paragraph(as_chunk('100')),part = 'body')
# now I want to remove the COLB columns as I don't need it anymore
# ???????
my_doc <- read_docx()
my_doc <- my_doc %>%  body_add_par("")   %>%  body_add_flextable(value = ft) 

print(my_doc, target = 'c:/temp/orliange_p/sample.docx') %>% invisible()
Run Code Online (Sandbox Code Playgroud)

  • 我已经告诉过你不要使用 `x$body$dataset$...`,这是内部结构,有一天可能会改变。仅使用已记录和导出的函数。 (2认同)