如何使用office interop API枚举word文档?

时间:2010-08-18 12:21:09

标签: c# interop ms-word

我想逐个遍历word文档的所有元素,并根据元素的类型(标题,句子,表格,图像,文本框,形状等)来处理该元素。我试图搜索任何枚举器或对象,它们可以代表office interop API中的文档元素,但却找不到任何枚举器或对象。 API提供句子,段落,形状集合但不提供可指向下一个元素的通用对象。 例如:

<header of document>
<plain text sentences>
<table with many rows,columns>
<text box>
<image>
<footer>

(请将其想象为word文档)


所以,现在我想要一些首先给我<header of document>的枚举器,然后在下一次迭代中给我<plain text sentences>,然后<table with many rows,columns>,依此类推。 有谁知道我们如何实现这一目标?有可能吗?

我正在使用C#,visual studio 2005和Word 2003。

非常感谢

2 个答案:

答案 0 :(得分:4)

您没有简单迭代器的原因是Word文档可能比您问题中概述的简单结构复杂得多。

例如,文档可能有多个页眉和页脚用于第一页以及偶数页和奇数页,包含多个具有不同页眉和页脚设置的部分,包含脚注,注释和修订以及对象(如表) ,文本框,图像和形状可以与文本或浮动内联。简而言之,没有固定的元素序列。

您必须检查输入文档的复杂程度,并根据分析结果决定如何迭代段落以及附加的图像和形状等。

答案 1 :(得分:3)

例如:

        // open the file
        Word.ApplicationClass app = new Word.ApplicationClass();
        object path = @"c:\Users\name\Desktop\Весь набор.docx";
        object missing = System.Reflection.Missing.Value;

        Word.Document doc = null;
        try
        {
            doc = app.Documents.Open(ref path,
                ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing);

            // index
            foreach ( Word.Section section in doc.Sections)
            {
                Debug.WriteLine("Section index:" + section.Index);
                Debug.WriteLine("section start: " + section.Range.Start + ", section end: " + section.Range.End);

            }


            bool processNextTable = false;
            foreach (Word.Paragraph paragraph in doc.Paragraphs)
            {
                string toWrite = paragraph.Range.Text;
                System.Diagnostics.Debug.WriteLine(toWrite);
            }

            foreach (Word.Table table in doc.Tables)
            {
                foreach (Word.Row wRow in table.Rows)
                    foreach (Word.Cell cell in wRow.Cells)
                    {
                    }
            }

        }
        finally
        {
            if (doc != null)
            {
                bool saveChanges = false; // temporary not save any changes
                app.Quit(ref saveChanges, ref missing, ref missing);
            }
        }