C# 报表设计器 (winform 设计端)开发与实现生成网页的HTML报表

Posted SDP开发平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 报表设计器 (winform 设计端)开发与实现生成网页的HTML报表相关的知识,希望对你有一定的参考价值。

    记得2010年之前,公司的项目基本上都要用到报表,以前我们常用的方法就是针对客户的需求来定制化开发(基本上是死写代码)来实现,经常导致项目经常性的延期,因为客户的需求经常会变化,随着用户的使用认知度的提高,对报表的要求越来越高,导致程序员不停的修改代码来实现,效率不高、结束遥遥无期。。。非常的痛苦;当然市面上有很多报表开发工具可以实现,但是针对小公司来说采购一套这样的系统的成本也非常的高,所以我们决定自己来开发一套像目前的润乾、FineReport 这样的报表设计器,来实现快速的报表设计制作。

   当初为了开发这样的系统,花费的了很长的时间学习查阅各种资料,其痛苦只有程序员才能体会,因为没有任何现成的实例代码可供参考,只有看别人的思路来一步步的摸索,本文将我们当初设计制作的报表设计器的功能分享出来,让有需要的或想开发报表设计的朋友们提供一个参考,尽量少走很动弯路,设计端可以直接使用,但是计算引擎和网页的计算的源码就不能分享出来了(请不要介意,因为涉及到公司的保密原因)

   记得当初为了制作报表设计器,在网上查找有没有相关的实例资料,找了很久,也是没有找到合适的,后来发现 SourceGrid 可以实现单元格的合并拆分功能,所以决定修改实现winform端的报表设计。下面我将制作的E_Report 报表控件抽取出来建立一个简易的Winform的可运行的实例提供给大伙下载,希望能给你的开发提供一点帮助和借鉴;当然你可以直接使用也可以,里面的设计功能基本全部能。

   抽取出来的源码包含:E_Report 报表设计自定义控件DLL源码;  EReportDemo 建立的简易Winform 端设计器使用DLL的实例源码;

  一、运行效果

    实例中,只做了一个简单的效果,工具栏的按钮在单元格右击属性中都有,只是放了几个常用的在工具导航栏中(右击单元格属性可以看到设计导航)

    可以进行单元格的合并、拆分、字体、颜色、背景、边框等的设置,朋友们可以自己编写保存发布等功能,实现报表的真实功能;

  

      例如单元格属性(其他还有很多的属性,自己下载源码后运行起来就能看到了)

    

       对表格的斜线、斜线文字有很好的支持;可以设置表头、表位、标题等 实际效果图如下

    

 

二、使用介绍

1、页面初始化的时候,通过 ReportDoc 类 初始报表的行列及单元格属性

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Drawing;
  5 using System.Windows.Forms;
  6 using System.Drawing.Drawing2D;
  7 using System.Xml;
  8 using System.Collections;
  9 using E_Report;
 10 
 11 namespace EReportDemo
 12 {
 13     /// <summary>
 14     /// 报表表格对象
 15     /// </summary>
 16     public class ReportDoc
 17     {
 18         #region 变量参数定义
 19 
 20         /// <summary>
 21         /// 表格对象
 22         /// </summary>
 23         private EReport _nowReport;
 24 
 25         /// <summary>
 26         /// 报表配置编码
 27         /// </summary>
 28         private string _reportCode = "";
 29 
 30         /// <summary>
 31         /// 表报设计状态
 32         /// </summary>
 33         private string _reportState = "";
 34 
 35         #endregion
 36 
 37         #region 函数构造方法
 38 
 39         /// <summary>
 40         /// 构造函数
 41         /// </summary>
 42         public ReportDoc()
 43         {
 44             this._nowReport = null;
 45             this._reportCode = "";
 46             this._reportState = "";
 47 
 48         }
 49 
 50 
 51         /// <summary>
 52         /// 获取--设置--表格对象
 53         /// </summary>
 54         public EReport NowReport
 55         {
 56             get { return this._nowReport; }
 57             set { this._nowReport = value; }
 58         }
 59 
 60         /// <summary>
 61         /// 报表配置编码
 62         /// </summary>
 63         public string ReportCode
 64         {
 65             get { return this._reportCode; }
 66             set { this._reportCode = value; }
 67         }
 68 
 69         /// <summary>
 70         /// 报表设计状态
 71         /// 新增、修改 两种状态
 72         /// </summary>
 73         public string ReportState
 74         {
 75             get { return this._reportState; }
 76             set { this._reportState = value; }
 77         }
 78 
 79         /// <summary>
 80         /// 资源释放
 81         /// </summary>
 82         ~ReportDoc()
 83         {
 84             this._nowReport = null;
 85             this._reportState = "";
 86 
 87         }
 88 
 89         #endregion
 90 
 91         #region 加载报表表格
 92 
 93         /// <summary>
 94         /// 初始化--报表表格
 95         /// </summary>
 96         public void InitReport()
 97         {
 98 
 99             int rCount = 41;  // 41行
100             int cCount = 20;  // 20列
101 
102             _nowReport.Redim(rCount, cCount);
103             _nowReport.FixedRows = 1;
104             _nowReport.FixedColumns = 1;
105 
106             InitCells();
107 
108         }
109 
110         /// <summary>
111         /// 初始化--单元格
112         /// </summary>
113         public void InitCells()
114         {
115             // 第一行 第一列
116             _nowReport.Rows[0].Height = 23;
117             _nowReport.Columns[0].Width = 50;
118 
119             // 设置00格
120             _nowReport[0, 0] = new E_Report.Cells.HeaderColumn("");
121 
122             //  设置行
123             for (int rr = 1; rr < _nowReport.RowsCount; rr++)
124             {
125                 string tmRowT = rr.ToString();
126                 _nowReport[rr, 0] = new E_Report.Cells.HeaderRow(tmRowT);
127             }
128 
129             //  设置列
130             for (int cc = 1; cc < _nowReport.ColumnsCount; cc++)
131             {
132                 _nowReport[0, cc] = new E_Report.Cells.HeaderColumn(_nowReport.GetColumnHeadTileChar(cc));
133             }
134 
135             // 设置单元格
136             for (int iRow = 1; iRow < _nowReport.RowsCount; iRow++)
137             {
138                 for (int iCol = 1; iCol < _nowReport.ColumnsCount; iCol++)
139                 {
140                     _nowReport[iRow, iCol] = new E_Report.Cells.Cell("", typeof(string));
141                 }
142             }
143 
144         }
145 
146 
147         #endregion
148 
149     }
150 }
View Code

