Извлечение данных из формы Word

Используя С#, мне нужно извлечь данные из документа 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, либо какой-либо другой пакет ?


person Chris    schedule 20.04.2015    source источник
comment
вот отправная точка, которая может быть полезна: (stackoverflow.com/questions/9518275/). Под настройками документа вы имеете в виду такие свойства, как поля, шрифт, межстрочный интервал и т. д.? Их довольно легко получить. Кстати, согласно документам NetOffice, методы API точно такие же, как методы Office Interop, что должно немного помочь вам в поиске в Google.   -  person Ric Gaudet    schedule 20.04.2015


Ответы (1)


Я не стал внедрять 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 по 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"

Что касается попытки понять, какой текст вы получаете от «устаревшего элемента управления», мне нужно больше информации о том, какой именно элемент управления вы извлекаете. Попробуйте получить имя элемента управления/текстового поля/формы/и т. д. из самого документа, а затем найдите это свойство в 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);
            }
        }
person Ric Gaudet    schedule 20.04.2015
comment
Спасибо, я просто переключусь на взаимодействие - person Chris; 23.04.2015
comment
Я думаю, что в определении полей есть совпадение... я имел в виду поля в непрофессиональном смысле. Поменял на управление. На самом деле это сложно расшифровать, поскольку поля, элементы управления и формы уже являются частью системы. Таким образом, в документах есть вопросы, побуждающие пользователя щелкнуть поле и ввести ответ. Мне нужно извлечь из документа с помощью кода ответ на вопрос. Ответ заключается в том, что кажется чем-то, что называется устаревшим контролем. Кроме того, мне нужно вытащить настройки из документа, на который ориентированы автор, заголовок и другие данные. - person Chris; 23.04.2015