.NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)

简介:
.NET导出报表一般是采用导出Excel报表的方式输出内容。而这又分为两种方式:使用Excel模板方式和使用网页输出Excel格式两种。
首先介绍简单的一种,网页输出Excel内容,这种不需要引用Excel的程序集。
     /// <summary>
    
/// 报表导出辅助类
    
/// </summary>

     public  class ExportToExcel
     {
        字段信息        

        public ExportToExcel()
        {
        }


        /// <summary>
        
/// 带参数的构造函数
        
/// </summary>
        
/// <param name="fileName">导出的Excel文件名</param>
        
/// <param name="sourceTable">源数据DataTable</param>
        
/// <param name="title">报表的抬头</param>

        public ExportToExcel(string fileName, DataTable sourceTable, string title)
        {
            this.fileName = fileName;
            this.sourceTable = sourceTable;
            this.title = title;
        }


        public void ExportReport()
        {
            if (SourceTable == null || SourceTable.Rows.Count == 0)
            {
                return;
            }


            DataGrid dataGrid = new DataGrid();
            dataGrid.DataSource = sourceTable;
            dataGrid.DataBind();

            HttpResponse Response = HttpContext.Current.Response;
            Response.Clear();
            Response.Buffer = true;
            Response.AddHeader(C_HTTP_HEADER_CONTENT, C_HTTP_ATTACHMENT + HttpUtility.UrlEncode(fileName + ".xls"));
            Response.ContentType = C_HTTP_CONTENT_TYPE_EXCEL;
            Response.ContentEncoding = Encoding.GetEncoding("gb2312");
            Response.Charset = charSet;

            StringWriter oStringWriter = new StringWriter();
            HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter);
            dataGrid.RenderControl(oHtmlTextWriter);

            string str = oStringWriter.ToString();
            int trPosition = str.IndexOf("<tr>", 0);
            string str1 = str.Substring(0, trPosition - 1);
            string str2 = str.Substring(trPosition, str.Length - trPosition);

            string str3 = "\r\n\t<tr>";
            str3 += "\r\n\t\t<td align=\"center\" colspan=\"" + sourceTable.Rows.Count +
                    "\" style=\"font-size:14pt;    font-weight:bolder;height:30px;\">" + title + "</td>";
            str3 += "\r\n\t</tr>";

            Response.Write(str1 + str3 + str2);
            Response.End();
        }

    }
使用时候代码如下:
         private  void btnExport2_Click( object sender, EventArgs e)
         {
            DataTable table = SelectAll().Tables[0];
            ExportToExcel export = new ExportToExcel("TestExport", table, "TestExport");
            export.ExportReport();
        }


         public  static DataSet SelectAll()
         {
            string sqlCommand = " Select ID, Name, Age, Man, CONVERT(CHAR(10), Birthday ,120) as Birthday from Test";

            DataSet ds = new DataSet();
            string connectionString = "Server=localhost;Database=Test;uid=sa;pwd=123456";

            SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand, connectionString);
            adapter.Fill(ds);

            return ds;
        }
另外一种就是先定义好Excel模板,然后输出指定格式的内容,这些内容通过开始单元格名称定位,然后写入内容,但是这种功能比较强大,输出的Excel内容也比较整齐。
1. 首先在Web.Config中配置下
 <system.web>
   <identity impersonate="true"></identity>   
 </system.web>
2. 创建一个Excel模板文件,如下图所示,当然这个是简单的Excel模板,你可以定义很复杂
  Report_Excel.jpg
3. 在网站的根目录中创建一个Temp目录,给EveryOne读写权限,当然你也可以给AuthenticatedUsers
4. 辅助类代码
     /// <summary>
    
/// 报表导出基类
    
