最近在公司分配的任務是做報表的PDF導出,是使用RDLC作為模版來導出PDF;折騰了快一個星期,終於弄好了,開心之余覺得網上對於RDLC應用的相關資料還是挺少的,於是就寫了這篇,希望與大家分享
在這里我假定讀者已經具備了對於RDLC文件操作的基本知識,如不懂,請谷歌
環境是VS2008,可能XML的某些節點名會和VS2010的有出入
大體想要的導出效果如下圖(為了避免不必要的麻煩,馬賽克了敏感信息)
為了實現這種列重復的效果,不能使用Table控件,而要使用List控件,然后在List控件中一個個添加TextBox來顯示數據
設置數據源:
之前網上寫的拖拽式設置數據源的方法並不是很好,我更希望手動設置數據源,代碼如下

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格式打開文件,添加如下代碼

<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導出方法,歡迎交流