使用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导出方法,欢迎交流

posted @ 2012-07-25 11:27  CrazyJinn  阅读(2435)  评论(6编辑  收藏  举报