.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开发不可不知、不可不用的辅助类(三)(报表导出---终结版),如需转载请自行联系原博主。


目录
相关文章
|
24天前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
45 13
|
25天前
|
Linux API C#
基于 .NET 开发的多功能流媒体管理控制平台
基于 .NET 开发的多功能流媒体管理控制平台
41 9
|
27天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
66 12
|
25天前
|
Web App开发 前端开发 调度
一款基于 .NET + Blazor 开发的智能访客管理系统
一款基于 .NET + Blazor 开发的智能访客管理系统
|
25天前
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
|
25天前
|
网络协议 C#
基于.NET WinForm开发的一款硬件及协议通讯工具
基于.NET WinForm开发的一款硬件及协议通讯工具
|
25天前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
30天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
74 2
|
2月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
52 4
|
2月前
|
机器学习/深度学习 人工智能 物联网
.NET 技术:引领未来开发潮流
.NET 技术以其跨平台兼容性、高效的开发体验、强大的性能表现和安全可靠的架构,成为引领未来开发潮流的重要力量。本文深入探讨了 .NET 的核心优势与特点,及其在企业级应用、移动开发、云计算、人工智能等领域的广泛应用,展示了其卓越的应用价值和未来发展前景。
73 5

相关实验场景

更多