如何使用C#和Open XML SDK按特定文本拆分Word文档

本文关键字:文本 拆分 文档 Word SDK 何使用 Open XML | 更新日期: 2024-09-27 05:52:28

我想通过使用C#和Open XML SDK编程的特定文本将Word文档一分为二。我在第一部分所做的是删除所有段落,直到包含所需文本的段落。这很有效。然后在原始文件的副本上,我做了同样的操作,只是这次删除了从包含所需文本的段落开始的所有段落。由于某种原因,第二部分被证明是一个无效的文档,无法使用word打开。使用"Open XML SDK 2.0 Productivity Tool"打开损坏的文档并对其进行验证,不会检测到文档有任何问题。

这是删除所需文本之前的部分的代码(工作正常):

public static void DeleteFirstPart(string docName)
    {
        using (WordprocessingDocument document = WordprocessingDocument.Open(docName, true))
        {
            DocumentFormat.OpenXml.Wordprocessing.Document doc = document.MainDocumentPart.Document;
            List<Text> textparts = document.MainDocumentPart.Document.Body.Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>().ToList();
            foreach (Text textfield in textparts)
            {
                if (!textfield.Text.Contains("split here"))
                {
                    RemoveItem1(textfield);
                }
                else
                {
                    break;
                }
            }
        }
    }

我尝试了两种不同的移除项目的方法,都得到了相同的结果:

private static void RemoveItem1(Text item)
    {
        // Need to go up at least two levels to get to the run.
        if ((item.Parent != null) &&
          (item.Parent.Parent != null) &&
          (item.Parent.Parent.Parent != null))
        {
            var topNode = item.Parent.Parent;
            var topParentNode = item.Parent.Parent.Parent;
            if (topParentNode != null)
            {
                topNode.Remove();
                // No more children? Remove the parent node, as well.
                if (!topParentNode.HasChildren)
                {
                    topParentNode.Remove();
                }
            }
        }
    }

private static void RemoveItem2(Text textfield)
    {
        if (textfield.Parent != null)
        {
            if (textfield.Parent.Parent != null)
            {
                if (textfield.Parent.Parent.Parent != null)
                {
                    textfield.Parent.Parent.Remove();
                }
                else
                {
                    textfield.Parent.Remove();
                }
            }
            else
            {
                textfield.Remove();
            }
        }   
    }

这是从所需文本开始删除零件的代码(破坏文档):

public static void DeleteSecondPart(string docName)
    {
        using (WordprocessingDocument document = WordprocessingDocument.Open(docName, true))
        {
            DocumentFormat.OpenXml.Wordprocessing.Document doc = document.MainDocumentPart.Document;
            List<Text> textparts = document.MainDocumentPart.Document.Body.Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>().ToList();
            bool remove = false;
            foreach (Text textfield in textparts)
            {
                if (textfield.Text.Contains("split here"))
                {
                    remove = true;
                }
                if(remove)
                {
                    RemoveItem1(textfield);
                    //Using this commented code line, instead of the one above, removes only the text field itself, it works fine, the document is valid, but it leaves empty paragraphs that could be pages long.
                    //textfield.Remove();
                }
            }
        }
    }

如何使用C#和Open XML SDK按特定文本拆分Word文档

RemoveItem方法的重写成功了:

 private static void RemoveItem3(Text textfield)
    {
        OpenXmlElement element = textfield;
        while (!(element.Parent is DocumentFormat.OpenXml.Wordprocessing.Body) && element.Parent != null)
        {
            element = element.Parent;
        }
        if (element.Parent != null)
        {
            element.Remove();
        }
    }