Comment extraire des informations de balle de document Word?
-
21-09-2019 - |
Question
Je veux extraire des informations de balles présentes dans le document de mot. Je veux quelque chose comme ceci: Supposons que le texte ci-dessous, figure dans le document de mot:
Les étapes pour démarrer la voiture:
- Ouvrir la porte
- Installez-vous à l'intérieur
- Fermer la porte
- Insérer la clé
- etc.
Je veux que mon fichier texte comme ci-dessous:
Les étapes pour démarrer la voiture:
J'utilise le langage C # pour le faire.
Je peux extraire les paragraphes de document Word et directement les écrire dans un fichier texte avec des informations de mise en forme comme si le texte est en gras ou en italique, etc., mais ne sais pas comment extraire ces informations de balle.
Quelqu'un peut-il s'il vous plaît me dire comment faire?
Merci d'avance
La solution 3
Je suis la réponse .....
D'abord, je convertissait doc sur la base du paragraphe. Mais au lieu de cela, si nous traitons phrase de fichier doc par base de la phrase, il est possible de déterminer si cette phrase contient des balles ou tout type de forme ou si cette phrase fait partie du tableau. Donc, une fois que nous obtenons cette information, nous pouvons convertir cette phrase appropriée. Si quelqu'un a besoin de code source, je peux partager.
Autres conseils
Vous pouvez le faire en lisant chaque phrase. doc.Sentences est un tableau d'objet Range. Ainsi, vous pouvez obtenir un même objet Range de paragraphe.
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);
}
Dans paraNumber vous pouvez obtenir le niveau de paragraphe et dans buttetStr vous pouvez obtenir balle sous forme de chaîne.
J'utilise ce outil OpenXMLPower par Eric White. Est gratuit et disponible au package NuGet. vous pouvez l'installer à partir de gestionnaire de package Visual Studio.
Il a fourni un prêt à l'emploi extrait de code. Cet outil m'a sauvé de nombreuses heures. Ci-dessous la façon dont je l'ai personnalisé extrait de code à utiliser pour mon exigence. Enfait vous pouvez utiliser ces méthodes comme dans votre projet.
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)
{
.....
}
}