如何编程模拟「仅保留文本」粘贴?C#处理docx显示文本需求
解决Docx「所见即所得」文本提取问题及剪贴板纯文本生成逻辑
一、获取Docx中所见即所得的文本(C#实现思路)
你遇到的问题本质是Docx的底层文本和字符格式分离存储:底层xml里的文本是原始输入内容,但显示时会应用Run级别的格式(比如大小写转换)。要得到和显示一致的文本,必须在提取时应用这些字符格式规则。
核心处理逻辑
用OpenXML SDK遍历Docx内容时,针对每个文本Run,检查其RunProperties中的格式属性,对原始文本做对应转换:
w:allCaps="true":将文本转为全大写w:smallCaps="true":将文本转为小型大写(纯文本场景直接转大写即可)w:capitalize="true":将每个单词的首字母转为大写
示例代码片段
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System.Text; public string GetVisibleTextFromDocx(string filePath) { var visibleText = new StringBuilder(); using (var doc = WordprocessingDocument.Open(filePath, false)) { var body = doc.MainDocumentPart.Document.Body; foreach (var para in body.Elements<Paragraph>()) { foreach (var run in para.Elements<Run>()) { var runProps = run.RunProperties; var text = run.InnerText; if (runProps != null) { // 处理全大写格式 if (runProps.AllCaps != null && runProps.AllCaps.Value) { text = text.ToUpperInvariant(); } // 处理首字母大写格式 else if (runProps.Capitalize != null && runProps.Capitalize.Value) { text = string.Join(" ", text.Split(' ') .Select(word => !string.IsNullOrEmpty(word) ? char.ToUpper(word[0]) + word.Substring(1) : word)); } // 处理小型大写格式 else if (runProps.SmallCaps != null && runProps.SmallCaps.Value) { text = text.ToUpperInvariant(); } } visibleText.Append(text); } visibleText.AppendLine(); } } return visibleText.ToString(); }
注:此示例仅处理大小写相关格式,若有其他影响文本显示的格式需求,可自行扩展处理逻辑。
二、剪贴板纯文本的生成逻辑
当你在Word中复制文本时,Word会向剪贴板写入多种格式的数据,其中纯文本格式的内容是Word实时应用所有字符格式后的结果,而非直接读取底层xml的原始文本:
- Word遍历选中的文本段落和Run,逐个处理每个Run的格式规则;
- 对每个Run的原始文本应用格式转换(比如全大写、首字母大写等);
- 将转换后的所有文本片段拼接,生成最终纯文本内容写入剪贴板;
Ctrl+Shift+V粘贴时,系统读取的就是这个已完成格式转换的纯文本,所以和Word显示内容一致。
内容的提问来源于stack exchange,提问作者Kazimieras Jasaitis
相关产品推荐
相关产品推荐

