Question

J'ai formulaire InfoPath 2010. conçu comme information pour l'élève. Je veux générer le rapport comme document Word en utilisant OpenXML avec modèle de rapport spécifié. I conçu la forme telle que loin,

  • Tous les champs sont lieu formulaire InfoPath sous forme de texte pour l'instant.

  • et ajouté le bouton de commande.

  • Sur CLICK je suis aller chercher les valeurs des champs à l'aide d'objets XPathNavigator.
  • Maintenant, j'ai un ensemble de variables de chaîne avec des valeurs.
  • J'ai préparé le fichier .dotx avec des contrôles de contenu. (Ai-je besoin de donner id à chaque contrôle)

Mais incapable de comprendre comment puis-je mapper mes variables valeurs au mot contrôles de contenu du modèle en utilisant C # programatically. [Ci-joint] [1 ] le grand exemple de l'OpenXML avec web. mais il utilise la coutume Xml partie, qui utilise des données à partir du fichier de dumping xml modèle de mot.

Qu'est-ce que je dois faire pour mapper mes variables de chaîne avec des contrôles de contenu de modèle? tout lien de référence pour cela?

Était-ce utile?

La solution

J'ai eu à quelque chose atteind très semblable, et je fini par utiliser la coutume « PlaceHolder » champs à la place des champs Word (ils ont diverses limitations - en-tête, pied de page et le corps tout en utilisant différents objets)

Dans mon modèle de mot, je marque un PlaceHolder comme celui-ci - ## MyPlaceHolderName #!. Alors j'analysables le texte du modèle de mot pour trouver tous les espaces réservés à l'aide RegEx et les a remplacées par les valeurs réelles du formulaire InfoPath.

Le seul inconvénient de cette solution est que vos espaces réservés et vos champs InfoPath devront avoir le même nom, sinon vous ne pourrez pas faire de correspondance.

Considérez cette méthode:

private void FillDocument(Stream documentStream, string xmlFields)
{
    var doc = new XmlDocument();
    doc.LoadXml(xmlFields);

    var props = doc.SelectSingleNode("properties");
    if (props == null) throw new Exception("No properties found.");

    //transform the xml properties to dictionary for easier replacement
    var fields = props.ChildNodes.Cast<XmlNode>().ToDictionary
        (node => string.Format("##{0}!#", node.Name), node => node.InnerText);


    using (var document = WordprocessingDocument.Open(documentStream, true))
    {
        var main = document.MainDocumentPart;

        //replace the fields in the main document
        main.Document.InnerXml = ReplaceFields(main.Document.InnerXml, fields);

        //replace the fields in the headers
        foreach (var headerPart in main.HeaderParts)
            headerPart.Header.InnerXml = ReplaceFields(headerPart.Header.InnerXml, fields);

        //replace the fields in the footers
        foreach (var footerPart in main.FooterParts)
            footerPart.Footer.InnerXml = ReplaceFields(footerPart.Footer.InnerXml, fields);

        main.Document.Save();
    }
}

private string ReplaceFields(string xmlPart, Dictionary<string, string> fields)
{
    //searches the xml for the declared fields
    var fieldRegex = new Regex("##[^#]*!#");
    var matches = fieldRegex.Matches(xmlPart);

    foreach (Match match in matches)
    {
        //the fields are within tags (InnerText) so remove all other xml stuff
        var innerRegex = new Regex("<[^>]*>");
        string fieldName = innerRegex.Replace(match.Groups[0].Value, "");

        //replace the actual value of the field
        if(fields.ContainsKey(fieldName))
            xmlPart = xmlPart.Replace(match.Groups[0].Value, fields[fieldName]);
    }

    return xmlPart;
}

utiliser cette fonctionnalité? Comme suit:

//open the file from as stream (in this example, the file is opened from SP
using (var stream = templateFile.OpenBinaryStream())
{
    //iterate the properties you need and add them in this format 
    var xmlProperties = "<properties><MyPlaceHolderName>MyPlaceHolderValue</MyPlaceHolderName></properties>";

    //fill out the fields
    FillDocument(stream, xmlProperties);
}

Je sais que le Xml-Remplaçant et xmlProperties sont relativement fou, mais je devais le mettre en œuvre comme celui-ci en raison de mes exigences (méthode est appelée par un WebService de InfoPath). Faites-moi savoir si vous avez besoin assistence plus loin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top