⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generation.cs

📁 将网页生成word文档
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Xsl;
using System.IO;

namespace GeneratingMicrosoftWordReports.Engine
{
    public class Generation
    {
        /// <summary>
        /// Creates Word document from XML using XSLT
        /// </summary>
        /// <param name="xmlData">Report data as XML</param>
        /// <param name="nameOfXslt">XSLT transformation as Stream, used for document creation</param>
        /// <returns>Resulting Word document as byte[]</returns>
        public static byte[] GetWord(XmlReader xmlData, XmlReader xsltReader)
        {
            // Initialize needed variables
            XslCompiledTransform xslt = new XslCompiledTransform();
            XsltArgumentList args = new XsltArgumentList();

            using (MemoryStream swResult = new MemoryStream())
            {
                // Load XSLT to reader and perform transformation
                xslt.Load(xsltReader);
                xslt.Transform(xmlData, args, swResult);

                return swResult.ToArray();
            }
        }
        
        /// <summary>
        /// Generates List type Word report from DataTable
        /// </summary>
        /// <param name="reportHeader">Text to display in report header</param>
        /// <param name="dtData">DataTable containing data for word</param>
        /// <returns>Resulting Word document as Byte array</returns>
        public static byte[] GenericListReport(string reportHeader, DataTable dtData)
        {
            // default xslt
            string template = @"<?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0' xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:fn='http://www.w3.org/2003/11/xpath-functions' xmlns:xf='http://www.w3.org/2002/08/xquery-functions'>
	<xsl:template match='/'>
		<html>
			<body>
				<h2>{0}</h2>
				<table border='0' width='100%'>
					<tr bgcolor='Gray'>
						{1}
					</tr>
					<xsl:for-each select='{2}'>
						<tr>
							{3}
						</tr>
					</xsl:for-each>
				</table>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>";

            return GenericListReport(template, reportHeader, dtData);
        }

        /// <summary>
        /// Generates List type Word report from DataTable
        /// </summary>
        /// <param name="template">Xslt template to use in creation process</param>
        /// <param name="reportHeader">Text to display in report header</param>
        /// <param name="dtData">DataTable containing data for word</param>
        /// <returns>Resulting Word document as Byte array</returns>
        public static byte[] GenericListReport(string template, string reportHeader, DataTable dtData)
        {            
            // Generate Xslt

            /* {1}
             *  <th align='left'>Title</th>
                <th align='left'>Artist</th>
             */

            /* {3}
             *  <td><xsl:value-of select='title'/></td>
                <td><xsl:value-of select='artist'/></td>
             */

            StringBuilder cols = new StringBuilder();
            StringBuilder valueOfSelect = new StringBuilder();
            foreach (DataColumn dc in dtData.Columns)
            {
                cols.AppendFormat("<th align='left'>{0}</th>", dc.ColumnName);
                valueOfSelect.AppendFormat("<td><xsl:value-of select='{0}'/></td>", dc.ColumnName);
            }

            // {2} - catalog/cd
            string path = null;
            if (dtData.DataSet != null)
                path = string.Format("{0}/{1}", dtData.DataSet.DataSetName, dtData.TableName);
            else
                path = string.Format("{0}/{1}", "DocumentElement", dtData.TableName);

            StringBuilder sb = new StringBuilder();
            sb.AppendFormat(template, reportHeader, cols.ToString(), path, valueOfSelect.ToString());

            string xslt = sb.ToString();


            // Generate Xml
            string xml = null;
            using (StringWriter sw = new StringWriter())
            {
                dtData.WriteXml(sw, XmlWriteMode.IgnoreSchema);
                xml = sw.ToString();
            }


            // Generate Word
            StringReader srXslt = null;
            StringReader srXml = null;
            try
            {
                srXslt = new StringReader(xslt);
                srXml = new StringReader(xml);

                XmlReader readerXslt = XmlReader.Create(srXslt);
                XmlReader readerXml = XmlReader.Create(srXml);

                return GetWord(readerXml, readerXslt);
            }
            finally
            {
                srXslt.Dispose();
                srXml.Dispose();
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -