Как извлечь маркированную информацию из документа Word?

StackOverflow https://stackoverflow.com/questions/2302077

  •  21-09-2019
  •  | 
  •  

Вопрос

Я хочу извлечь информацию о маркерах, присутствующих в документе word.Я хочу что-то вроде этого :Предположим, приведенный ниже текст находится в документе word :

Шаги по запуску автомобиля :

  • Открытая дверь
  • Сядь внутри
  • Закрой дверь
  • Вставить ключ
  • и т.д.

Затем я хочу, чтобы мой текстовый файл выглядел следующим образом :

Шаги по запуску автомобиля :

<BULET> Открытая дверь </BULET>

<BULET> Сядь внутри </BULET>

<BULET> Закрой дверь </BULET>

<BULET> Вставить ключ </BULET>

<BULET> и т.д.</BULET>

Для этого я использую язык C #.

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

Кто-нибудь, пожалуйста, может сказать мне, как это сделать?

Заранее спасибо

Это было полезно?

Решение 3

Я получил ответ.....

Сначала я конвертировал документ на основе абзацев.Но вместо этого, если мы обработаем предложение файла doc по предложениям, можно определить, содержит ли это предложение маркер или какую-либо форму, или это предложение является частью таблицы.Итак, как только мы получим эту информацию, мы сможем соответствующим образом преобразовать это предложение.Если кому-то нужен исходный код, я могу поделиться им.

Другие советы

Вы можете сделать это, прочитав каждое предложение. док.Предложения представляет собой массив объектов Range.Таким образом, вы можете получить тот же объект диапазона из абзаца.

        foreach (Paragraph para in oDoc.Paragraphs)
        {
            string paraNumber = para.Range.ListFormat.ListLevelNumber.ToString();
            string bulletStr = para.Range.ListFormat.ListString;
            MessageBox.Show(paraNumber + "\t" + bulletStr + "\t" + para.Range.Text);
        }

В paraNumber вы можете получить уровень абзаца, а в buttetStr вы можете получить маркер в виде строки.

Я использую это Инструмент OpenXMLPower от Эрика Уайта.Это бесплатно и доступно в пакете NuGet.вы можете установить его из диспетчера пакетов Visual Studio.enter image description here

Он предоставил готовый к использованию фрагмент кода.Этот инструмент сэкономил мне много часов.Ниже приведен способ, которым я настроил фрагмент кода для использования в соответствии с моими требованиями.Фактически вы можете использовать эти методы как it в своем проекте.

 private static WordprocessingDocument _wordDocument;
 private StringBuilder textItemSB = new StringBuilder();
 private List<string> textItemList = new List<string>();


/// Open word document using office SDK and reads all contents from body of document
/// </summary>
/// <param name="filepath">path of file to be processed</param>
/// <returns>List of paragraphs with their text contents</returns>
private void GetDocumentBodyContents()
{
    string modifiedString = string.Empty;
    List<string> allList = new List<string>();
    List<string> allListText = new List<string>();

    try
    {
_wordDocument = WordprocessingDocument.Open(wordFileStream, false);
        //RevisionAccepter.AcceptRevisions(_wordDocument);
        XElement root = _wordDocument.MainDocumentPart.GetXDocument().Root;
        XElement body = root.LogicalChildrenContent().First();
        OutputBlockLevelContent(_wordDocument, body);
    }
    catch (Exception ex)
    {
        logger.Error("ERROR in GetDocumentBodyContents:" + ex.Message.ToString());
    }
}


// This is recursive method. At each iteration it tries to fetch listitem and Text item. Once you have these items in hand 
// You can manipulate and create your own collection.
private void OutputBlockLevelContent(WordprocessingDocument wordDoc, XElement blockLevelContentContainer)
{
    try
    {
        string listItem = string.Empty, itemText = string.Empty, numberText = string.Empty;
        foreach (XElement blockLevelContentElement in
            blockLevelContentContainer.LogicalChildrenContent())
        {
            if (blockLevelContentElement.Name == W.p)
            {
                listItem = ListItemRetriever.RetrieveListItem(wordDoc, blockLevelContentElement);
                itemText = blockLevelContentElement
                    .LogicalChildrenContent(W.r)
                    .LogicalChildrenContent(W.t)
                    .Select(t => (string)t)
                    .StringConcatenate();
                if (itemText.Trim().Length > 0)
                {
                    if (null == listItem)
                    {
                        // Add html break tag 
                        textItemSB.Append( itemText + "<br/>");
                    }
                    else
                    {
                        //if listItem == "" bullet character, replace it with equivalent html encoded character                                   
                        textItemSB.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + (listItem == "" ? "&bull;" : listItem) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + itemText + "<br/>");
                    }
                }
                else if (null != listItem)
                {
                    //If bullet character is found, replace it with equivalent html encoded character  
                    textItemSB.Append(listItem == "" ? "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&bull;" : listItem);
                }
                else
                    textItemSB.Append("<blank>");
                continue;
            }
            // If element is not a paragraph, it must be a table.

            foreach (var row in blockLevelContentElement.LogicalChildrenContent())
            {                        
                foreach (var cell in row.LogicalChildrenContent())
                {                            
                    // Cells are a block-level content container, so can call this method recursively.
                    OutputBlockLevelContent(wordDoc, cell);
                }
            }
        }
        if (textItemSB.Length > 0)
        {
            textItemList.Add(textItemSB.ToString());
            textItemSB.Clear();
        }
    }
    catch (Exception ex)
    {
        .....
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top