R и Microsoft Word: обновление текста в одном документе Word на основе текста в другом документе Word - PullRequest
3 голосов
/ 26 сентября 2019

Обновленная версия моего вопроса.Ниже приведен код для создания двух документов Word.Первый документ содержит серию названий таблиц, каждая с сопровождающей закладкой.Второй документ содержит фактическую таблицу.

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

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

read_docx() %>%

body_add_par(value = "Fred Table", style = "table title") %>%
body_add_par("") %>%
body_bookmark(id = "FredBMK") %>%
body_add_par("") %>%

body_add_par(value = "Sally Table", style = "table title") %>%
body_add_par("") %>%
body_bookmark(id = "SallyBMK") %>%
body_add_par("") %>%               

body_add_par(value = "George Table", style = "table title") %>%
body_add_par("") %>%
body_bookmark(id = "GeorgeBMK") %>%
body_add_par("") %>%                               

body_add_par(value = "Sample Data from the mtcars Dataset", style = "table title") %>%
body_add_par("") %>%
body_bookmark(id = "mtcarsBMK") %>%
body_add_par("") %>%                                               

body_add_par(value = "Susan Table", style = "table title") %>%
body_add_par("") %>%
body_bookmark(id = "SusanBMK") %>%
body_add_par("") %>%                               

print(target = "Test Report Skeleton.docx")


read_docx() %>%
body_add_par(value = "Table Title (Corresponding to mtcarsBMK) from Other Document Goes Here", style = "table title") %>%
body_add_par("") %>%
body_add_flextable(flextable(mtcars[1:12, 1:3])) %>%
print(target = "Test Target Table.docx")

Оригинальный вопрос:

Я использую офицерский пакет R для создания документов Word.Представьте себе сценарий, в котором текст изначально синхронизируется в двухслойных документах.Один - это отчет большего размера, а другой - таблица, которая создается и затем автоматически вставляется в отчет.Название таблицы начинается одинаково в обоих документах.Теперь предположим, что медицинский писатель вручную изменяет заголовок таблицы в отчете.Я хотел бы иметь возможность обнаружить это, а затем автоматически обновить заголовок в таблице, чтобы он соответствовал содержанию в отчете.

Документация пакета офицера показывает, как заменить текст в одном документе пользователемуказанная текстовая строка.Мне не совсем понятно, можно ли его использовать для того, чего я пытаюсь достичь.Мне также не ясно, что это не может быть сделано внутри офицера.

Ниже приведен код, который создает документы из двух слов.Один представляет отчет, в котором были внесены изменения в заголовок таблицы.Другая представляет исходную таблицу, для которой заголовок необходимо обновить, чтобы он соответствовал отчету.Разница незначительна.В одном названии есть все заглавные буквы, а в другом - нет.

Я надеюсь, что кому-то станет ясно, как обнаружить изменение в первом документе, а затем обновить заголовок во втором документе.

library(officer)
library(magrittr)

read_docx() %>%
body_add_par(value = "AWESOME Table", style = "table title") %>%
body_add_par("") %>%
body_bookmark(id = "AwesomeBMK") %>%
body_add_par("(Awesome table appears here immediately after AwesomeBMK bookmark)") %>%
print(target = "Awesome Report.docx")

read_docx() %>%
body_add_par(value = "Awesome Table", style = "table title") %>%
body_add_par("") %>%
body_bookmark(id = "AwesomeBMK") %>%
body_add_par("(Awesome table appears here immediately after AwesomeBMK bookmark)") %>%
print(target = "Awesome Table.docx")

1 Ответ

1 голос
/ 26 сентября 2019

Я не совсем уверен, какой документ изменить, чтобы быть правильным, я был бы признателен за блок-схему, чтобы лучше следовать вашему рабочему процессу.

Для моего решения сначала я создаю ваши документы и сохраняю путь, чтобы прочитать его позже,(вы должны прочитать их из своего каталога позже).Чем я прочел документ с docx_summary(), сравнил оба документа и поищу изменения.Вы не можете изменить несколько изменений с помощью этого кода, но это должно быть выполнимо.Наконец, я использую функции officer для замены текста.

library(officer)
library(magrittr)

doc_copy <- read_docx() %>%
  body_add_par(value = "AWESOME Table", style = "table title") %>%
  body_add_par("") %>%
  body_bookmark(id = "AwesomeBMK") %>%
  body_add_par("(Awesome table appears here immediately after AwesomeBMK bookmark)") %>%
  print(target = "Awesome Report.docx")

doc_orginal <- read_docx() %>%
  body_add_par(value = "Awesome Table", style = "table title") %>%
  body_add_par("") %>%
  body_bookmark(id = "AwesomeBMK") %>%
  body_add_par("(Awesome table appears here immediately after AwesomeBMK bookmark)") %>%
  print(target = "Awesome Table.docx")


#detect change
doc_copy_summary <- read_docx(doc_copy) %>%
  docx_summary()

doc_orginal_summary <- read_docx(doc_orginal) %>%
  docx_summary()

test <- as.data.frame(doc_copy_summary == doc_orginal_summary)

old <- doc_orginal_summary[which(test==F, arr.ind = T)]
change <- doc_copy_summary[which(test==F, arr.ind = T)]

#instert text
my_doc <- read_docx(doc_orginal)  %>% 
  cursor_reach(keyword = paste0(old)) %>% 
  body_add_par(value = paste0(change), pos = "on")%>%
  print(target = "Change Awesome Table.docx")
...