You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:41:39