首页
/ Open-Xml-Sdk 项目实战:处理Word文档中的修订内容

Open-Xml-Sdk 项目实战:处理Word文档中的修订内容

2025-06-16 17:49:17作者:管翌锬

在处理Word文档时,我们经常需要处理文档修订记录。本文将详细介绍如何使用Open-Xml-Sdk库来接受Word文档中的所有修订内容,包括插入、删除和移动等操作。

修订内容类型解析

Word文档中的修订内容主要分为以下几种类型:

  1. 插入内容(InsertedRun):标记为新增的文本内容
  2. 删除内容(DeletedRun):标记为删除的文本内容
  3. 移动内容(MoveFrom/MoveTo):标记为从某处移动到另一处的文本内容
  4. 格式变更(ParagraphPropertiesChange/TablePropertiesChange):段落或表格属性的修改

接受修订的核心方法

处理插入内容

对于插入的内容,我们需要保留文本但移除插入标记:

var insertedRuns = body.Descendants<InsertedRun>().ToList();
foreach (var insertedRun in insertedRuns)
{
    var parent = insertedRun.Parent;
    foreach (var child in insertedRun.ChildElements.ToList())
    {
        parent.InsertBefore(child.CloneNode(true), insertedRun);
    }
    insertedRun.Remove();
}

处理删除内容

删除标记的内容直接移除即可:

var deletedRuns = body.Descendants<DeletedRun>().ToList();
foreach (var deletedRun in deletedRuns)
{
    deletedRun.Remove();
}

处理移动内容

移动内容的处理较为复杂,需要同时处理MoveFrom和MoveTo元素:

// 处理MoveFrom元素
var moveFromElements = body.Descendants<MoveFrom>().ToList();
foreach (var moveFrom in moveFromElements)
{
    moveFrom.Remove();
}

// 处理MoveTo元素
var moveToElements = body.Descendants<MoveTo>().ToList();
foreach (var moveTo in moveToElements)
{
    var parent = moveTo.Parent;
    foreach (var run in moveTo.Elements<Run>())
    {
        foreach (var child in run.ChildElements)
        {
            parent.InsertBefore(child.CloneNode(true), moveTo);
        }
    }
    moveTo.Remove();
}

处理格式变更

对于段落和表格的格式变更,直接移除变更标记:

// 段落属性变更
var pPrChanges = body.Descendants<ParagraphPropertiesChange>().ToList();
foreach (var pPrChange in pPrChanges)
{
    pPrChange.Remove();
}

// 表格属性变更
var tblPrChanges = body.Descendants<TablePropertiesChange>().ToList();
foreach (var tblPrChange in tblPrChanges)
{
    tblPrChange.Remove();
}

完整实现方案

结合上述方法,我们可以构建一个完整的接受所有修订的函数:

public void AcceptAllChanges(string filePath)
{
    using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
    {
        var body = doc.MainDocumentPart.Document.Body;
        
        // 处理各种修订类型
        ProcessInsertions(body);
        ProcessDeletions(body);
        ProcessMoves(body);
        ProcessPropertyChanges(body);
        
        // 保存修改
        doc.MainDocumentPart.Document.Save();
    }
}

注意事项

  1. 克隆节点:在处理移动内容时,必须使用CloneNode(true)进行深度克隆,确保所有子节点都被正确复制
  2. 元素顺序:插入新节点时要注意插入位置,确保文档结构不被破坏
  3. 性能考虑:对于大型文档,建议分批处理修订内容,避免内存问题
  4. 备份文档:在修改前建议创建文档备份,防止意外数据丢失

通过上述方法,我们可以有效地处理Word文档中的各种修订内容,实现类似Word中"接受所有修订"的功能。这种方法特别适用于需要批量处理多个文档修订的场景,能够显著提高工作效率。

登录后查看全文
热门项目推荐
相关项目推荐