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

你可能感兴趣的:(pdf)