Wie Kugel Informationen aus Word-Dokument zu extrahieren?
-
21-09-2019 - |
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:
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
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.
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(" " + (listItem == "" ? "•" : listItem) + " " + itemText + "<br/>");
}
}
else if (null != listItem)
{
//If bullet character is found, replace it with equivalent html encoded character
textItemSB.Append(listItem == "" ? " •" : 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)
{
.....
}
}