library(officer)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# create empty Word file
sample_doc <- read_docx()
sample_doc <- sample_doc %>% body_add_par("This is the first paragraph hallo")
sample_doc <- sample_doc %>% body_add_par("This is the second paragraph")
sample_doc <- sample_doc %>% body_add_par("This is the third paragraph")
# create sample data frame
df <- data.frame(a = 1:10, b = 11:20, c= 21:30)
# add table containing the data frame's contents
sample_doc <- sample_doc %>% body_add_table(df, style = "table_template")
set.seed(0)
# create a temp file
src <- tempfile(fileext = ".png")
# create PNG object
png(filename = src, width = 4, height = 4, units = 'in', res = 400)
# create plot
plot(sample(100, 10))
# save PNG file
dev.off()
## png
## 2
# add PNG image to Word document
sample_doc <- sample_doc %>% body_add_img(src = src, width = 4, height = 4, style = "centered")
print(sample_doc, target = "sample_file.docx")
sample_data <- read_docx("sample_file.docx")
content <- docx_summary(sample_data)
paragraphs <- content %>% filter(content_type == "paragraph")
paragraphs$text
## [1] "This is the first paragraph hallo" "This is the second paragraph"
## [3] "This is the third paragraph" ""
content %>% filter(content_type == "table cell")
## doc_index content_type style_name text level num_id row_id is_header
## 1.1 4 table cell table_template a NA NA 1 TRUE
## 1.4 4 table cell table_template 1 NA NA 2 FALSE
## 1.7 4 table cell table_template 2 NA NA 3 FALSE
## 1.10 4 table cell table_template 3 NA NA 4 FALSE
## 1.13 4 table cell table_template 4 NA NA 5 FALSE
## 1.16 4 table cell table_template 5 NA NA 6 FALSE
## 1.19 4 table cell table_template 6 NA NA 7 FALSE
## 1.22 4 table cell table_template 7 NA NA 8 FALSE
## 1.25 4 table cell table_template 8 NA NA 9 FALSE
## 1.28 4 table cell table_template 9 NA NA 10 FALSE
## 1.31 4 table cell table_template 10 NA NA 11 FALSE
## 2.2 4 table cell table_template b NA NA 1 TRUE
## 2.5 4 table cell table_template 11 NA NA 2 FALSE
## 2.8 4 table cell table_template 12 NA NA 3 FALSE
## 2.11 4 table cell table_template 13 NA NA 4 FALSE
## 2.14 4 table cell table_template 14 NA NA 5 FALSE
## 2.17 4 table cell table_template 15 NA NA 6 FALSE
## 2.20 4 table cell table_template 16 NA NA 7 FALSE
## 2.23 4 table cell table_template 17 NA NA 8 FALSE
## 2.26 4 table cell table_template 18 NA NA 9 FALSE
## 2.29 4 table cell table_template 19 NA NA 10 FALSE
## 2.32 4 table cell table_template 20 NA NA 11 FALSE
## 3.3 4 table cell table_template c NA NA 1 TRUE
## 3.6 4 table cell table_template 21 NA NA 2 FALSE
## 3.9 4 table cell table_template 22 NA NA 3 FALSE
## 3.12 4 table cell table_template 23 NA NA 4 FALSE
## 3.15 4 table cell table_template 24 NA NA 5 FALSE
## 3.18 4 table cell table_template 25 NA NA 6 FALSE
## 3.21 4 table cell table_template 26 NA NA 7 FALSE
## 3.24 4 table cell table_template 27 NA NA 8 FALSE
## 3.27 4 table cell table_template 28 NA NA 9 FALSE
## 3.30 4 table cell table_template 29 NA NA 10 FALSE
## 3.33 4 table cell table_template 30 NA NA 11 FALSE
## cell_id col_span row_span
## 1.1 1 1 1
## 1.4 1 1 1
## 1.7 1 1 1
## 1.10 1 1 1
## 1.13 1 1 1
## 1.16 1 1 1
## 1.19 1 1 1
## 1.22 1 1 1
## 1.25 1 1 1
## 1.28 1 1 1
## 1.31 1 1 1
## 2.2 2 1 1
## 2.5 2 1 1
## 2.8 2 1 1
## 2.11 2 1 1
## 2.14 2 1 1
## 2.17 2 1 1
## 2.20 2 1 1
## 2.23 2 1 1
## 2.26 2 1 1
## 2.29 2 1 1
## 2.32 2 1 1
## 3.3 3 1 1
## 3.6 3 1 1
## 3.9 3 1 1
## 3.12 3 1 1
## 3.15 3 1 1
## 3.18 3 1 1
## 3.21 3 1 1
## 3.24 3 1 1
## 3.27 3 1 1
## 3.30 3 1 1
## 3.33 3 1 1
table_cells <- content %>% filter(content_type == "table cell")
table_data <- table_cells %>% filter(!is_header) %>% select(row_id, cell_id, text)
# split data into individual columns
splits <- split(table_data, table_data$cell_id)
splits <- lapply(splits, function(x) x$text)
# combine columns back together in wide format
table_result <- bind_cols(splits)
# get table headers
cols <- table_cells %>% filter(is_header)
names(table_result) <- cols$text
LS0tDQp0aXRsZTogIm9mZmljZSByIg0KYXV0aG9yOiAiSGVucnkgRG8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogZmFsc2UNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICB3b3JkX2RvY3VtZW50czoNCiAgICB0b2M6IHRydWUNCmFsd2F5c19hbGxvd19odG1sOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkob2ZmaWNlcikNCmxpYnJhcnkoZHBseXIpDQoNCiMgY3JlYXRlIGVtcHR5IFdvcmQgZmlsZQ0Kc2FtcGxlX2RvYyA8LSByZWFkX2RvY3goKQ0KDQoNCg0KDQpzYW1wbGVfZG9jIDwtIHNhbXBsZV9kb2MgJT4lIGJvZHlfYWRkX3BhcigiVGhpcyBpcyB0aGUgZmlyc3QgcGFyYWdyYXBoIGhhbGxvIikgDQpzYW1wbGVfZG9jIDwtIHNhbXBsZV9kb2MgJT4lIGJvZHlfYWRkX3BhcigiVGhpcyBpcyB0aGUgc2Vjb25kIHBhcmFncmFwaCIpDQpzYW1wbGVfZG9jIDwtIHNhbXBsZV9kb2MgJT4lIGJvZHlfYWRkX3BhcigiVGhpcyBpcyB0aGUgdGhpcmQgcGFyYWdyYXBoIikNCg0KDQojIGNyZWF0ZSBzYW1wbGUgZGF0YSBmcmFtZQ0KZGYgPC0gZGF0YS5mcmFtZShhID0gMToxMCwgYiA9IDExOjIwLCBjPSAyMTozMCkNCg0KIyBhZGQgdGFibGUgY29udGFpbmluZyB0aGUgZGF0YSBmcmFtZSdzIGNvbnRlbnRzDQpzYW1wbGVfZG9jIDwtIHNhbXBsZV9kb2MgJT4lIGJvZHlfYWRkX3RhYmxlKGRmLCBzdHlsZSA9ICJ0YWJsZV90ZW1wbGF0ZSIpDQoNCnNldC5zZWVkKDApDQoNCiMgY3JlYXRlIGEgdGVtcCBmaWxlDQpzcmMgPC0gdGVtcGZpbGUoZmlsZWV4dCA9ICIucG5nIikNCg0KIyBjcmVhdGUgUE5HIG9iamVjdA0KcG5nKGZpbGVuYW1lID0gc3JjLCB3aWR0aCA9IDQsIGhlaWdodCA9IDQsIHVuaXRzID0gJ2luJywgcmVzID0gNDAwKQ0KDQojIGNyZWF0ZSBwbG90DQpwbG90KHNhbXBsZSgxMDAsIDEwKSkNCg0KIyBzYXZlIFBORyBmaWxlDQpkZXYub2ZmKCkNCg0KIyBhZGQgUE5HIGltYWdlIHRvIFdvcmQgZG9jdW1lbnQNCnNhbXBsZV9kb2MgPC0gc2FtcGxlX2RvYyAlPiUgYm9keV9hZGRfaW1nKHNyYyA9IHNyYywgd2lkdGggPSA0LCBoZWlnaHQgPSA0LCBzdHlsZSA9ICJjZW50ZXJlZCIpDQoNCnByaW50KHNhbXBsZV9kb2MsIHRhcmdldCA9ICJzYW1wbGVfZmlsZS5kb2N4IikNCg0KDQoNCg0KDQpzYW1wbGVfZGF0YSA8LSByZWFkX2RvY3goInNhbXBsZV9maWxlLmRvY3giKQ0KDQpjb250ZW50IDwtIGRvY3hfc3VtbWFyeShzYW1wbGVfZGF0YSkNCg0KcGFyYWdyYXBocyA8LSBjb250ZW50ICU+JSBmaWx0ZXIoY29udGVudF90eXBlID09ICJwYXJhZ3JhcGgiKQ0KcGFyYWdyYXBocyR0ZXh0DQoNCg0KDQoNCg0KY29udGVudCAlPiUgZmlsdGVyKGNvbnRlbnRfdHlwZSA9PSAidGFibGUgY2VsbCIpDQoNCg0KDQoNCnRhYmxlX2NlbGxzIDwtIGNvbnRlbnQgJT4lIGZpbHRlcihjb250ZW50X3R5cGUgPT0gInRhYmxlIGNlbGwiKQ0KdGFibGVfZGF0YSA8LSB0YWJsZV9jZWxscyAlPiUgZmlsdGVyKCFpc19oZWFkZXIpICU+JSBzZWxlY3Qocm93X2lkLCBjZWxsX2lkLCB0ZXh0KQ0KDQojIHNwbGl0IGRhdGEgaW50byBpbmRpdmlkdWFsIGNvbHVtbnMNCnNwbGl0cyA8LSBzcGxpdCh0YWJsZV9kYXRhLCB0YWJsZV9kYXRhJGNlbGxfaWQpDQpzcGxpdHMgPC0gbGFwcGx5KHNwbGl0cywgZnVuY3Rpb24oeCkgeCR0ZXh0KQ0KDQojIGNvbWJpbmUgY29sdW1ucyBiYWNrIHRvZ2V0aGVyIGluIHdpZGUgZm9ybWF0DQp0YWJsZV9yZXN1bHQgPC0gYmluZF9jb2xzKHNwbGl0cykNCg0KIyBnZXQgdGFibGUgaGVhZGVycw0KY29scyA8LSB0YWJsZV9jZWxscyAlPiUgZmlsdGVyKGlzX2hlYWRlcikNCm5hbWVzKHRhYmxlX3Jlc3VsdCkgPC0gY29scyR0ZXh0DQpgYGANCg0K