从Word表单中提取数据

时间:2015-04-20 20:09:09

标签: c# ms-office text-extraction

使用C#,我需要从word文档中提取数据。我在项目中安装了NetOffice for word。数据分为两部分。

首先,我需要从文档设置中提取数据。

其次,我需要提取文档中控件的内容。字段的内容包括复选框,日期和几个段落。输入法是通过控件进行的,因此必须有一些方法通过api与控件进行交互,但我不知道如何做到这一点。

现在,我已经获得了以下代码来从文档中提取平面文字:

private static string wordDocument2String(string file)
    {
        NetOffice.WordApi.Application wordApplication = new NetOffice.WordApi.Application();
        NetOffice.WordApi.Document newDocument = wordApplication.Documents.Open(file);
        string txt = newDocument.Content.Text;
        wordApplication.Quit();
        wordApplication.Dispose();
        return txt;
    }

所以问题是:我如何从文档中提取控件中的数据,以及如何使用NetOffice或者从NetOffice中提取文档设置(例如从word中看到的标题,作者等),或者其他一些包裹?

1 个答案:

答案 0 :(得分:2)

我没有打算实施NetOffice,但命令应该大致相同(可能除了实现和处理方法之外)。

        Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
        string file = "C:\\Hello World.docx";
        Microsoft.Office.Interop.Word.Document doc = word.Documents.Open(file);

        // look for a specific type of Field (there are about 200 to choose from).
        foreach (Field f in doc.Fields)
        {
            if (f.Type == WdFieldType.wdFieldDate)
            {
                //do something
            }
        }

        // example of the myriad properties that could be associated with "document settings"
        WdProtectionType protType = doc.ProtectionType;
        if (protType.Equals(WdProtectionType.wdAllowOnlyComments))
        {
            //do something else
        }

您可以在MSDN reference on Word Interop找到有关您需要在Word文档中访问的任何内容的信息。

更新: 阅读完评论后,您可以访问以下几种文档设置:

        string author = doc.BuiltInDocumentProperties("Author").Value;
        string name = doc.Name; // this gives you the file name.
                 //  not clear what you mean by "title"

至于试图理解你从“遗留控件”获得的文本,我需要更多信息来确切地知道你正在从中提取什么样的控件。尝试从文档中获取控件/文本框/表单/ etc的名称,然后在Google上查找该属性。

作为黑暗中的一个刺,这是一个从文档中的文本框中获取文本的(不完整)示例:

        List<string> textBoxText = new List<string>();
        foreach (Microsoft.Office.Interop.Word.Shape s in doc.Shapes)
        {
            textBoxText.Add(s.TextFrame.TextRange.Text); //this could result in an error if there are shapes that don't contain text.
        }

另一种可能性是内容控制,其中有几种类型。它们通常用于收集用户输入。

以下是一些用于捕获富文本内容控件的代码:

        List<string> contentControlText = new List<string>();
        foreach(ContentControl CC in doc.ContentControls)
        {
            if (CC.Type == WdContentControlType.wdContentControlRichText)
            {
                contentControlText.Add(CC.Range.Text);
            }
        }