OpenXML remplacer le texte de tous les documents
J'ai le morceau de code ci-dessous. Je voudrais remplacer le texte "Texte1" par "NewText", c'est le travail. Mais quand je place le texte "Texte1" dans une table qui n'est pas de travailler plus pour le "Texte1" à l'intérieur de la table.
J'aimerais faire ce remplacement dans le document.
using (WordprocessingDocument doc = WordprocessingDocument.Open(String.Format("c:\\temp\\filename.docx"), true))
{
var body = doc.MainDocumentPart.Document.Body;
foreach (var para in body.Elements<Paragraph>())
{
foreach (var run in para.Elements<Run>())
{
foreach (var text in run.Elements<Text>())
{
if (text.Text.Contains("##Text1##"))
text.Text = text.Text.Replace("##Text1##", "NewText");
}
}
}
}
OriginalL'auteur Kris-I | 2013-09-30
Vous devez vous connecter pour publier un commentaire.
Votre code ne fonctionne pas parce que l'élément de la table (
w:tbl
) n'est pas contenue dansun élément paragraphe (
w:p
). Voir la suite MSDN article pour plus d'informations.La
Text
classe (sérialisé quew:t
) représente généralement littérale du texte dans unRun
élément dans undocument word. Donc, vous pouvez simplement rechercher tous les
w:t
éléments (Text
classe) et de remplacer votresi la balise de l'élément de texte (
w:t
) contient votre numéro de série:Je vous remercie pour votre commentaire. Je vais regarder le code fourni dans votre lien.
Heureux de vous aider. Je suis principalement a conclu que je déteste OpenXml. J'ai trouvé un code qui fonctionne presque à blogs.msdn.com/b/ericwhite/archive/2008/07/09/..., blogs.msdn.com/b/ericwhite/archive/2008/03/14/... et blogs.msdn.com/b/ericwhite/archive/2009/02/16/.... Il est toujours fiable, parce qu'il ne peut pas savoir quand mettre dans des espaces si je reçois des fragments. Je vais poster la réponse si je l'obtiens le droit de travailler.
OriginalL'auteur Hans
D'emprunt sur certains autres réponses dans différents endroits, et avec le fait que les quatre principaux obstacles doivent être surmontés:
Je suis sûr que les scénarios avancés tels que des signets, complexe imbrication besoin de plus d'une modification sur ce point, mais il est de travail pour les types de base des documents word, j'ai couru dans la mesure, et il est beaucoup plus utile pour moi que mépris des pistes tout à fait ou à l'aide d'une expression régulière sur l'ensemble du fichier sans la capacité de cible spécifique TableCell ou partie de Document (pour les scénarios avancés).
Exemple D'Utilisation:
Le code:
document.MainDocumentPart.Document.Body
est le type de Corps, maispublic static void ReplaceText(Paragraph paragraph, string find, string replaceWith)
nécessite un Paragraphe. Ainsi, le compilateur s'arrête et ne veut pas continuerajouter cette
var body = doc.MainDocumentPart.Document.Body; var paragraphs = body.Elements<Paragraph>(); foreach(var p in paragraphs) { ReplaceText(p, replace, with); }
Cependant, cette solution fonctionne parfaitement, merci @AmosMerci pour le paragraphe approche, m'a beaucoup aidé.
OriginalL'auteur Amos Zoellner
Peut-être que cette solution est plus facile
Avertissement: le Présent document remplace les balises xml. Une recherche "<" avec un remplacement de chaînes de caractères.Vide" se termine avec un document corrompu
OriginalL'auteur Emanuele Greco