Frage

Ich möchte Informationen extrahieren von Kugeln in Word-Dokument vor. Ich möchte etwas wie folgt aus: Angenommen, der Text ist in Word-Dokument:

Schritte zum Starten Auto:

  • Öffnen Tür
  • Sit innerhalb
  • Schließen Sie die Tür
  • Einfügen-Taste
  • etc.

Dann möchte ich meine Textdatei wie folgt:

Schritte zum Starten Auto:

Offene Tür

Sit innerhalb

Schließen der Tür

Einfügen-Taste

etc.

Ich bin mit C #, dies zu tun.

kann ich Absätze aus Word-Dokument extrahieren und sie direkt mit einigen Formatierungsinformationen in Textdatei schreiben wie, ob Text fett oder kursiv, usw., aber nicht wissen, wie man diese Kugel Informationen zu extrahieren.

Kann jemand bitte sagen Sie mir, wie dies zu tun?

Vielen Dank im Voraus

War es hilfreich?

Lösung 3

Ich habe die Antwort .....

Zuerst war ich Umwandlung doc auf Absatz Basis. Aber anstatt, dass, wenn wir doc-Datei Satz für Satz Basis verarbeiten, ist es möglich, zu bestimmen, ob dieser Satz enthält Kugel oder irgendeine Art von Form oder, wenn dieser Satz Teil der Tabelle ist. Also, wenn wir diese Informationen zu erhalten, dann können wir diesen Satz entsprechend konvertieren. Wenn jemand Quellcode benötigt, kann ich es teilen.

Andere Tipps

Sie können es tun, indem jeder Satz zu lesen. doc.Sentences ist ein Array von Range-Objekt. So können Sie gleiches Range-Objekt aus § zu bekommen.

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

In paranumber Sie können Absatzebene erhalten und in buttetStr können Sie Kugel als String erhalten.

Ich bin mit dieses OpenXMLPower Tool von Eric White. Seine frei und verfügbar bei NuGet Paket. Sie können es von Visual Studio Paket-Manager installieren. eingeben Bild Beschreibung hier

Er hat bereitgestellt ein fertiges Code-Schnipsel verwenden. Dieses Tool hat mir viele Stunden gespeichert. Unten ist die Art, wie ich Code-Schnipsel angepasst hat für meine Anforderung zu verwenden. Infact Sie diese Methoden, wie sie in Ihrem Projekt verwenden können.

 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)
    {
        .....
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top