R Officer Обновить текст фигуры - PullRequest
0 голосов
/ 11 февраля 2020

Я использую officer для создания еженедельной колоды PowerPoint для моего управления. Они предоставили мне шаблон, который они будут использовать sh. Я автоматизировал весь процесс, за исключением одной части, которая вызывает у меня некоторые трудности. Я надеялся, что кто-то может помочь с

. Первый слайд в шаблоне для них - очень приятный слайд, но содержит текстовое поле с Номер недели, к которой относится отчет, например, Report Week 5. Я буду sh менять это каждую неделю, когда запускаю отчет. Следующая итерация будет Report Week 6. Имя текстового поля называется TextField 26, когда я нажимаю ALT + F10 в windows

Я пробовал множество решений от здесь , здесь и здесь

Я просто не могу сослаться на сам слайд в шаблоне. Я видел ответ на GITHUB, связанный с похожим вопросом, где совет заключался в том, чтобы удалить старую форму и добавить ее заново. Я был бы счастлив сделать это, но опять же я не могу сослаться на титульный слайд.

Я был бы очень признателен, если бы кто-нибудь понял это

Большое спасибо за ваше время

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Я думаю, что у вас будет этот заполнитель в шаблоне, а не на существующем слайде, что упростит управление. Однако, если вы используете powerpoint, где первый слайд содержит пустую фигуру с именем «TextField 26», код офицера будет:

enter image description here

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

1 голос
/ 14 февраля 2020

Чтобы go от моего комментария, я написал функцию, которая должна работать. К сожалению, пакет 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, указана в документации) может содержать текст и текст, мы пытаемся найти и заменить функцию в этом объекте фигуры.

Если вы знали точный индекс фигуры, то вам не нужно беспокоиться о al oop, но это сделает большую часть тяжелой работы за вас. Поэтому, если текстовое поле действительно уникально в вашем шаблоне, это должно решить вашу проблему.

...