Pergunta

Quero extrair informações de balas presentes no documento do Word. Eu quero algo assim: suponha que o texto abaixo esteja no documento do Word:

Passos para iniciar o carro:

  • Porta aberta
  • Sente -se dentro
  • Feche a porta
  • Insira a chave
  • etc.

Então eu quero meu arquivo de texto como abaixo:

Passos para iniciar o carro:

u003CBULET>Porta abertau003C/BULET>

u003CBULET>Sente -se dentrou003C/BULET>

u003CBULET>Feche a portau003C/BULET>

u003CBULET>Insira a chaveu003C/BULET>

u003CBULET>etc.u003C/BULET>

Estou usando o idioma C# para fazer isso.

Posso extrair parágrafos do documento do Word e escrevê -los diretamente no arquivo de texto com algumas informações de formatação, como se o texto é ousado ou em itálico, etc. Mas não sei como extrair essas informações de bala.

Alguém pode me dizer como fazer isso?

desde já, obrigado

Foi útil?

Solução 3

Eu recebi a resposta .....

Primeiro eu estava convertendo o DOC com base no parágrafo. Mas, em vez disso, se processarmos a frase do arquivo do documento por base de frase, é possível determinar se essa frase contém bala ou qualquer tipo de forma ou se essa frase faz parte da tabela. Portanto, uma vez que obtemos essas informações, podemos converter essa frase adequadamente. Se alguém precisar de código -fonte, eu posso compartilhá -lo.

Outras dicas

Você pode fazer isso lendo cada frase. Doc.Sentências é uma variedade de objeto de faixa. Portanto, você pode obter o mesmo objeto de intervalo do parágrafo.

        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);
        }

Em paranume, você pode obter o nível de parágrafo e entrar no ButtetTtr, você pode obter uma bala como corda.

estou usando isto Ferramenta OpenxmlPower de Eric White. Está gratuito e disponível no Nuget Package. Você pode instalá -lo no Visual Studio Package Manager.enter image description here

Ele forneceu um trecho de código pronto para usar. Essa ferramenta me salvou muitas horas. Abaixo está a maneira como tenho o Snippet de código personalizado para usar para minha exigência. De fato, você pode usar esses métodos como em seu projeto.

 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)
    {
        .....
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top