comment puis-je mettre un contenu dans un champ de fusion dans docx
Je suis de développement d'une application web avec asp.net et j'ai un fichier appelé Template.docx qui fonctionne comme un modèle pour générer d'autres rapports. À l'intérieur de ce Template.docx j'ai quelques MergeFields (Titre, Nomclient, Contenu, Pied de page, etc), afin de remplacer pour certains du contenu dynamique en C#.
Je voudrais savoir, comment puis-je mettre un contenu dans un champ de fusion dans docx ?
Je ne sais pas si MergeFields est la bonne façon de le faire ou si il ya une autre façon. Si vous pouvez me suggérer, je l'apprécie!
PS: j'ai openxml référencé dans mon application web.
Modifications:
private MemoryStream LoadFileIntoStream(string fileName)
{
MemoryStream memoryStream = new MemoryStream();
using (FileStream fileStream = File.OpenRead(fileName))
{
memoryStream.SetLength(fileStream.Length);
fileStream.Read(memoryStream.GetBuffer(), 0, (int) fileStream.Length);
memoryStream.Flush();
fileStream.Close();
}
return memoryStream;
}
public MemoryStream GenerateWord()
{
string templateDoc = "C:\\temp\\template.docx";
string reportFileName = "C:\\temp\\result.docx";
var reportStream = LoadFileIntoStream(templateDoc);
//Copy a new file name from template file
//File.Copy(templateDoc, reportFileName, true);
//Open the new Package
Package pkg = Package.Open(reportStream, FileMode.Open, FileAccess.ReadWrite);
//Specify the URI of the part to be read
Uri uri = new Uri("/word/document.xml", UriKind.Relative);
PackagePart part = pkg.GetPart(uri);
XmlDocument xmlMainXMLDoc = new XmlDocument();
xmlMainXMLDoc.Load(part.GetStream(FileMode.Open, FileAccess.Read));
//replace some keys inside xml (it will come from database, it's just a test)
xmlMainXMLDoc.InnerXml = xmlMainXMLDoc.InnerXml.Replace("field_customer", "My Customer Name");
xmlMainXMLDoc.InnerXml = xmlMainXMLDoc.InnerXml.Replace("field_title", "Report of Documents");
xmlMainXMLDoc.InnerXml = xmlMainXMLDoc.InnerXml.Replace("field_content", "Content of Document");
//Open the stream to write document
StreamWriter partWrt = new StreamWriter(part.GetStream(FileMode.Open, FileAccess.Write));
//doc.Save(partWrt);
xmlMainXMLDoc.Save(partWrt);
partWrt.Flush();
partWrt.Close();
reportStream.Flush();
pkg.Close();
return reportStream;
}
PS: Quand je convertir MemoryStream à un fichier, j'ai un fichier corrompu. Merci!
Non, en Fait, j'ai besoin de remplir ces champs, je voudrais remplacer mon contenu dynamique. Je ne sais pas si MergeFields est la bonne façon de le faire. Merci!!!!
Généralement la façon dont vous voulez mettre du contenu dans le champ de fusion est par présenteront les pièces d'un publipostage avec une source de données qui contient vous du contenu dynamique. Ce libaray êtes-vous d'utiliser pour manipuler le fichier docx de l'asp.net code ?
Eh bien, j'ai DocumentFormat.OpenXml référencé dans mon projet, mais il n'est pas nécessaire d'être utilisé. J'ai trouvé un code qui fait ce dont j'ai besoin et je l'ai eu à travailler 🙂 ... mais il utilise un FileStream, donc, je me demandais si est-il un moyen pour générer un docx en MemoryStream et de l'envoyer à côté client? Regardez mes modifications! Merci @user957902
Jetez un oeil à la DocumentFormat.OpenXml.Wordprocessing.MailMerge classe. Vous pourriez aussi envisager d'en utiliser DocumentVariables au lieu de cela, si c'est un peu obsolète.
OriginalL'auteur Felipe Oriani | 2011-12-06
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de http://www.codeproject.com/KB/office/Fill_Mergefields.aspx qui utilise le SDK Open XML pour ce faire.
OriginalL'auteur JasonPlutext
Je sais que c'est un vieux post, mais je ne pouvais pas la accepté de répondre à travailler pour moi. Le lien entre le projet n'aurait même pas compiler (quelqu'un a déjà commenté dans ce lien). Aussi, il semble qu'il utilise d'autres packages Nuget comme WPFToolkit.
Donc, je vais ajouter ma réponse ici au cas où quelqu'un le trouve utile. Ce n'utilise que les OpenXML SDK 2.5 et aussi la WindowsBase v4. Cela fonctionne sur MS Word 2010, et plus tard.
Ce que le code ci-dessus ne est essentiellement ceci:
Mise à JOUR
Pour toute personne intéressée, ici est une simple classe statique que j'ai utilisé pour m'aider à remplacer les champs de fusion.
vous avez raison. J'ai fait copier-coller et modifié pour un peu de préciser, mais ne pas le faire correctement. Merci!
J'ai ajouté un lien vers le code que j'ai finalement utilisé, dans le cas où vous êtes intéressé.
Très apprécié Frank - ne sais pas pourquoi il m'a fallu si longtemps pour trouver cet exemple, mais il est parfait pour la compréhension de OpenXML des champs de fusion
OriginalL'auteur Frank Fajardo
Frank Fajardo de réponse a été de 99% du chemin pour moi, mais il est important de noter que MERGEFIELDS peut être SimpleFields ou FieldCodes.
Dans le cas de SimpleFields, les séquences de texte affiché à l'utilisateur dans le document sont les enfants de la SimpleField.
Dans le cas de FieldCodes, le texte s'exécute indiqués à l'utilisateur sont entre les pistes contenant FieldChars avec les Séparer et à la Fin FieldCharValues. Parfois, plusieurs texte contenant des pistes existent entre les Séparer et de Fin des Éléments.
Le code ci-dessous traite de ces problèmes. Plus de détails de la façon d'obtenir toutes les MERGEFIELDS à partir du document, y compris l'en-tête et pied de page est disponible dans un dépôt GitHub à https://github.com/mcshaz/SimPlanner/blob/master/SP.DTOs/Utilities/OpenXmlExtensions.cs
OriginalL'auteur Brent