/// </summary>

     public  abstract  class BaseReport
     {
        变量及属性

        public BaseReport()
        {
            excelHelper = new ExcelHelper(false);
        }


        /// <summary>
        
/// 打开Excel文件和关闭Excel
        
/// </summary>        
        
/// <returns>返回OK表示成功</returns>

        protected virtual bool OpenFile()
        {
            return excelHelper.OpenFile(fileName);
        }


        /// <summary>
        
/// 关闭工作薄和excel文件
        
/// </summary>

        protected virtual void CloseFile()
        {
            excelHelper.stopExcel();
        }


        /// <summary>
        
/// 导出EXCEL文件
        
/// </summary>

        protected virtual void ExportFile()
        {
            string tempFileName = HttpContext.Current.Request.PhysicalApplicationPath + @"Temp\" + sheetName.Replace(".xls", "");
            string SaveFileName = tempFileName + DateTime.Now.ToLongDateString() +
                                  DateTime.Now.ToLongTimeString().Replace(":", "-") + ".xls";
            excelHelper.SaveAsFile(SaveFileName);
            CloseFile();

            HttpResponse Response = HttpContext.Current.Response;
            Response.Clear();
            Response.Buffer = true;
            Response.AddHeader(C_HTTP_HEADER_CONTENT,
                               C_HTTP_ATTACHMENT + HttpUtility.UrlEncode(DateTime.Now.ToLongDateString() + sheetName));
            Response.ContentType = C_HTTP_CONTENT_TYPE_EXCEL;
            Response.ContentEncoding = Encoding.GetEncoding("gb2312");
            Response.Charset = CharSet;
            Response.WriteFile(SaveFileName);
            Response.Flush();
            Response.Clear();

            File.Delete(SaveFileName);
        }


        /// <summary>
        
/// 填充表单数据到excel中
        
/// </summary>
        
/// <param name="GotoCell">定义的首个Cell名称</param>
        
/// <param name="dt">数据表Datatable</param>

        protected virtual void FillCell(string GotoCell, DataTable dt)
        {
            int BeginRow = 2;
            int RowCount = dt.Rows.Count;
            Range rgFill = excelHelper.GotoCell(GotoCell);
            if (RowCount > BeginRow)
            {
                excelHelper.InsertRows(rgFill.Row + 1, RowCount - BeginRow); //从定位处的下一行的上面插入新行
            }

            //Fill
            if (RowCount > 0)
            {
                excelHelper.DataTableToExcelofObj(dt, excelHelper.IntToLetter(rgFill.Column) + rgFill.Row.ToString(), false);
            }

        }


        private void AppendTitle(string titleAppendix)
        {
            if (titleAppendix != null && titleAppendix != string.Empty)
            {
                try
                {
                    excelHelper.AppendToExcel(titleAppendix, "Title");
                }

                catch (Exception ex)
                {
                    throw new Exception("您没有指定一个Title的单元格", ex);
                }

            }

        }


        /// <summary>
        
/// 写入内容
        
/// </summary>

        public virtual void ExportExcelFile()
        {
            ExportExcelFile(string.Empty);
        }


        /// <summary>
        
/// 写入内容并追加标题内容
        
/// </summary>
        
/// <param name="titleAppendix">追加在Title后面的内容(一般如年月份)</param>

        public virtual void ExportExcelFile(string titleAppendix)
        {
            try
            {
                OpenFile();
                AppendTitle(titleAppendix);
                FillFile();
                ExportFile();
            }

            catch //(Exception ex)
            {
                CloseFile();
                throw;
            }

        }



        protected virtual void FillFile()
        {
        }

    }
     /// <summary>
    
///通用的报表导出类
    
/// </summary>
    
/// <example>
    
/// <code>
    
/// DataTable dt = InitTableData(); //InitTableData为自定义获取数据表的函数
    
///    CommonExport report = new CommonExport(dt, "架空线.xls", "Start"); //Start是Excel一个单元格名称
    
/// report.ExportExcelFile();
    
/// </code>
    
/// </example>

     public  class CommonExport : BaseReport
     {
        private DataTable sourceTable;
        private string startCellName;

        /// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="sourceTable">要导出的DataTable对象</param>
        
/// <param name="excelFileName">相对于根目录的文件路径,如Model/Test.xls</param>
        
/// <param name="startCellName">开始的单元格名称</param>

        public CommonExport(DataTable sourceTable, string excelFileName, string startCellName)
        {
            fileName = Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath, excelFileName);
            sheetName = Path.GetFileName(fileName);

            this.sourceTable = sourceTable;
            this.startCellName = startCellName;
        }


        /// <summary>
        
/// 填写文件
        
/// </summary>

        protected override void FillFile()
        {
            FillCell(startCellName, sourceTable);
        }
     /// <summary>
    
/// Excel帮助类
    
/// </summary>

     internal  class ExcelHelper : IDisposable
     {
        一般的属性变量

        打开工作薄变量

        关闭工作薄变量

        /// <summary>
        
/// 当前工作薄
        
/// </summary>

        public Workbook CurrentExcelWorkBook
        {
            get return excelWorkbook; }
            set { excelWorkbook = value; }
        }


        /// <summary>
        
/// 释放对象内存,推出进程
        
/// </summary>
        
/// <param name="obj"></param>

        private void NAR(object obj)
        {
            try
            {
                Marshal.ReleaseComObject(obj);
            }

            catch
            {
            }

            finally
            {
                obj = null;
            }

        }



        public ExcelHelper()
        {
            StartExcel();
        }


        /// <summary>
        
/// 确定Excel打开是否可见
        
/// </summary>
        
/// <param name="visible">true为可见</param>

        public ExcelHelper(bool visible)
        {
            m_app_visible = visible;
            StartExcel();
        }


        /// <summary>
        
/// 开始Excel应用程序
        
/// </summary>

        private void StartExcel()
        {
            if (excelApp == null)
            {
                excelApp = new ApplicationClass();
            }


            // Excel是否可见
            excelApp.Visible = m_app_visible;
        }


        public void Dispose()
        {
            stopExcel();
            GC.SuppressFinalize(this);
        }


        
        打开、保存、关闭Excel文件        

        windows窗口,workbook工作薄,worksheet工作区操作

        行列操作        
    }


本文转自博客园伍华聪的博客,原文链接:.NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版),如需转载请自行联系原博主。


目录
相关文章
|
21天前
|
设计模式 开发框架 JavaScript
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
130 3
|
21天前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统
|
21天前
|
开发框架 JavaScript 前端开发
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
|
2月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
37 1
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
2月前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
2月前
|
C# Windows
一款基于.NET开发的简易高效的文件转换器
一款基于.NET开发的简易高效的文件转换器
|
2月前
|
开发框架 缓存 前端开发
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
|
2月前
|
前端开发 JavaScript C#
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件