使用RDLC作为模板导出PDF
最近在公司分配的任务是做报表的PDF导出,是使用RDLC作为模版来导出PDF;折腾了快一个星期,终于弄好了,开心之余觉得网上对于RDLC应用的相关资料还是挺少的,于是就写了这篇,希望与大家分享
在这里我假定读者已经具备了对于RDLC文件操作的基本知识,如不懂,请谷歌
环境是VS2008,可能XML的某些节点名会和VS2010的有出入
大体想要的导出效果如下图(为了避免不必要的麻烦,马赛克了敏感信息)
为了实现这种列重复的效果,不能使用Table控件,而要使用List控件,然后在List控件中一个个添加TextBox来显示数据
设置数据源:
之前网上写的拖拽式设置数据源的方法并不是很好,我更希望手动设置数据源,代码如下
View Code
DataTable dt = new DataTable(); dt.Columns.Add("Race"); dt.Columns.Add("Candidate"); dt.Columns.Add("VoteNumber"); dt.Columns.Add("VotePercent"); List<EMS_EleVoteResultDetailInfo> voteList = BLLClasses.EMS_EleVoteResultDetail.GetCityCandidateResultByContestID(electionID, contestID);//从数据库中读取数据 ArrayList a = new ArrayList(); foreach (var item in voteList) { DataRow dr = dt.NewRow(); dr["Candidate"] = item.BallotFirstName + " " + item.BallotLastName; if (item.CandidateEleStatus == CandidateElectionStatus.Acclaimed) { dr["VoteNumber"] = Utility.GetEnumAlert(CandidateElectionStatus.Acclaimed); dr["VotePercent"] = Utility.GetEnumAlert(CandidateElectionStatus.Acclaimed); } else { dr["VoteNumber"] = item.FormatVoteReceived; dr["VotePercent"] = item.VotePrecinct + "%"; } dt.Rows.Add(dr); } ReportViewer ReportViewer1 = new ReportViewer(); ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Jinn", dt));
设置好之后还要去配置RDLC文件的数据源。因为RDLC是XML格式的,所以以XML格式打开文件,添加如下代码
View Code
<DataSources> <DataSource Name="DummyDataSource"> <rd:DataSourceID>fa7953f5-6ad6-41d7-82d4-d11193f55196</rd:DataSourceID> <ConnectionProperties> <DataProvider>SQL</DataProvider> <ConnectString /> </ConnectionProperties> </DataSource> </DataSources> <DataSets> <DataSet Name="Jinn"> <Fields> <Field Name="Race"> <DataField>Race</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="Candidate"> <DataField>Candidate</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="VoteNumber"> <DataField>VoteNumber</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> <Field Name="VotePercent"> <DataField>VotePercent</DataField> <rd:TypeName>System.String</rd:TypeName> </Field> </Fields> <Query> <DataSourceName>DummyDataSource</DataSourceName> <CommandText /> <rd:UseGenericDesigner>true</rd:UseGenericDesigner> </Query> </DataSet> </DataSets>
根据条件判断是否可见:
有的时候Ward Number那一列是要不显示的,要设置按条件隐藏。
对着某个TextBox右键,Properties,Visibility,Expression
=IIf(Fields!Ward.Value="",True,False)
模拟CheckBox显示:
1、一个TextBox,调整大小,设置显示边框,设置数据源的时候做一个判断,if true则传一个“√”过去
2、两张图片,数据源传一个值过去,判断真则显示有勾的,假显示没勾的
还是推荐第一种方法
这样就基本大功告成了。其实主要的步骤是配置数据源,其他都没什么难度
在下一篇文章里面我将介绍我是如何动态添加/删除一列的,这玩意才是真心麻烦
PS:不知道有没有更好的PDF导出方法,欢迎交流
/*=============================================================*/
作者:CrazyJinn
本文版权归作者和博客园共有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
如果看完这篇文章让您有所收获,请点击右下角"推荐".
如果这篇文章让您觉得不知所云,或者通篇谬误,请点击右下角"反对".并且欢迎您留言给我提出宝贵的意见.
如果您想获知我最新的动态,可以在绿色通道中点击"关注我".
/*=============================================================*/