2、工具导航栏 设置单元格相关属性

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Text;
  7 using System.Windows.Forms;
  8 using System.Collections;
  9 using E_Report;
 10 
 11 namespace EReportDemo
 12 {
 13     /// <summary>
 14     /// 本程序只是Winform端的报表设计功能
 15     /// 至于其他的功能,本实例没有提供
 16     /// 报表设计的设计效果:可以查看  www.sdpsoft.com  SDP软件快速开发平台 报表设计篇
 17     /// </summary>
 18 
 19     public partial class EReportMain : Form
 20     {
 21         private ReportDoc report;
 22         private E_Report.Cells.Controllers.PopupMenu myPopupMenu;
 23 
 24         public EReportMain()
 25         {
 26             InitializeComponent();
 27         }
 28 
 29         private void EReportMain_Load(object sender, EventArgs e)
 30         {
 31             Cursor.Current = Cursors.WaitCursor;
 32             gridMain.Rows.Clear();
 33             myPopupMenu = new E_Report.Cells.Controllers.PopupMenu(gridMain);
 34 
 35             report = new ReportDoc();
 36             report.NowReport = gridMain;
 37             report.InitReport();
 38             Cursor.Current = Cursors.Default;
 39         }
 40 
 41         private void gridMain_MouseMove(object sender, MouseEventArgs e)
 42         {
 43             this.lbl_X.Text = e.X.ToString();
 44             this.lbl_Y.Text = e.Y.ToString();
 45         }
 46 
 47         /// <summary>
 48         /// 工具栏报表单元格事件
 49         /// </summary>
 50         /// <param name="sender"></param>
 51         /// <param name="e"></param>
 52         private void btn_GridTools_Click(object sender, EventArgs e)
 53         {
 54             string sType = ((Button)sender).Tag.ToString().Trim().ToLower();
 55             switch (sType)
 56             {
 57 
 58                 case "cellproperty":  // 单元格属性设置
 59                     myPopupMenu.CellProperty_Click(sender, e);
 60                     break;
 61                 case "fontset":       // 单元格字体设置
 62                     myPopupMenu.CellFont_Click(sender, e);
 63                     break;
 64                 case "fontcolor":     // 文本字体颜色
 65                     myPopupMenu.CellForColor_Click(sender, e);
 66                     break;
 67                 case "backcolor":     // 单元格背景色
 68                     myPopupMenu.CellBackColor_Click(sender, e);
 69                     break;
 70                 case "cellborder":   // 单元格边框设置
 71                     myPopupMenu.CellBorder_Click(sender, e);
 72                     break;
 73                 case "lock":         // 设置表格只读
 74                     myPopupMenu.LockReport_Click(sender, e);
 75                     break;
 76                 case "unlock":       // 设置表格编辑
 77                     myPopupMenu.UnLockReport_Click(sender, e);
 78                     break;
 79                 case "alignleft":    // 水平居左对齐
 80                     myPopupMenu.AlignLeft_Click(sender, e);
 81                     break;
 82                 case "aligncenter":  // 水平居中对齐
 83                     myPopupMenu.AlignCenter_Click(sender, e);
 84                     break;
 85                 case "alignright":   // 水平居右对齐
 86                     myPopupMenu.AlignRight_Click(sender, e);
 87                     break;
 88                 case "aligntop":     // 垂直居上对齐
 89                     myPopupMenu.AlignTop_Click(sender, e);
 90                     break;
 91                 case "alignmiddle":  // 垂直居中对齐
 92                     myPopupMenu.AlignMiddle_Click(sender, e);
 93                     break;
 94                 case "alignbottom":  // 垂直居下对齐
 95                     myPopupMenu.AlignBottom_Click(sender, e);
 96                     break;
 97                 case "addindent":    // 增加文本缩进
 98                     myPopupMenu.AddIndent_Click(sender, e);
 99                     break;
100                 case "delindent":    // 清除文本缩进
101                     myPopupMenu.RemoveIndent_Click(sender, e);
102                     break;
103                 case "insertrow":    // 插入后一行
104                     myPopupMenu.InsertRow_Click(sender, e);
105                     break;
106                 case "appendrow":    // 表格追加行
107                     myPopupMenu.AddRow_Click(sender, e);
108                     break;
109                 case "delrow":       // 删除选中行
110                     myPopupMenu.DeleteRows_Click(sender, e);
111                     break;
112                 case "hiderow":      // 隐藏选中行
113                     myPopupMenu.HideSelectRows_Click(sender, e);
114                     break;
115                 case "showrow":      // 显示选中行
116                     myPopupMenu.ShowSelectRows_Click(sender, e);
117                     break;
118                 case "showallrow":   // 显示所有行
119                     myPopupMenu.ShowAllRows_Click(sender, e);
120                     break;
121                 case "insertcol":    // 插入左侧列
122                     myPopupMenu.InsertColumn_Click(sender, e);
123                     break;
124                 case "addcol":       // 插入右侧列
125                     myPopupMenu.AddColumn_Click(sender, e);
126                     break;
127                 case "delcol":       // 删除选中列
128                     myPopupMenu.DeleteColumns_Click(sender, e);
129                     break;
130                 case "hidecol":      // 隐藏选中列
131                     myPopupMenu.HideSelectColumns_Click(sender, e);
132                     break;
133                 case "showcol":      // 显示选中列
134                     myPopupMenu.ShowSelectColumns_Click(sender, e);
135                     break;
136                 case "showallcol":   // 显示所有列
137                     myPopupMenu.ShowAllColumns_Click(sender, e);
138                     break;
139                 case "mergecell":    // 合并单元格
140                     myPopupMenu.MergeCell_Click(sender, e);
141                     break;
142                 case "splitcell":    // 拆分单元格
143                     myPopupMenu.SplitCell_Click(sender, e);
144                     break;
145             }
146         }
147     }
148 }
View Code

