如何在C#中通过Spire.Doc获取Word文档的红色行文本
嘿,这个需求我刚好折腾过,用Spire.Doc实现其实思路挺清晰的——核心就是遍历Word里的内容单元,判断每行文本的颜色,把红色的行捞出来就行。下面给你拆解具体步骤和代码:
1. 先准备依赖
首先得确保你已经通过NuGet安装了Spire.Doc包,在Package Manager Console里执行:
Install-Package Spire.Doc
2. 核心代码实现
这里分两种场景给你写代码:一种是只要行内包含红色文本就提取,另一种是整行所有文本都是红色才提取,你可以根据自己的需求选。
场景1:提取包含红色文本的行
using Spire.Doc; using Spire.Doc.Documents; using Spire.Doc.Fields; using System.Text; class WordRedTextExtractor { static void Main(string[] args) { // 加载目标Word文档 Document doc = new Document(); doc.LoadFromFile("你的文档路径.docx"); // 替换成你的.doc/.docx路径 StringBuilder redTextContent = new StringBuilder(); // 遍历文档的每个章节 foreach (Section section in doc.Sections) { // 把段落当作"行"处理(如果Word里用软换行,后面会说怎么处理) foreach (Paragraph para in section.Paragraphs) { bool hasRedText = false; // 遍历段落里的每个文本片段(一个段落可能混有多种颜色) foreach (DocumentObject obj in para.ChildObjects) { if (obj is TextRange textRange) { // 判断文本颜色是否为红色(用ToArgb避免颜色格式匹配问题) if (textRange.CharacterFormat.TextColor.ToArgb() == System.Drawing.Color.Red.ToArgb()) { hasRedText = true; break; // 找到红色就不用继续检查这个段落了 } } } // 如果包含红色文本,就把整段内容加进去 if (hasRedText && !string.IsNullOrWhiteSpace(para.Text)) { redTextContent.AppendLine(para.Text); } } } // 把提取的内容保存成txt,或者直接用字符串变量redTextContent.ToString() System.IO.File.WriteAllText("提取的红色文本.txt", redTextContent.ToString(), Encoding.UTF8); // 记得释放资源,避免内存泄漏 doc.Dispose(); } }
场景2:只提取整行全是红色的文本行
如果你的需求是严格只保留所有文本都是红色的行,把上面的判断逻辑改成这样就行:
bool isAllRed = true; foreach (DocumentObject obj in para.ChildObjects) { if (obj is TextRange textRange) { // 只要有一个文本片段不是红色,就标记为非红色行 if (textRange.CharacterFormat.TextColor.ToArgb() != System.Drawing.Color.Red.ToArgb()) { isAllRed = false; break; } } } if (isAllRed && !string.IsNullOrWhiteSpace(para.Text)) { redTextContent.AppendLine(para.Text); }
3. 特殊情况处理:Word里的软换行
如果你的Word文档里是用Shift+Enter(软换行)来分行的,这些换行属于同一个Paragraph,上面的代码会把整个段落当成一行。这时候需要拆分软换行的内容,你可以这样处理:
foreach (Paragraph para in section.Paragraphs) { // 按软换行符'\v'拆分段落内容 string[] splitLines = para.Text.Split(new[] { '\v' }, StringSplitOptions.RemoveEmptyEntries); // 这里需要更细致地对应每个子行的颜色,简单场景可以先拆分后结合颜色判断 // (如果要精确匹配每个软换行的行颜色,需要跟踪每个TextRange的位置和换行符,逻辑会复杂一点,有需要可以再调整) }
4. 注意事项
- Spire.Doc免费版有页数限制,如果你的文档超过10页,可能需要考虑授权版本;
- 有些Word里的红色可能是自定义RGB值,用
ToArgb()判断比直接比较Color对象更靠谱; - 处理完文档一定要调用
doc.Dispose()释放资源,不然容易占内存。
内容的提问来源于stack exchange,提问作者Javid Gasimzade
相关产品推荐
相关产品推荐

