动态报表Word文件下载.docx
《动态报表Word文件下载.docx》由会员分享,可在线阅读,更多相关《动态报表Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
就是页眉上不再显示标头了,为什么这样做,下面会讲到。
3:
然后,来改造我们的核心方法
每个表的数据在写入前,先写一行列标题。
这个标题,也替代了我们之前的页眉标题。
并且每一行数据的第一列,也就是f0,写入表名。
1
class
clsDyCrystalReportCore
2
{
3
///
<
summary>
4
将传入的datatable转换成报表模板所需要的datatable
5
数据全部转换为string
6
/summary>
7
param
name="
dt"
>
来源表<
/param>
8
tblName"
各单表名称<
9
fldsName"
字段名称,以半角逗号分隔。
10
returns>
报表模板所需要的datatable<
/returns>
11
12
public
DataTable
dtx(DataTable
dt,String
tblName,String
fldsName)
13
14
15
String
oneRow="
"
;
16
DataSet1.BigTatableDataTable
dtx1
=
new
DataSet1.BigTatableDataTable();
17
18
object[]
obj
object[dt.Columns.Count];
19
//特别注意:
所选择的表的列的数目需<
=Bigtable的字段数目
20
//请自行填写保护代码
21
22
//先列名称写到每个表的第一行
23
dtx1.Rows.Add(dtx1.NewRow());
24
//第一行的第一列写表的名称
25
dtx1.Rows[0][0]
tblName;
26
//切割列名称字符串,写入第一行后面的位置
27
for
(int
i
0;
fldsName.Split(new
char[]
{
'
'
}).Length;
i++)
28
29
30
dtx1.Rows[0][i+1]
{'
})[i];
31
}
32
33
//写入数据
34
dt.Rows.Count
35
36
37
38
//每一行的第一列,也就是f0,写入表名称。
39
dtx1.Rows[i+1][0]
40
//写数据
41
j
dt.Columns.Count
j++)
42
43
oneRow
+
"
dt.Rows[i][j].ToString();
44
if
(dt.Rows[i][j].ToString()=="
)
45
dtx1.Rows[i+1][j+1]
46
else
47
48
49
50
51
return
dtx1;
52
53
4:
好了,来看我们的前端代码。
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Text;
System.Windows.Forms;
CrystalDecisions.Shared;
CrystalDecisions.CrystalReports.Engine;
CrystalDecisions.Windows.Forms;
System.Data.OleDb;
namespace
DyCrystalReportDemo
partial
Form1
:
Form
Form1()
InitializeComponent();
private
void
button1_Click(object
sender,
EventArgs
e)
connstr
Provider=Microsoft.Jet.OLEDB.4.0;
Data
Source="
System.Threading.Thread.GetDomain().BaseDirectory+
bbtcrall.mdb"
//打开数据库连接
OleDbConnection
cn
OleDbConnection(connstr);
dtxAll
DataTable();
//容纳所有数据
OleDbDataAdapter
da
OleDbDataAdapter();
clsDyCrystalReportCore
xCore
clsDyCrystalReportCore();
//注意各表的字段数目不能大于我们设定的最大数目!
//请自行添加错误保护和对象释放代码
//第1个表
dt1
OleDbDataAdapter("
SELECT
*
From
Test1_1"
cn);
da.Fill(dt1);
xCore.dtx(dt1,"
表1"
编号,姓名,发信日期,其他"
);
dtxAll.Merge(dtx1);
//第2个表,注意,这个表可以从不同的数据源获取!
//重新初始化
Test1_2"
xCore.dtx(dt1,
表2"
编号,姓名,入职日期,日期1,日期2"
//第3个表,注意,这个表可以从不同的数据源获取!
54
55
56
57
Test_4"
58
59
表3"
年份,地区,指标,最大值,最小值"
60
61
62
63
ReportDocument
myReport
ReportDocument();
64
string
reportPath
System.Threading.Thread.GetDomain().BaseDirectory
crystalreport1.rpt"
65
myReport.Load(reportPath);
66
67
//绑定数据集
68
69
myReport.SetDataSource(dtxAll);
70
71
crystalReportViewer1.ReportSource
myReport;
72
crystalReportViewer1.RefreshReport();
73
74
75
76
77
注意,我们用了
将所有的数据合并在一个datatable里,从而达到我们开始设定的目标。
5:
执行一下,是如下效果,有点乱,是吧?
6:
这个时候f0就派上用场啦,在模板上增加一个f0的组,如下图所示。
7:
运行起来,帅多了吧?
格子有点难看,这个就不再本文中讨论了。
以后专门讲讲这个画格子的问题。