Как подготовить документ Word 2007, чтобы C # мог извлекать данные из него семантически? - PullRequest
4 голосов
/ 07 августа 2010

У меня есть друг, который пишет 400-страничную книгу в Microsoft Word 2007.

На протяжении всей книги у него есть 200 историй , каждая из которых состоит из многочисленных абзацев.

Когда он закончит написание книги, он хочет скопировать текст каждого рассказа, встроенного в его документ Word, в таблицу базы данных , например:

Title, varchar(200)
Description, text
Content, text

Мы не хотим копировать и вставлять каждую статью в базу данных, но хотим, чтобы программа автоматически извлекала размеченные данные из файла Word в соответствующие поля в базе данных.

  1. Что он должен делать в Microsoft Word, чтобы обозначал каждую группу абзацев как «содержание рассказа», а каждый заголовок - как «заголовок рассказа» и т. Д. Предварительное условие - эта разметка не может быть видимым в документе. Я знаю, что файлы Word 2007 в основном представляют собой сжатые файлы XML, поэтому я предполагаю, что это возможно, и я предполагаю, что таблицы стилей - это то, что нам нужно, но как мне нужно подготовить документ Word точно так, чтобы по мере добавления историй они правильно размечены?

  2. Я предполагаю, что новые функции COM Interop в C # 4.0 - это то, что мне нужно для анализа файла Word и извлечения только заголовка, описания и контента из встроенных историй, но как это сделать? Я делаю это технически? У кого-нибудь есть примеры?

Есть ли у кого-нибудь опыт выполнения такого проекта (чтение Microsoft Word как файл семантических данных), которым они могли бы поделиться?

Ответы [ 4 ]

2 голосов
/ 14 августа 2010

Я бы использовал стили. Создайте по одному стилю для каждого типа контента и напишите макрос, который обходит ваш документ по абзацам и выплевывает соответствующий текстовый файл.

1 голос
/ 12 августа 2010

Хорошо, это может быть решено несколькими способами.

Прежде всего, я бы предложил сохранить файл в * .txt, чтобы иметь некоторый текст для анализа.

Тогда ваш друг должен будет быть действительно последовательным во время написания, потому что то, что вы создадите (текстовый анализатор), потребует согласованности.

Создайте несколько правил, таких как:

  1. Заголовокв первой строке, затем 2 переноса строки;
  2. Все абзацы разделены 1 разрывом строки;
  3. Затем 3 переноса строки после последнего абзаца;

После этого загрузитефайл, и проанализируйте его, используя правила выше.

{наслаждайся}

0 голосов
/ 07 августа 2010

Ниже приведен xml для документа docx, который содержит заголовок со словом «Заголовок» и два абзаца со словом «Содержимое».Изучите образец файла романа, пока ваш друг пишет его, используйте унифицированный формат для всех элементов заголовка и абзаца, и вы сможете довольно легко разобрать его. Содержимое находится в word / document.xml сжатого файла docx.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"><w:body><w:p w:rsidR="005C78DC" w:rsidRDefault="00350339" w:rsidP="00350339"><w:pPr><w:pStyle w:val="Heading1"/></w:pPr><w:r><w:t>Title</w:t></w:r></w:p><w:p w:rsidR="00350339" w:rsidRDefault="00350339" w:rsidP="00350339"><w:r><w:t>Content</w:t></w:r></w:p><w:p w:rsidR="00350339" w:rsidRPr="00350339" w:rsidRDefault="00350339" w:rsidP="00350339"><w:r><w:t>Content</w:t></w:r></w:p><w:sectPr w:rsidR="00350339" w:rsidRPr="00350339" w:rsidSect="005C78DC"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:linePitch="360"/></w:sectPr></w:body></w:document>
0 голосов
/ 07 августа 2010

Использовать закладки для запуска и остановки каждой истории

Я настоятельно рекомендую эту технику.

Отметьте начало и конец каждой «истории» с помощью функции закладки Word. Чтобы просмотреть «закладки», выберите «Параметры Word», «Дополнительно», «Показать содержимое документа» и установите флажок «Показать закладки».

Затем просто просмотрите документ, собирая содержимое между закладками.

Довольно простой метод, который я использовал со времен Word 6.x. Единственная проблема состоит в том, чтобы придумать 200 имен закладок. Тем не менее, это может быть преимуществом, поскольку имя закладки может быть перенесено в поле «имя» в базе данных.

Использование стилей для пометки содержимого истории

Другая техника заключается в определении определенного стиля или стилей, составляющих историю. Затем вы извлекаете стили. Это немного сложнее и может быть подвержено ошибкам, если автор не дисциплинирован.

Использование текстовых полей, содержащих контент истории

Наконец, если эти «истории» можно поместить в «текстовое поле», вы можете просто извлечь содержимое текстовых полей. Проблема с этим подходом заключается в ограничениях изменений текстового поля и макета документа, которые автор может не знать, к чему применить.

Примечания

Есть и другие способы, но подход с использованием закладок является самым простым в использовании и реализации. Я постараюсь ответить на любые ваши комментарии / вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...