如何用R读取带字体颜色等格式的Word文档并生成DataFrame?
提取DOCX带格式文本到R DataFrame方案
可以通过docxtractr结合xml2包直接解析DOCX的底层XML结构,精准提取文本及对应字体颜色、加粗、下划线等格式信息,满足你的需求。以下是具体操作步骤:
1. 安装依赖包
install.packages(c("docxtractr", "xml2", "dplyr", "stringr"))
2. 读取DOCX并加载XML结构
library(docxtractr) library(xml2) library(dplyr) library(stringr) # 替换为你的目标DOCX文件路径 doc <- read_docx("your_document.docx") # 获取文档正文的XML节点 body_xml <- doc$doc_obj$body
3. 提取文本与对应格式信息
DOCX中同一格式的文本会被打包为一个<w:r>(格式块),我们遍历这些块提取内容和格式属性:
# 定位所有格式块节点 r_nodes <- xml_find_all(body_xml, ".//w:r") # 遍历节点提取数据 text_format_df <- lapply(r_nodes, function(node) { # 提取文本内容 text <- xml_find_first(node, ".//w:t") %>% xml_text() if (is.na(text)) text <- "" # 获取格式属性节点 rpr <- xml_find_first(node, ".//w:rPr") # 判断是否加粗 bold <- !is.na(xml_find_first(rpr, ".//w:b")) # 获取下划线类型(无下划线则标记为"none") underline <- if (!is.na(xml_find_first(rpr, ".//w:u"))) { xml_attr(xml_find_first(rpr, ".//w:u"), "val") %||% "single" } else { "none" } # 获取字体颜色十六进制码(默认自动颜色标记为"auto") font_color <- if (!is.na(xml_find_first(rpr, ".//w:color"))) { xml_attr(xml_find_first(rpr, ".//w:color"), "val") } else { "auto" } tibble(text = text, bold = bold, underline = underline, font_color = font_color) }) %>% bind_rows() # 过滤空文本行 text_format_df <- text_format_df %>% filter(str_trim(text) != "")
4. 可选:拆分到单个字符粒度
如果需要每个字符对应一行格式信息(标注字符位置的格式),可进一步处理:
char_format_df <- text_format_df %>% mutate(char = str_split(text, "")) %>% unnest(char) %>% select(char, bold, underline, font_color)
结果说明
text_format_df:每行是一段格式统一的文本,包含文本内容、加粗状态、下划线类型、字体颜色码。char_format_df:将文本拆分为单个字符,每行对应一个字符的格式信息,满足按格式标注字符位置的需求。
注:officer包侧重DOCX文件生成,读取格式的能力有限;直接解析XML的方式能获取DOCX底层所有格式属性,更适配你的需求。
内容的提问来源于stack exchange,提问作者Mriti Agarwal
相关产品推荐
相关产品推荐