3、报表控件DLL类库部分

    里面有我们自定义的 条码控件、图片控件、图表控件

  表格内自定义图表控件(曲线、柱状、饼状)源码

   1 using System;
   2 using System.Collections.Generic;
   3 using System.Text;
   4 using System.Drawing;
   5 using System.Drawing.Drawing2D;
   6 using System.Drawing.Text;
   7 
   8 namespace E_Report
   9 {
  10     /// <summary>
  11     /// 图表属性
  12     /// </summary>
  13     /// <summary>
  14     /// 报表图表类库
  15     /// </summary>
  16     public class EChart
  17     {
  18         #region 属性方法
  19 
  20         #region 临时变量
  21 
  22         /// <summary>
  23         /// 临时变量--关联单元格行号
  24         /// </summary>
  25         private int _row = 0;
  26 
  27         /// <summary>
  28         /// 获取--设置--关联单元格行号
  29         /// </summary>
  30         public int Row
  31         {
  32             get { return _row; }
  33             set { _row = value; }
  34         }
  35 
  36         /// <summary>
  37         /// 临时变量--关联单元格列号
  38         /// </summary>
  39         private int _col = 0;
  40 
以上是关于C# 报表设计器 (winform 设计端)开发与实现生成网页的HTML报表的主要内容,如果未能解决你的问题,请参考以下文章

C# 报表设计器 (winform 设计端)开发与实现生成网页的HTML报表 开放源码及调试

winform 中crystalReport报表1对多设计

C# Winform 设计器 !!

C# winform 设计 如何相对居中

相对传统桌面设计器,在线报表设计器价值何在?

在C#中,设计grid++report报表的具体步骤是啥??帮助文档感觉好乱,自己没有基础,求具体步骤