Click here to Skip to main content
15,893,594 members
Articles / Web Development / CSS

A SOA Approach to Dynamic DOCX-PDF Report Generation - Part 1

Rate me:
Please Sign up or sign in to vote.
5.00/5 (6 votes)
23 Aug 2010CDDL6 min read 60.6K   1.3K   65  
Generating docx reports in a client-server architecture, without using MS Office
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Web;
using System.Web.Services.Protocols;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using DocxGenerator.PL.Web.SvcDynamicDocxGenerator;

namespace DocxGenerator.PL.Web
{
    public partial class GeneratoreDocumentoDinamico : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!this.IsPostBack)
                {
                    this.lblMessage.Text = "";
                    this.btnClear.Visible = false;

                    XmlDocument xDoc = new XmlDocument();
                    xDoc.Load(Server.MapPath(@"App_Data/template.xml"));

                    Session["DynamicControls"] = new List<Control>();
                    Session["XDoc"] = xDoc; 
                    
                    buildDynamicControls(xDoc.SelectSingleNode("//datiDocumento"));

                    List<Control> dynamicControls = (List<Control>)Session["DynamicControls"];

                    foreach (Control cnt in dynamicControls)
                    {
                        this.plhContainer.Controls.Add(cnt);
                    }
                }
                else
                {
                    // Ripristino i controlli dinamici
                    if (Session["DynamicControls"] != null)
                    {
                        List<Control> dynamicControls = (List<Control>)Session["DynamicControls"];

                        foreach (Control cnt in dynamicControls)
                        {
                            this.plhContainer.Controls.Add(cnt);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }
        }


        protected void AutoPopulateButton_Click(object sender, EventArgs e)
        {
            try
            {
                List<Control> dynamicControls = (List<Control>)Session["DynamicControls"];

                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(Server.MapPath(@"App_Data/template.xml"));
                Session["XDoc"] = xDoc; 

                XmlNode rootNode = xDoc.SelectSingleNode("//datiDocumento");
                for (int i1 = 0; i1 < rootNode.ChildNodes.Count; i1++)
                {
                    XmlNode xNode = rootNode.ChildNodes[i1];
                    // Il nodo corrente non contiene figli
                    if (xNode.ChildNodes.Count <= 1)
                    {
                        Panel panContainer = (Panel)dynamicControls[i1];
                        TextBox txtContent = (TextBox)panContainer.Controls[1];
                        txtContent.Text = xNode.InnerText;
                    }
                    else
                    {
                        XmlNode tableNode = xNode;
                        Panel panExternal = (Panel)dynamicControls[i1];
                        Panel panTableContainer = (Panel)panExternal.Controls[1];
                        Panel panTableInternal = (Panel)panTableContainer.Controls[0];

                        int j = 1;
                        for (int i2 = 0; i2 < tableNode.ChildNodes.Count; i2++)
                        {
                            XmlNode rowNode = tableNode.ChildNodes[i2];
                            Panel panRowContainer = (Panel)panTableInternal.Controls[j];
                            Panel panRowInternal = (Panel)panRowContainer.Controls[0];

                            for (int i3 = 0; i3 < rowNode.ChildNodes.Count; i3++)
                            {
                                XmlNode cellNode = rowNode.ChildNodes[i3];
                                Panel panCellContainer = (Panel)panRowInternal.Controls[i3];

                                TextBox txtCell = (TextBox)panCellContainer.Controls[1];
                                txtCell.Text = cellNode.InnerText;
                            }
                            j += 2;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }
        }

        protected void btnCancellaDati_Click(object sender, EventArgs e)
        {
            try
            {
                List<Control> dynamicControls = (List<Control>)Session["DynamicControls"];
                XmlDocument xDoc = (XmlDocument)Session["XDoc"];

                XmlNode rootNode = xDoc.SelectSingleNode("//datiDocumento");
                for (int i1 = 0; i1 < rootNode.ChildNodes.Count; i1++)
                {
                    XmlNode xNode = rootNode.ChildNodes[i1];
                    // Il nodo corrente non contiene figli
                    if (xNode.ChildNodes.Count <= 1)
                    {
                        Panel panContainer = (Panel)dynamicControls[i1];
                        TextBox txtContent = (TextBox)panContainer.Controls[1];
                        txtContent.Text = "";
                    }
                    else
                    {
                        XmlNode tableNode = xNode;
                        Panel panExternal = (Panel)dynamicControls[i1];
                        Panel panTableContainer = (Panel)panExternal.Controls[1];
                        Panel panTableInternal = (Panel)panTableContainer.Controls[0];

                        int j = 1;
                        for (int i2 = 0; i2 < tableNode.ChildNodes.Count; i2++)
                        {
                            XmlNode rowNode = tableNode.ChildNodes[i2];
                            Panel panRowContainer = (Panel)panTableInternal.Controls[j];
                            Panel panRowInternal = (Panel)panRowContainer.Controls[0];

                            for (int i3 = 0; i3 < rowNode.ChildNodes.Count; i3++)
                            {
                                XmlNode cellNode = rowNode.ChildNodes[i3];
                                Panel panCellContainer = (Panel)panRowInternal.Controls[i3];

                                TextBox txtCell = (TextBox)panCellContainer.Controls[1];
                                txtCell.Text = "";
                            }
                            j += 2;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }
        }


        protected void btnSalvaDocxSulServer_Click(object sender, EventArgs e)
        {
            try
            {
                string customXML = buildCustomXml();

                DynamicDocxGeneratorServiceClient svcClient = new DynamicDocxGeneratorServiceClient();
                byte[] fileContents = svcClient.GenerateDynamicDocx(customXML);
                string fileName = "rep_" + DateTime.Now.ToString("yyyyMMdd_HHmmssfff_") + (new Random(4)).Next(10, 100).ToString() + ".docx";
                string filePath = Server.MapPath(@"Reports/" + fileName);
                File.WriteAllBytes(filePath, fileContents);

                this.lblMessage.Text = "File scritto nella seguente cartella del server. Fare click per scaricare: " +
                    "<br/><a target='_blank' href='Reports/" + fileName + "'/><b>" + filePath + "</b></a>";
                this.lblMessage.ForeColor = System.Drawing.Color.Black;
                this.btnClear.Visible = true;
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }

        }

        protected void btnInviaDocxAlClient_Click(object sender, EventArgs e)
        {
            try
            {
                string customXML = buildCustomXml();

                DynamicDocxGeneratorServiceClient svcClient = new DynamicDocxGeneratorServiceClient();
                byte[] fileContents = svcClient.GenerateDynamicDocx(customXML);

                this.lblMessage.Text = "File inviato al client";
                this.lblMessage.ForeColor = System.Drawing.Color.Black;
                this.btnClear.Visible = true;

                //Invia file al client via http
                Response.ClearContent();
                Response.ClearHeaders();
                Response.AddHeader("content-disposition", "attachment; filename=Documento.docx");
                Response.ContentEncoding = System.Text.Encoding.UTF8;
                Response.BinaryWrite(fileContents);
                Response.Flush();
                Response.Close();
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }
        }

        protected void btnSalvaPdfSulServer_Click(object sender, EventArgs e)
        {
            try
            {
                string customXML = buildCustomXml();

                DynamicDocxGeneratorServiceClient svcClient = new DynamicDocxGeneratorServiceClient();
                byte[] fileContents = svcClient.GenerateDynamicPdf(customXML);
                string fileName = "rep_" + DateTime.Now.ToString("yyyyMMdd_HHmmssfff_") + (new Random(4)).Next(10, 100).ToString() + ".pdf";
                string filePath = Server.MapPath(@"Reports/" + fileName);
                File.WriteAllBytes(filePath, fileContents);

                this.lblMessage.Text = "File scritto nella seguente cartella del server. Fare click per scaricare: " +
                    "<br/><a target='_blank' href='Reports/" + fileName + "'/><b>" + filePath + "</b></a>";
                this.lblMessage.ForeColor = System.Drawing.Color.Black;
                this.btnClear.Visible = true;
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }

        }

        protected void btnInviaPdfAlClient_Click(object sender, EventArgs e)
        {
            try
            {
                string customXML = buildCustomXml();

                DynamicDocxGeneratorServiceClient svcClient = new DynamicDocxGeneratorServiceClient();
                byte[] fileContents = svcClient.GenerateDynamicPdf(customXML);

                this.lblMessage.Text = "File inviato al client";
                this.lblMessage.ForeColor = System.Drawing.Color.Black;
                this.btnClear.Visible = true;

                //Invia file al client via http
                Response.ClearContent();
                Response.ClearHeaders();
                Response.AddHeader("content-disposition", "attachment; filename=Documento.pdf");
                Response.ContentEncoding = System.Text.Encoding.UTF8;
                Response.BinaryWrite(fileContents);
                Response.Flush();
                Response.Close();
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }
        }


        protected void btnClear_Click(object sender, EventArgs e)
        {
            this.lblMessage.Text = "";
            this.btnClear.Visible = false;
        }


        private string buildCustomXml()
        {
            try
            {
                List<Control> dynamicControls = (List<Control>)Session["DynamicControls"];
                XmlDocument xDoc = (XmlDocument)Session["XDoc"];

                XmlNode rootNode = xDoc.SelectSingleNode("//datiDocumento");
                for (int i1 = 0; i1 < rootNode.ChildNodes.Count; i1++)
                {
                    XmlNode xNode = rootNode.ChildNodes[i1];
                    // Il nodo corrente non contiene figli
                    if (xNode.ChildNodes.Count <= 1)
                    {
                        Panel panContainer = (Panel)dynamicControls[i1];
                        TextBox txtContent = (TextBox)panContainer.Controls[1];
                        xNode.InnerText = txtContent.Text;
                    }
                    else
                    {
                        XmlNode tableNode = xNode;
                        Panel panExternal = (Panel)dynamicControls[i1];
                        Panel panTableContainer = (Panel)panExternal.Controls[1];
                        Panel panTableInternal = (Panel)panTableContainer.Controls[0];

                        int j = 1;
                        for (int i2 = 0; i2 < tableNode.ChildNodes.Count; i2++)
                        {
                            XmlNode rowNode = tableNode.ChildNodes[i2];
                            Panel panRowContainer = (Panel)panTableInternal.Controls[j];
                            Panel panRowInternal = (Panel)panRowContainer.Controls[0];

                            for (int i3 = 0; i3 < rowNode.ChildNodes.Count; i3++)
                            {
                                XmlNode cellNode = rowNode.ChildNodes[i3];
                                Panel panCellContainer = (Panel)panRowInternal.Controls[i3];

                                TextBox txtCell = (TextBox)panCellContainer.Controls[1];
                                cellNode.InnerText = txtCell.Text;
                            }
                            j += 2;
                        }
                    }
                }

                return rootNode.OwnerDocument.InnerXml;
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;

                return null;
            }
        }

        private void buildDynamicControls(XmlNode xNode)
        {
            try
            {
                List<Control> dynamicControls = (List<Control>)Session["DynamicControls"];

                foreach (XmlNode currentNode in xNode.ChildNodes)
                {
                    // Il nodo corrente non contiene figli
                    if (currentNode.ChildNodes.Count <= 1)
                    {
                        Panel panContainer = new Panel();
                        Label lblTitle = new Label();
                        TextBox txtContent = new TextBox();

                        panContainer.CssClass = "singleFieldContainer";
                        txtContent.CssClass = "singleFieldText";
                        lblTitle.Text = currentNode.Attributes["alias"].Value + ":<br/>";                        
                        txtContent.TextMode = TextBoxMode.MultiLine;

                        panContainer.Controls.Add(lblTitle);
                        panContainer.Controls.Add(txtContent);

                        dynamicControls.Add(panContainer);
                    }
                    else
                    {
                        Panel panExternal = new Panel();
                        
                        Panel panTableContainer = new Panel();
                        panTableContainer.CssClass = "tableContainer";

                        Label lblTableName = new Label();
                        lblTableName.Text = currentNode.Attributes["alias"].Value + ":<br />";

                        panExternal.Controls.Add(lblTableName);

                        Panel panTableInternal = new Panel();

                        foreach (XmlNode rowNode in currentNode.ChildNodes)
                        {
                            Panel panRowContainer = new Panel();
                            panRowContainer.CssClass = "rowContainer";

                            Label lblRowName = new Label();
                            lblRowName.Text = rowNode.Attributes["alias"].Value + ":<br />";

                            panTableInternal.Controls.Add(lblRowName);
                            Panel panRowInternal = new Panel();
                            
                            foreach (XmlNode cellNode in rowNode.ChildNodes)
                            {
                                Panel panCellContainer = new Panel();                                
                                Label lblCellName = new Label();
                                TextBox txtCellContent = new TextBox();

                                panCellContainer.CssClass = "cellContainer";
                                lblCellName.Text = cellNode.Attributes["alias"].Value + ":<br/>";
                                txtCellContent.CssClass = "cellFieldText";
                                txtCellContent.TextMode = TextBoxMode.MultiLine;

                                panCellContainer.Controls.Add(lblCellName);
                                panCellContainer.Controls.Add(txtCellContent);

                                panRowInternal.Controls.Add(panCellContainer);
                            }
                            panRowContainer.Controls.Add(panRowInternal);
                            panTableInternal.Controls.Add(panRowContainer);
                        }
                        
                        panTableContainer.Controls.Add(panTableInternal);
                        panExternal.Controls.Add(panTableContainer);

                        dynamicControls.Add(panExternal);
                    }
                }
            }
            catch (Exception ex)
            {
                this.lblMessage.Text = "Errore!<br />" + ex.Message;
                this.lblMessage.ForeColor = System.Drawing.Color.Red;
                this.btnClear.Visible = true;
            }
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Common Development and Distribution License (CDDL)


Written By
Engineer
United Kingdom United Kingdom
I've been involved in object-oriented software development since 2006, when I graduated in Information and TLC Engineering. I've been working for several software companies / departments, mainly on Microsoft and Sun/Oracle technologies. My favourite programming language is C#, next comes Java.
I love design patterns and when I need to resolve a problem, I try to get the best solution, which is often not the quickest one.

"On the best teams, different individuals provide occasional leadership, taking charge in areas where they have particular strengths. No one is the permanent leader, because that person would then cease to be a peer and the team interaction would begin to break down. The structure of a team is a network, not a hierarchy ..."
My favourite team work quotation by DeMarco - Lister in Peopleware

Comments and Discussions