Как извлечь информацию о маркере из текстового документа? - PullRequest
3 голосов
/ 20 февраля 2010

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

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

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

Тогда я хочу свой текстовый файл, как показано ниже:

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

Открытая дверь

Сидите внутри

Закрыть дверь

Вставить ключ

и т. Д.

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

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

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

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

Ответы [ 3 ]

1 голос
/ 22 января 2012

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

        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 вы можете получить пулю в виде строки.

1 голос
/ 18 июля 2017

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

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

 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)
    {
        .....
    }
}
0 голосов
/ 25 февраля 2010

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

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

...