UltraWebGrid手写导出excel方法(非自带控件方法)

news/2024/7/21 4:26:00 标签: excel, dataset, string, path, xsl, stylesheet
 

//因为采用了Infragistics控件,所以进行了一部分的集成,如果
//做其它方面的用途,可以对控件部分做适当的修改。

using System;
using System.Data;
using System.Collections;
using System.Collections.Specialized;
using Infragistics.WebUI.UltraWebGrid;
using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Xsl;
using System.IO;
using System.Xml.XPath;

namespace WEBUI_1
{
    /// <summary>
    /// GridToExcel 的摘要说明。
    /// </summary>
    public class GridToExcel
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public GridToExcel()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        /// <summary>
        /// 根据Grid显示样式,导出数据集数据到指定名称的文件中
        /// </summary>
        ///<param name="strPath">导出路径</param>
        ///<param name="grid">当前显示Grid</param>
        ///<param name="ds">当前数据集</param>
        public void ExportDataByGridWithXSL(string strPath,UltraWebGrid grid,DataSet ds)
        {
            DataSet _ds = GetFilterDataSet(grid,ds);
            BuildExcel(_ds,strPath);
        }
        
        /// <summary>
        /// 创建转换格式文件(XSL)
        /// </summary>
        /// <param name="ds">要导出的数据集</param>
        /// <param name="XslPath">xsl文件存放路径</param>
        private  void GetXSLFile(DataSet ds,string XslPath)
        {
            string strColumn = "";
            string strRow = "";
            string dsName=ds.DataSetName;
            string tableName=ds.Tables[0].TableName;
            string header = dsName + "/" + tableName;
            foreach(DataColumn clm in ds.Tables[0].Columns)
            {
                //特殊字符 <,>,",*,%,(,),& 替换
                //*************************************************
                //*************************************************
                // 符号         xml下的值      excel中的值
                //  < --------  _x003C_  ------ &lt;
                //  > -------- _x003E_  ------ &gt;
                //  " --------  _x0022_  ------ &quot;
                //  * --------  _x002A_  ------ *
                //  % --------  _x0025_  ------ %
                //  & --------  _x0026_  ------ &amp;
                //  ( --------  _x0028_  ------ (
                //  ) --------  _x0029_  ------ )
                //  = --------  _x003D_  ------ =
                //*************************************************
                //*************************************************

                string strClmName = clm.ColumnName;
                string strRowName = clm.ColumnName;
                
                if(strClmName.IndexOf("&")!=-1)
                    strClmName=strClmName.Replace("&","&amp;");
                if(strClmName.IndexOf("<")!=-1)
                    strClmName=strClmName.Replace("<","&lt;");
                if(strClmName.IndexOf(">")!=-1)
                    strClmName=strClmName.Replace(">","&gt;");
                if(strClmName.IndexOf(""")!=-1)
                    strClmName=strClmName.Replace(""","&quot;");
                
                if(strRowName.IndexOf("<")!=-1)
                    strRowName=strRowName.Replace("<","_x003C_");
                if(strRowName.IndexOf(">")!=-1)
                    strRowName=strRowName.Replace(">","_x003E_");
                if(strRowName.IndexOf(""")!=-1)
                    strRowName=strRowName.Replace(""","_x0022_");
                if(strRowName.IndexOf("*")!=-1)
                    strRowName=strRowName.Replace("*","_x002A_");
                if(strRowName.IndexOf("%")!=-1)
                    strRowName=strRowName.Replace("%","_x0025_");
                if(strRowName.IndexOf("&")!=-1)
                    strRowName=strRowName.Replace("&","_x0026_");
                if(strRowName.IndexOf("(")!=-1)
                    strRowName=strRowName.Replace("(","_x0028_");
                if(strRowName.IndexOf(")")!=-1)
                    strRowName=strRowName.Replace(")","_x0029_");
                if(strRowName.IndexOf("=")!=-1)
                    strRowName=strRowName.Replace("=","_x003D_");
                

                strColumn += "<th>" + strClmName +"</th>" + "rn";
                strRow += "<td>" + "<xsl:value-of select=" + """ + strRowName + """ +"/>" + "</td>" + "rn";
            }
            string str = @"<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
            <xsl:template match=""/"">
            <html xmlns:o=""urn:schemas-microsoft-com:office:office"" xmlns:x=""urn:schemas-microsoft-com:office:excel"" xmlns=""http://www.w3.org/TR/REC-html40"">
            <head>
            <meta http-equiv=""Content-Type"" content=""text/html;charset=utf-8"" />
            <style>
            .xl24{mso-style-parent:style0;mso-number-format:""@"";text-align:right;}
            </style>
            <xml>
            <x:ExcelWorkbook>
            <x:ExcelWorksheets>
            <x:ExcelWorksheet>
            <x:Name>Sheet1</x:Name>
            <x:WorksheetOptions>
                    <x:ProtectContents>False</x:ProtectContents>
                    <x:ProtectObjects>False</x:ProtectObjects>
                    <x:ProtectScenarios>False</x:ProtectScenarios>
            </x:WorksheetOptions>
            </x:ExcelWorksheet>
            </x:ExcelWorksheets>
            </x:ExcelWorkbook>
            </xml>
            </head>  
            <body> ";
            str += "rn" +  @"<table border=""1"" cellpadding=""0"" cellspacing=""0"">
                    <tr>" + "rn";
            str += strColumn;
            str += @" </tr>
                    <xsl:for-each select="""+header+@""">
                    <tr>";
            str += "rn" + strRow;
            str += @"</tr>
                    </xsl:for-each>
                    </table>
                    </body>
                    </html>
                      
                     
                    </xsl:template>
                    </xsl:stylesheet> ";

            string path = XslPath;
            if(File.Exists(path))
            {
                File.Delete(path);
            }
            FileStream fs = File.Create(path);
            StreamWriter sw=new StreamWriter(fs);
            sw.Write(str);
            sw.Close();
            fs.Close();
        }

        /// <summary>
        /// 根据数据集,生成替换后的xml文件
        /// </summary>
        /// <param name="ds">数据集合</param>
        /// <param name="XmlFilePath">xml文件路径</param>
        private  void GetXmlFile(DataSet ds,string XmlFilePath)
        {
            string strXml = ds.GetXml();
            if(File.Exists(XmlFilePath))
            {
                File.Delete(XmlFilePath);
            }
            FileStream fs1 = File.Create(XmlFilePath);
            StreamWriter writer = new StreamWriter(fs1);
            writer.Write(strXml);
            writer.Close();
            fs1.Close();
        }

        /// <summary>
        /// 生成Excel文件
        /// </summary>
        /// <param name="path">Excel导出全路径</param>
        /// <param name="ds">数据集</param>
        private  void BuildExcel(DataSet ds,string path)
        {
            if(File.Exists(path))
            {
                File.Delete(path);
            }
            string _path = path.Substring(0,path.Length-4);
            string _fileXml=_path + ".xml";
            string _fileXsl=_path + ".xsl";
            string _fileXls=_path+".xls";

            try
            {
                GetXmlFile(ds,_fileXml);
                GetXSLFile(ds,_fileXsl);

                //Excel转换
                XmlDocument doc = new XmlDocument();
                doc.Load(_fileXml);
                XslTransform xslt = new XslTransform();
                xslt.Load(_fileXsl);
                XmlElement root = doc.DocumentElement;
                XPathNavigator nav = root.CreateNavigator();
                XmlTextWriter writer = new XmlTextWriter(_fileXls, null);
                xslt.Transform(nav, null, writer, null);
                writer.Close();
                File.Delete(_fileXml);
                File.Delete(_fileXsl);
            }
            catch
            {
                throw;
            }
        }

        /// <summary>
        /// 更据Grid格式,设置数据集格式
        /// </summary>
        /// <param name="grid">显示数据的Grid</param>
        /// <param name="ds">存储数据的DataSet数据集</param>
        /// <returns>设置好的数据集DataSet</returns>
        private  DataSet GetFilterDataSet(UltraWebGrid grid,DataSet ds)
        {
            DataColumnCollection col = ds.Tables[0].Columns;

            foreach(UltraGridColumn clm in grid.Columns)
            {
                //如果该列隐藏,那么删除该数据集中的该列数据
                if(clm.Hidden)
                {
                    if(col.Contains(clm.Key))
                        col.Remove(clm.Key);
                }
                    //在显示列的情况下,设置该列的名称为Grid的列标题
                else
                {
                    if(col.Contains(clm.Key))
                        col[clm.Key].ColumnName=clm.HeaderText;
                }
            }
            return ds;
        }

    }
}

 

http://www.niftyadmin.cn/n/1415728.html

相关文章

Nginx配置路径使用密码访问

安装htpasswd工具&#xff1a; yum install httpd-tools -y生成密码文件&#xff1a; htpasswd -c 密码文件路径 用户名Nginx配置文件内添加配置&#xff1a; auth_basic "请输入账户密码&#xff01;"; auth_basic_user_file 密码文件路径;完整配置 loc…

.Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】

博主推荐一&#xff1a;WP8.1最经典培训教程 博主点评&#xff1a;经典Windows Phone8.1 Runtime API培训最经典教程&#xff0c;此教程由传智播客蒋坤老师录制的一整套WP8.1入门级视频教程&#xff0c;讲授内容非常广、深入而且非常适合入门学习。在英文资料都非常匮乏的今天&…

android 简书个人主页,使用Kotlin仿的简书个人主页,只需一个控件

界面做的比较丑&#xff0c;但是基本上实现了功能。为了学习最近比较火的kotlin语言&#xff0c;就试着写了个demo。参考上篇文章仿掌上英雄联盟的效果。效果图一、开始前的准备导入kotlin开发环境&#xff1a;在androidStudio3.0版本默认已经集成好了。直接在创建项目的时候勾…

webpack react 项目

1.npm install react react-dom --save 2.npm install webpack --save-dev 3.项目目录 4.package.josn 1 {2 "name": "my-app",3 "version": "0.1.0",4 "private": true,5 "dependencies": {6 "…

UltraWebGrid使用,注意事项集合

1.如果让分组项一开始就以某个列分组&#xff0c;并且展开。protected void UltraWebGrid1_InitializeLayout(object sender, LayoutEventArgs e){//控制分组this.UltraWebGrid1.Columns.FromKey("工作总结项目").IsGroupByColumn true;}protected void UltraWebGri…

HTML培训心得体会五篇(合集)

HTML5培训心得一 关于html5培训心得总结? 一&#xff1a;了解HTML5前端开发技术? ?? HTML?指的是超文本标记语言?(Hyper?Text?Markup?Language)&#xff0c;标记语言是一套标记标签?(markup?tag)&#xff0c;HTML?使用标记标签来描述网页。HTML5区别于HTML的标…

程序员跳槽攻略--下篇

2019独角兽企业重金招聘Python工程师标准>>> <blockquote> <h3>⾛完分享的最后⼀公⾥</h3> <p>毫⽆疑问&#xff0c;程序员是⾮常愿意分享的群体&#xff0c;正是这样才有了数不尽的开源软件&#xff0c;我现在正 <br />在使⽤的GitB…

html中asp页面代码,ASP生成HTML静态页面的实例源代码

ASP生成HTML静态页面的实例源代码&#xff1a;FilePath&#xff1a;生成静态页的文件名Do_Url&#xff1a;需要生成静态页的ASP文件Private Sub CreateHtmlPage(FilePath,Do_Url)FilePathserver.mappath(FilePath)Dim objXmlHttpSet objXmlHttpServer.createObject("Micro…