如何在官员的Word文档中获取样式格式?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在官员的Word文档中获取样式格式?相关的知识,希望对你有一定的参考价值。
我想用officer
编写一些文档,并且在我用read_docx()
加载的Word文档中有一些预定义的样式。现在,我可以看一下样式,但是我特别想知道每种样式具有的字体类型或字体大小,而我找不到。这就是我能找到的全部:
Document <- read_docx(FILEPATH)
head(Document$styles)
style_type style_id style_name is_custom is_default
1 paragraph Normal Normal FALSE TRUE
2 paragraph Heading1 heading 1 FALSE FALSE
3 paragraph Heading2 heading 2 FALSE FALSE
4 paragraph Heading3 heading 3 FALSE FALSE
5 paragraph Heading4 heading 4 FALSE FALSE
6 paragraph Heading5 heading 5 FALSE FALSE
很遗憾,没有字体大小或字体类型的列。我确实需要R
中标题1的字体大小(例如10)和字体类型(例如“ Times New Roman”),因为函数style
的参数body_add_par
不足以达到我的目的。有没有办法做到这一点?
编辑:如果解决方案不是来自officer
,那也很好。
答案
我找不到在官员中执行此操作的方法。实际上,最后,我不得不解析docx的xml内容以获得字体。
事实证明,并非所有样式都有字体集。有些继承自其他样式,有些仅采用Word提供的默认值。无论如何,解析xml很麻烦,因此有点麻烦/杂乱。
首先,您需要解压缩docx以获得其样式xml。如果您有officer
,那么您还将拥有所需的zip
软件包,因此我们将使用此软件包:
library(zip)
doc_path <- "my_file_path.docx"
unzip(doc_path, files = "word/styles.xml", exdir = path.expand("~/"))
现在我们需要解析xml:
read_xml(path.expand("~/word/styles.xml")) %>%
xml_nodes(xpath = "//w:style") %>%
lapply(xml_new_root) %>%
lapply(function(x) data.frame(
name = x %>% xml_node(xpath = "//w:name") %>% xml_attr("val"),
based_on = x %>% xml_node(xpath = "//w:basedOn") %>% xml_attr("val"),
font = x %>% xml_node(xpath = "//w:rFonts") %>% xml_attr("ascii"),
size = x %>% xml_node(xpath = "//w:sz") %>% xml_attr("val"),
stringsAsFactors = F)) %>%
{do.call("rbind", .)} -> font_table
这为我们提供了字体表,但是从继承等中可以推断出很多缺失值:
read_xml(path.expand("~/word/styles.xml")) %>%
xml_node(xpath = "//w:docDefaults//w:rPr") %>%
xml_new_root -> defaults
default_size <- xml_node(defaults, xpath = "//w:sz") %>% xml_attr("val")
default_font <- xml_node(defaults, xpath = "//w:rFonts") %>% xml_attr("ascii")
if(is.na(default_font))
default_font <- xml_node(defaults, xpath = "//w:rFonts") %>% xml_attr("asciiTheme")
font_table$size[is.na(font_table$size) & is.na(font_table$based_on)] <- default_size
font_table$font[is.na(font_table$font)] <- default_font
font_table$based_on[is.na(font_table$based_on)] <- "default"
现在我们有:
font_table
#> name based_on font size
#> 1 Normal default minorHAnsi 24
#> 2 heading 2 Normal minorHAnsi 26
#> 3 Default Paragraph Font default minorHAnsi 24
#> 4 Normal Table default minorHAnsi 24
#> 5 No List default minorHAnsi 24
#> 6 Table Grid TableNormal minorHAnsi <NA>
#> 7 List Paragraph Normal minorHAnsi <NA>
#> 8 Normal (Web) Normal Times New Roman <NA>
#> 9 Balloon Text Normal Tahoma 16
#> 10 Balloon Text Char DefaultParagraphFont Tahoma 16
#> 11 Heading 2 Char DefaultParagraphFont minorHAnsi 26
以上是关于如何在官员的Word文档中获取样式格式?的主要内容,如果未能解决你的问题,请参考以下文章