【问题标题】:R Officer Update the text of a shapeR 官员 更新形状的文本
【发布时间】:2020-02-18 18:42:24
【问题描述】:

我正在使用officer 为我的管理层生成每周一次的 PowerPoint 幻灯片。 他们为我提供了他们希望使用的模板。 我已经自动化了整个过程,除了一个给我带来一些困难的部分,我希望有人能提供帮助

模板中的第一张幻灯片是一张非常漂亮的封面幻灯片,但包含一个带有报告要处理的周数的文本框,例如Report Week 5。我希望每周在运行报告时更改这一点。下一次迭代将是Report Week 6。当我在 Windows 中按 ALT+F10 时,文本框的名称称为 TextField 26

我尝试了hereherehere 的众多解决方案

我似乎无法在模板中引用幻灯片本身。我在 GITHUB 上看到了与类似问题相关的响应,其中建议删除旧形状并重新添加它。我很乐意这样做,但我再次无法引用标题幻灯片。

我非常感谢任何人对此的见解

非常感谢您的宝贵时间

【问题讨论】:

  • 如果您使用的是 Windows 计算机,我强烈建议您查看 RDCOMClient 软件包。它基本上允许您通过 Outlook、word、powerpoint、excel 等 Microsoft 应用程序执行通常会执行的所有操作。唯一的缺点是如何访问某些方法和功能并不总是很明显。为此,您可以在以下web page 中探索对象模型。听起来,您可能只想执行“查找和替换”方法。

标签: r officer


【解决方案1】:

为了结束我的评论,我编写了一个应该可以工作的函数。不幸的是,RDCOMClient 软件包确实要求您在 Windows 计算机上工作

devtools::install_github("omegahat/RDCOMClient")
library(RDCOMClient)

ReplaceTextInObject <- function(path, Find, Replace, SlideNum = NULL){
  ppApp <- COMCreate("powerpoint.application")
  #Requires absolute paths from C drive
  path <- normalizePath(c("C://Users",path), winslash = "\\")[2] 
  ppoint <- ppApp[["Presentations"]]$Open(path, WithWindow = F)
  slides <- 1:ppoint$Slides()$Count()
  #if SlideNum is NULL - loop through each slide
  if(!is.null(SlideNum)&&
     all(SlideNum%%1)==0&&
     all(SlideNum<=ppoint$Slides()$Count())){
    slides <- SlideNum
  } else{
    stop("m must be either an integer or NULL")
  } 

  for(j in slides){
    Slide <- ppoint$Slides(j)
    n <- Slide$Shapes()$Range()$Count() # Total number of shape objects on slide
    #if there are shapes with text - attempt find and replace
    if(n>0){
      for(i in 1:n){
        if(Slide$Shapes(i)$HasTextFrame()==-1&&
           Slide$Shapes(i)$TextFrame()$HasText()==-1){
             Slide$Shapes(i)$TextFrame()$TextRange()$Replace(FindWhat = Find,
                                                             ReplaceWhat = Replace)
        }
      }
    }
  }

  ppoint$Save()
  ppoint$Close()
  rm(Slide, ppoint, ppApp)
}

此函数将获取幻灯片编号,然后查看幻灯片中的所有对象。如果对象(或文档中列出的 VBA 中的形状)可以包含文本并且具有文本,那么我们尝试在该形状对象中查找和替换功能。

如果您知道确切的形状索引,那么您就不需要为循环而烦恼,但这将为您完成大部分繁重的工作。因此,如果文本字段在您的模板中确实是唯一的,那么这应该可以解决您的问题。

【讨论】:

  • 谢谢@Justin Landis,这正是我所需要的。它为我指明了正确的方向。我需要等一个小时才能给你积分:)
  • 没问题@JohnSmith。 RDCOMClient 最糟糕的部分是弄清楚如何访问方法和属性。此外,如果您不小心编码,它可能会失败并显示非信息性错误消息。我编辑了该功能,使其更加强大,并且能够采用一系列幻灯片编号来进行查找和替换。我最初开始使用RDCOMClient 而不是officer,因为它们的查找和替换文本功能并不总是有效,因为文本(至少在word 文档中)并不总是在同一个节点列表中。不是我完全理解的东西,但它与 xml 代码有关。
【解决方案2】:

我认为您将在模板中而不是在现有幻灯片中使用此占位符会使事情更容易管理。但是,如果您使用的第一张幻灯片包含一个名为“TextField 26”的空形状的幻灯片,则官员代码将是:

library(officer)
doc <- read_pptx("update_shape_text.pptx")
doc <- ph_add_text(doc, str = "Report Week 5", ph_label = "TextField 26") 
print(doc, "result.pptx")

请注意,我无法附加 update_shape_text.pptx,因此我使用了 github 问题,以便您可以获取文件。 https://github.com/davidgohel/flextable/issues/189

【讨论】:

  • 嗨@David Gohel,非常感谢您的解释。如果我在演示模板中添加几张幻灯片,我会收到错误消息:Error in xpath_search(x$node, x$doc, xpath = xpath, nsMap = ns, num_results = 1) : Expecting a single string value: [type=character; extent=0].。这可能与我对pos 字段如何工作的误解有关
  • 很抱歉,如果没有任何可重现的代码,我将无法提供帮助。最好的办法是创建一个新帖子,让人们准确地复制您的代码,这样他们就可以帮助您而无需猜测:)
猜你喜欢
  • 2020-08-08
  • 2020-10-24
  • 2019-02-09
  • 1970-01-01
  • 2022-12-16
  • 2020-12-01
  • 2014-12-06
  • 1970-01-01
  • 2021-05-18
相关资源
最近更新 更多