rdlc r语言 调用自定义函数数 是什么语言

如何写类似RDLC自带函数的函数
[问题点数:40分]
如何写类似RDLC自带函数的函数
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。随笔 - 96&
文章 - 17&评论 - 18&trackbacks - 3
'RDLC自定义函数&数字转人民币大写(金额)&目前只支持到亿,解决零角问题Function&CNMoney(ByVal&Money&As&String,&Optional&ByVal&YB&As&Boolean&=&True)&As&String&&&&&&&&Dim&X,&Y&As&String&&&&&&&&Dim&I&As&Integer&&&&&&&&Const&Zimu&=&".sbqwsbqysbqwsbq"&''定义位置代码&&&&&&&&Const&Letter&=&"<span style="color: #sbqwy.zjf"&''定义汉字缩写&&&&&&&&Const&Upcase&=&"零壹贰叁肆伍陆柒捌玖拾佰仟万亿圆整角分"&'定义大写汉字&&&&&&&&Dim&Temp&As&String&&&&&&&&Try&&&&&&&&&&&&Temp&=&Convert.ToString(Format(Convert.ToDouble(Money),&"<span style="color: #.00"))&&&&&&&&Catch&ex&As&Exception&&&&&&&&&&&&Throw&New&NotSupportedException("数据给出错误(非数字格式)!")&&&&&&&&&&&&CNMoney&=&"Error."&&&&&&&&&&&&Exit&Function&&&&&&&&End&Try&&&&&&&&If&Len(Temp)&&&<span style="color: #&Then&&&&&&&&&&&&Throw&New&NotSupportedException("数据太大,无法计算(超亿位无法计算)!")&&&&&&&&&&&&CNMoney&=&"Error."&&&&&&&&&&&&Exit&Function&&&&&&&&End&If&&&&&&&&If&InStr(Temp,&".")&&&<span style="color: #&Then&Temp&=&Left(Temp,&InStr(Temp,&".")&-&<span style="color: #)&&&&&&&&X&=&Format(Convert.ToDouble(Money),&"<span style="color: #.00")&'格式化货币&&&&&&&&Y&=&""&&&&&&&&For&I&=&<span style="color: #&To&Len(X)&-&<span style="color: #&&&&&&&&&&&&Y&=&Y&&&Mid(X,&I,&<span style="color: #)&&&Mid(Zimu,&Len(X)&-&<span style="color: #&-&I,&<span style="color: #)&&&&&&&&Next&&&&&&&&If&Right(X,&<span style="color: #)&=&".00"&Then&&&&&&&&&&&&Y&=&Y&&&"z"&''***元整&&&&&&&&Else&&&&&&&&&&&&If&Right(X,&<span style="color: #)&=&"<span style="color: #"&Then&&&&&&&&&&&&&&&&Y&=&Y&&&Left(Right(X,&<span style="color: #),&<span style="color: #)&&&"j"&&&"z"&'*元*角*整&&&&&&&&&&&&Else&&&&&&&&&&&&&&&&Y&=&Y&&&Left(Right(X,&<span style="color: #),&<span style="color: #)&&&"j"&&&Right(X,&<span style="color: #)&&&"f"&''*元*角*分&&&&&&&&&&&&End&If&&&&&&&&End&If&&&&&&&&Y&=&Replace(Y,&"<span style="color: #q",&"<span style="color: #")&''避免零千(如:40200肆萬零千零贰佰)&&&&&&&&Y&=&Replace(Y,&"<span style="color: #b",&"<span style="color: #")&''避免零百(如:41000肆萬壹千零佰)&&&&&&&&Y&=&Replace(Y,&"<span style="color: #s",&"<span style="color: #")&''避免零十(如:204贰佰零拾零肆)&&&&&&&&Do&While&Y&&&&Replace(Y,&"<span style="color: #",&"<span style="color: #")&&&&&&&&&&&&Y&=&Replace(Y,&"<span style="color: #",&"<span style="color: #")&''避免双零(如:1004壹仟零零肆)&&&&&&&&Loop&&&&&&&&Y&=&Replace(Y,&"<span style="color: #y",&"y")&''避免零億(如:210億&贰佰壹十零億)&&&&&&&&If&Val(Mid(Right(Temp,&<span style="color: #),&<span style="color: #,&<span style="color: #))&&&<span style="color: #&Then&&&&&&&&&&&&Y&=&Replace(Y,&"<span style="color: #w",&"w0")&''避免无零千(如:<span style="color: #2000&拾万贰仟),应该是拾万零贰仟&&&&&&&&Else&&&&&&&&&&&&Y&=&Replace(Y,&"<span style="color: #w",&"w")&''避免零萬(如:210萬&贰佰壹十零萬)&&&&&&&&End&If&&&&&&&&'Y&=&IIf(Len(X)&=&5&And&Left(Y,&1)&=&"1",&Right(Y,&Len(Y)&-&1),&Y)&''避免壹十(如:14壹拾肆;10壹拾)&&&&&&&&Y&=&IIf(Len(X)&=&<span style="color: #,&Replace(Y,&"<span style="color: #.",&""),&Replace(Y,&"<span style="color: #.",&"."))&''避免零元(如:<span style="color: #.00贰拾零圆;<span style="color: #.12零圆壹角贰分)&&&&&&&&If&Len(Temp)&&=&<span style="color: #&Then&'加&&&&&&&&&&&&Y&=&Replace(Y,&"yw",&"y")&'避免亿万元 如 ,壹亿万元 应该是壹亿元&&&&&&&&End&If&'加&&&&&&&&For&I&=&<span style="color: #&To&<span style="color: #&&&&&&&&&&&&Y&=&Replace(Y,&Mid(Letter,&I,&<span style="color: #),&Mid(Upcase,&I,&<span style="color: #))&''大写汉字&&&&&&&&Next&&&&&&&&Y&=&Y.Replace("零角",&"零")&&&&&&&&If&YB&=&False&Then&&&&&&&&&&&&Y&=&Y.Replace("圆整",&"")&&&&&&&&End&If&&&&&&&&&&&&&&&&CNMoney&=&Y&&&&End&Function
&&&&调用&=Money(<span style="color: #2.3534)&&&&测试结果:<span style="color: #09.50&壹仟肆佰零玖圆伍角整<span style="color: #07.14&陆仟零柒圆壹角肆分<span style="color: #80.32&壹仟陆佰捌拾圆叁角贰分<span style="color: #7000.53壹拾万零柒仟圆伍角叁分<span style="color: #409.02壹万陆仟肆佰零玖圆零贰分<span style="color: #5.04&叁佰贰拾伍圆零肆分<span style="color: #0100001.40玖亿零壹拾万零壹圆肆角整
本文是从网上找的,稍微改动了一点,如有问题,留言。
如有更好的办法,请描述,谢谢。
下面的这段代码有点问题,等有时间在改动:
代码二:Function&CNMoney(num&As&String)&As&String&&&&&If&IsNumeric(num)&=&False&Or&num&=&""&Then&&&&&&&&&CNMoney=&num&&&&&&&&&Exit&Function&&&&&End&If&&&&&Dim&s1,&s2,&sin,&resultStr,&nAmount&As&String&&&&&s1&=&"零壹贰叁肆伍陆柒捌玖"&&&&&s2&=&"亿仟佰拾万仟佰拾亿仟佰拾万仟佰拾元角分"&&&&&&&&&&nAmount&=&Trim(Str(Val(num)&*&<span style="color: #0))&&&&&Dim&numLength&As&Integer&&&&&numLength&=&Len(Trim(Str(nAmount)))&&&&&&Dim&useStr&As&String&&&&&useStr&=&Mid(s2,&(Len(s2)&-&numLength&+&<span style="color: #),&numLength)&&&&&&&&&&Dim&zeroCounter,&flag&As&Integer&&&&&zeroCounter&=&<span style="color: #&&&&&flag&=&<span style="color: #&&&&&&&&&&Do&While&flag&&&Len(nAmount)&&&&&&&&&flag&=&flag&+&<span style="color: #&&&&&&&&&Dim&cnNum&As&String&&&&&&&&&cnNum&=&Mid(nAmount,&flag,&<span style="color: #)&&&&&&&&&cnNum&=&Mid(s1,&Val(cnNum)&+&<span style="color: #,&<span style="color: #)&&&&&&&&&sin&=&Mid(useStr,&flag,&<span style="color: #)&&&&&&&&&If&cnNum&=&"零"&Then&&&&&&&&&&&&&cnNum&=&""&&&&&&&&&&&&&If&sin&=&"亿"&Or&sin&=&"元"&Then&&&&&&&&&&&&&&&&&&&&&&ElseIf&sin&=&"万"&Then&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&If&Mid(resultStr,&Len(resultStr),&<span style="color: #)&=&"亿"&Then&&&&&&&&&&&&&&&&&&&&&sin&=&""&&&&&&&&&&&&&&&&&End&If&&&&&&&&&&&&&Else&&&&&&&&&&&&&&&&&sin&=&""&&&&&&&&&&&&&End&If&&&&&&&&&&&&&zeroCounter&=&zeroCounter&+&<span style="color: #&&&&&&&&&Else&&&&&&&&&&&&&If&zeroCounter&&&<span style="color: #&Then&&&&&&&&&&&&&&&&&cnNum&=&"零"&+&Trim(cnNum)&&&&&&&&&&&&&&&&&zeroCounter&=&<span style="color: #&&&&&&&&&&&&&End&If&&&&&&&&&End&If&&&&&&&&&&&&&&&&&&resultStr&=&Trim(resultStr)&+&Trim(cnNum)&+&Trim(sin)&&&&&Loop&&&&&&&&&&If&Mid(nAmount,&Len(nAmount),&<span style="color: #)&=&"<span style="color: #"&Then&&&&&&&&&CNMoney=&resultStr&+&"整"&&&&&Else&&&&&&&&&CNMoney=&resultStr&&&&&End&If&End&Function问题如下:<span style="color: #7000.53壹拾万零柒仟元零伍角叁分下面的两种写法是正确的:&&&&&&&&&壹拾万零柒仟元伍角叁分&&&&壹拾万柒仟元零伍角叁分
阅读(...) 评论()RDLC后台自定义报表模板 - 博客频道 - CSDN.NET
我们只用技术说话
眼界决定境界,定位决定地位
分类:ASP.NET
首先封装一个公共类,统一来操作RDLC报表
using System.Collections.G
using System.L
using System.W
using System.X
using System.D
using Microsoft.Reporting.WebF
using System.T
using System.C
using System.IO;
using System.R
using System.Xml.S
namespace WebApplication3
public class DynamicReport : IDynamicReport
#region 空白文档
/// &summary&
/// 空白文档的xml文件
/// &/summary&
protected string _docTemplate =
&&?xml version=\&1.0\& encoding=\&utf-8\&?&&Report xmlns:rd=\&/SQLServer/reporting/reportdesigner\& xmlns=\&/sqlserver/reporting/2008/01/reportdefinition\&&& +
&&DataSources&& +
&DataSource Name=\&DummyDataSource\&&& +
&ConnectionProperties&& +
&DataProvider&SQL&/DataProvider&& +
&ConnectString /&& +
&/ConnectionProperties&& +
&rd:DataSourceID&3eecdab9-6b4b-4836-ad62-95e4aee65ea8&/rd:DataSourceID&& +
&/DataSource&& +
&&/DataSources&& +
&&DataSets&@DataSets&/DataSets&& +
&&Body&& +
&&ReportItems&@Title@Tablix& +
&&/ReportItems&& +
&&Style /&& +
&&Height&8cm&/Height&& +
&&/Body&& +
&&Width&17cm&/Width&& +
&&Page&& +
&&PageHeight&29.7cm&/PageHeight&& +
&&PageWidth&21cm&/PageWidth&& +
&&LeftMargin&1.8cm&/LeftMargin&& +
&&RightMargin&1.8cm&/RightMargin&& +
&&TopMargin&1.8cm&/TopMargin&& +
&&BottomMargin&1.8cm&/BottomMargin&& +
&&ColumnSpacing&0.13cm&/ColumnSpacing&& +
&&Style /&& +
&&/Page&& +
&&rd:ReportID&809f16cf-ea78-4469-bf43-965c4afe69d0&/rd:ReportID&& +
&&rd:ReportUnitType&Cm&/rd:ReportUnitType&& +
&&/Report&&;
protected string TitlePattern =
& &Textbox Name=\&Textbo@TextboxName\&& &
+ @&&CanGrow&true&/CanGrow&
&KeepTogether&true&/KeepTogether&
&Paragraphs&
&Paragraph&
&TextRuns&
&Value&@Title&/Value&
&Style&@FontStyle&/Style&
&/TextRun&
&/TextRuns&
&Style&@Style&/Style&
&/Paragraph&
&/Paragraphs&
&rd:DefaultName&Textbo@TextboxName&/rd:DefaultName&
&Top&@TopPositioncm&/Top&
&Left&1cm&/Left&
&Height&0.83813cm&/Height&
&Width&14.35207cm&/Width&
&ZIndex&1&/ZIndex&
&Style&None&/Style&
&PaddingLeft&2pt&/PaddingLeft&
&PaddingRight&2pt&/PaddingRight&
&PaddingTop&2pt&/PaddingTop&
&PaddingBottom&2pt&/PaddingBottom&
&/Textbox&&;
#endregion
private ReportViewer _
private List&ReportColoumStyle& _coloumStyle = new List&ReportColoumStyle&();
private List&ReportItemPattern& _reportItemPatterns = new List&ReportItemPattern&();
private List&string& _reportTitlePatterns = new List&string&();
private List&ReportItemPattern& _reportHeadPatterns = new List&ReportItemPattern&();
internal const float ColoumWidth = 1.6F; //行宽
public ReportType ReportType { }
public DynamicReport()
/// &summary&
/// 从现有报表中加载报表并进行修改
/// &/summary&
/// &param name=&url&&&/param&
public void LoadReport(string url)
_docTemplate = File.ReadAllText(url);
catch (Exception ex)
public void SetReport(ReportViewer reportViewer)
this._report = reportV
public void SetColoumStyle(List&ReportColoumStyle& coloumStyle)
this._coloumStyle = coloumS
public void AddText(string text)
if (!string.IsNullOrEmpty(text))
var pos = CaculatePlacePostion();
var titlePattern = TitlePattern
.Replace(&@Title&, text)
.Replace(&@TopPosition&, pos.ToString())
.Replace(&@TextboxName&, _reportTitlePatterns.Count.ToString())
.Replace(&@FontStyle&, &&FontFamily&微软雅黑&/FontFamily&&FontSize&12pt&/FontSize&&)
.Replace(&@Style&, &&TextAlign&Center&/TextAlign&&);
_reportTitlePatterns.Add(titlePattern);
public void AddText(string text, int chapterGrade)
if (!string.IsNullOrEmpty(text))
var pos = CaculatePlacePostion();
var titlePattern = TitlePattern
.Replace(&@Title&, text)
.Replace(&@TopPosition&, pos.ToString())
.Replace(&@TextboxName&, _reportTitlePatterns.Count.ToString());
switch (chapterGrade)
titlePattern = titlePattern.Replace(&@FontStyle&,
&&FontFamily&宋体&/FontFamily&&FontSize&18pt&/FontSize&&Color&#000000&/Color&&)
.Replace(&@Style&, &&TextAlign&Center&/TextAlign&&);
titlePattern = titlePattern.Replace(&@FontStyle&,
&&FontFamily&黑体&/FontFamily&&FontSize&14pt&/FontSize&&Color&#000000&/Color&&)
.Replace(&@Style&, &&TextAlign&Left&/TextAlign&&);
titlePattern = titlePattern.Replace(&@FontStyle&,
&&FontFamily&宋体&/FontFamily&&FontSize&12pt&/FontSize&&FontWeight&Bold&/FontWeight&&)
.Replace(&@Style&, &&TextAlign&Left&/TextAlign&&);
titlePattern = titlePattern.Replace(&@FontStyle&,
&&FontFamily&宋体&/FontFamily&&FontSize&12pt&/FontSize&&)
.Replace(&@Style&, &&LineHeight&22pt&/LineHeight&&);
_reportTitlePatterns.Add(titlePattern);
public void AddData&T&(IEnumerable&T& data)
if (data.Count() != 0)
var properites = typeof(T).GetProperties(); //得到实体类属性的集合
AddReportItemPattern(properites.Select(p =& p.Name).ToArray(), data);
public void AddData(DataTable dataTable)
if (dataTable != null)
var coloumNames = new List&string&();
foreach (DataColumn dataColumn in dataTable.Columns)
var protertyName = dataColumn.ColumnN
coloumNames.Add(protertyName);
AddReportItemPattern(coloumNames.ToArray(), dataTable);
/// &summary&
/// 计算开始摆放的位置
/// &/summary&
/// &returns&&/returns&
protected float CaculatePlacePostion()
//每个标题的高度
float titleCount = _reportTitlePatterns.Count * 1f;
//每个数据表的高度
float itemCount = _reportItemPatterns.Count * 2f;
// 每个空表头的高度
float emptyItemCount = _reportHeadPatterns.Count * 0.5f;
switch (ReportType)
case ReportType.Tables:
return titleCount + itemCount + emptyItemCount + 0.5f;
case ReportType.Chart:
case ReportType.Finally:
return titleCount + itemCount + emptyItemCount + 25.7f;
return 0f;
/// &summary&
/// 增加一个报表
/// &/summary&
/// &param name=&coloumNames&&&/param&
/// &param name=&data&&&/param&
/// &param name=&dataType&&&/param&
protected void AddReportItemPattern(string[] coloumNames, dynamic data)
var fields = new StringBuilder();
var coloums = new StringBuilder();
var tablixHearders = new StringBuilder();
var tablixCells = new StringBuilder();
var tablixMembers = new StringBuilder();
var currentNamePrefix = _reportItemPatterns.Count + _reportHeadPatterns.Count + 1;
var tableWidth = 0F;
var dataRows = GetDataRowsCount(data); //数据行数
foreach (var coloumName in coloumNames)
var coloumWidth = ColoumW
var textAlign = TextAlign.R
var reportColoumStyle = _coloumStyle.FirstOrDefault(r =& r.ColoumName == coloumName);
if (reportColoumStyle != null)
textAlign = reportColoumStyle.TextA
coloumWidth = reportColoumStyle.ColoumW
tableWidth += coloumW
var bottomBorder = string.E //每个单元格底部border
if (dataRows == 0)
bottomBorder = &&BottomBorder&&Style&None&/Style&&/BottomBorder&&;
var coloumValue = coloumN
//例外,如果coloumName包含Coloum之类的字段,则将value设成空
if (coloumName.IndexOf(&Column&, System.StringComparison.Ordinal) & -1)
coloumValue = & &;
fields.AppendFormat(
&&Field Name=\&{0}\&&&DataField&{0}&/DataField&&rd:TypeName&System.String&/rd:TypeName&&/Field&&,
coloumName);
coloums.AppendFormat(&&TablixColumn&&Width&{0}cm&/Width&&/TablixColumn&&, coloumWidth);
tablixHearders.AppendFormat(&&TablixCell&&CellContents&& +
&&Textbox Name=\&Textbox{0}{1}\&&&CanGrow&true&/CanGrow&&KeepTogether&true&/KeepTogether&&Paragraphs&&Paragraph&& +
&&TextRuns&&TextRun&&Value&{2}&/Value&&Style /&&/TextRun&&/TextRuns&&Style&&TextAlign&Center&/TextAlign&&/Style&&/Paragraph&&/Paragraphs&& +
&&rd:DefaultName&Textbox{0}{1}&/rd:DefaultName&&Style&&Border&&Color&LightGrey&/Color&&Style&Solid&/Style&&/Border&{3}& +
&&PaddingLeft&2pt&/PaddingLeft&&PaddingRight&2pt&/PaddingRight&&PaddingTop&2pt&/PaddingTop&&PaddingBottom&2pt&/PaddingBottom&&/Style&&/Textbox&&/CellContents&&/TablixCell&&,
coloumName, currentNamePrefix, coloumValue, bottomBorder);
tablixCells.AppendFormat(
&&TablixCell&&CellContents&&Textbox Name=\&{0}{1}1\&&&CanGrow&true&/CanGrow&&KeepTogether&true&/KeepTogether&& +
&&Paragraphs&&Paragraph&&TextRuns&&TextRun&&Value&=Fields!{0}.Value&/Value&&Style /&&/TextRun&&/TextRuns&&Style&&TextAlign&{2}&/TextAlign&&/Style&&/Paragraph&&/Paragraphs&& +
&&rd:DefaultName&{0}{1}1&/rd:DefaultName&&Style&&Border&&Color&LightGrey&/Color&&Style&Solid&/Style&&/Border&& +
&&PaddingLeft&2pt&/PaddingLeft&&PaddingRight&2pt&/PaddingRight&&PaddingTop&2pt&/PaddingTop&&PaddingBottom&2pt&/PaddingBottom&&/Style&&/Textbox&&/CellContents&&/TablixCell&&,
coloumName, currentNamePrefix, textAlign);
tablixMembers.AppendFormat(&&TablixMember /&&);
//计算表格应该离左边多少距离
var leftPosition = 0F;
if (tableWidth & 17)
leftPosition = (17F - tableWidth) / 2;
var dataSetName = string.Format(&Data{0}&, _reportItemPatterns.Count + _reportHeadPatterns.Count + 1);
var reportItemPattern = new ReportItemPattern();
reportItemPattern.Data = DynamicReportExtension.RemoveZeroData(data);
reportItemPattern.DataSetName = dataSetN
reportItemPattern.DataSetString =
reportItemPattern.DataSetPattern
.Replace(&@DataSetName&, dataSetName)
.Replace(&@Fields&, fields.ToString());
reportItemPattern.TablixString =
reportItemPattern.TablixPattern
.Replace(&@DataSetName&, dataSetName)
.Replace(&@TablixColumns&, coloums.ToString())
.Replace(&@TablixHeader&, tablixHearders.ToString())
.Replace(&@TablixCells&, tablixCells.ToString())
.Replace(&@TablixMember&, tablixMembers.ToString())
.Replace(&@TopPosition&, CaculatePlacePostion().ToString())
.Replace(&@LeftPostion&, leftPosition.ToString());
//读取行数,如果是空行就加到新的
if (dataRows == 0)
_reportHeadPatterns.Add(reportItemPattern);
_reportItemPatterns.Add(reportItemPattern);
/// &summary&
/// 得到某种类型数据的数量
/// &/summary&
/// &param name=&data&&&/param&
/// &returns&&/returns&
private int GetDataRowsCount(dynamic data)
if (data is DataTable)
return ((DataTable)data).Rows.C
else if (data is IEnumerable)
return Enumerable.Count(data);
else return 0;
/// &summary&
/// 最终显示报表
/// &/summary&
public void ShowReport()
//将每一个patter转换
if (_reportItemPatterns.Count & 0 || _reportTitlePatterns.Count & 0)
var dataSetsString = new StringBuilder();
var tablixString = new StringBuilder();
foreach (var reportItemPattern in _reportItemPatterns)
dataSetsString.Append(reportItemPattern.DataSetString);
tablixString.Append(reportItemPattern.TablixString);
foreach (var reportItemPattern in _reportHeadPatterns)
dataSetsString.Append(reportItemPattern.DataSetString);
tablixString.Append(reportItemPattern.TablixString);
var reportTitleString = new StringBuilder();
foreach (var reportTitlePattern in _reportTitlePatterns)
reportTitleString.Append(reportTitlePattern);
//把文档中的文字替换掉
switch (ReportType)
case ReportType.Tables:
_docTemplate = _docTemplate.Replace(&@DataSets&, dataSetsString.ToString())
.Replace(&@Tablix&, tablixString.ToString())
.Replace(&@Title&, reportTitleString.ToString());
case ReportType.Chart:
case ReportType.Finally:
//替换datasetstring
var pos = _docTemplate.IndexOf(&&Body&&, StringComparison.Ordinal);
_docTemplate = _docTemplate.Insert(pos,
string.Format(
&&DataSources&&DataSource Name=\&DummyDataSource\&&&ConnectionProperties&&DataProvider&SQL&/DataProvider&&ConnectString /&&/ConnectionProperties&&rd:DataSourceID&3eecdab9-6b4b-4836-ad62-95e4aee65ea8&/rd:DataSourceID&&/DataSource&&/DataSources&&DataSets&{0}&/DataSets&&,
dataSetsString));
//替换Tablix
pos = _docTemplate.IndexOf(&&ReportItems&&, StringComparison.Ordinal);
_docTemplate = _docTemplate.Insert(pos + 13, tablixString.ToString());
//替换title
_docTemplate = _docTemplate.Insert(pos + 13, reportTitleString.ToString());
var doc = new XmlDocument();
doc.LoadXml(_docTemplate);
Stream stream = GetRdlcStream(doc);
//加载报表定义
_report.LocalReport.LoadReportDefinition(stream);
_report.LocalReport.DataSources.Clear();
foreach (var reportItemPattern in _reportItemPatterns)
_report.LocalReport.DataSources
.Add(new ReportDataSource(reportItemPattern.DataSetName + &Data&,
reportItemPattern.Data));
foreach (var reportItemPattern in _reportHeadPatterns)
_report.LocalReport.DataSources
.Add(new ReportDataSource(reportItemPattern.DataSetName + &Data&,
reportItemPattern.Data));
_report.LocalReport.Refresh();
/// &summary&
/// 序列化到内存流
/// &/summary&
/// &returns&&/returns&
protected Stream GetRdlcStream(XmlDocument xmlDoc)
Stream ms = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(typeof(XmlDocument));
serializer.Serialize(ms, xmlDoc);
ms.Position = 0;
public interface IDynamicReport
void SetReport(ReportViewer reportViewer);
void AddData&T&(IEnumerable&T& data);
void AddData(DataTable dataTable);
void ShowReport();
void LoadReport(string reportPath);
void SetColoumStyle(List&ReportColoumStyle& coloumStyle);
void AddText(string title);
public class ReportColoumStyle
public string ColoumName { }
public float ColoumWidth { }
public TextAlign TextAlign { }
public ReportColoumStyle()
ColoumWidth = DynamicReport.ColoumW
public enum TextAlign
public enum ReportType
internal enum DataType
DataTable,
Enumerable
internal class ReportItemPattern
public string DataSetName { }
public string DataSetString { }
public string TablixString { }
public dynamic Data { }
public string DataSetPattern
&DataSet Name=\&@DataSetNameData\&&& +
&Fields&@Fields&/Fields&& +
&Query&& +
&DataSourceName&DummyDataSource&/DataSourceName&& +
&CommandText /&& +
&/Query&& +
&/DataSet&&;
public string TablixPattern
return & &Tablix Name=\&Tablix@DataSetName\&&& +
&TablixBody&& +
&TablixColumns&@TablixColumns&/TablixColumns&& +
&TablixRows&& +
&TablixRow&& +
&Height&0.23622in&/Height&& +
&TablixCells&@TablixHeader&/TablixCells&& +
&/TablixRow&& +
&TablixRow&& +
&Height&0.23622in&/Height&& +
&TablixCells&@TablixCells&/TablixCells&& +
&/TablixRow&& +
&/TablixRows&& +
&/TablixBody&& +
&TablixColumnHierarchy&& +
&TablixMembers&@TablixMember&/TablixMembers&& +
&/TablixColumnHierarchy&& +
&TablixRowHierarchy&& +
&TablixMembers&& +
&TablixMember&& +
&KeepWithGroup&After&/KeepWithGroup&& +
&/TablixMember&& +
&TablixMember&& +
&Group Name=\&详细信息@DataSetName\& /&& +
&/TablixMember&& +
&/TablixMembers&& +
&/TablixRowHierarchy&& +
&DataSetName&@DataSetNameData&/DataSetName&& +
&Top&@TopPositioncm&/Top&& +
&Left&@LeftPostioncm&/Left&& +
&Height&1.2cm&/Height&& +
&Width&14.35207cm&/Width&& +
&Style&& +
&Border&& +
&Style&None&/Style&& +
&/Border&& +
&/Style&& +
&&/Tablix&&;
internal static class DynamicReportExtension
public static dynamic RemoveZeroData(this object data)
if (data is DataTable)
return ((DataTable)data).ChangeEachColumnTypeToString();
else if (data is IEnumerable)
var _data = ((IEnumerable)data).Cast&object&();
return _data.CopyToDataTable().RemoveZeroData();
public static DataTable ChangeEachColumnTypeToString(this DataTable dt)
DataTable tempdt = new DataTable();
foreach (DataColumn dc in dt.Columns)
DataColumn tempdc = new DataColumn();
tempdc.ColumnName = dc.ColumnN
tempdc.DataType = typeof(String);
tempdt.Columns.Add(tempdc);
int coloumCount = dt.Columns.C
foreach (DataRow dr in dt.Rows)
var newrow = tempdt.NewRow();
for (int i = 0; i & coloumC i++)
var value = dr[i].ToString();
switch (value)
case &0.00%&:
newrow[i] = &-&;
newrow[i] =
tempdt.Rows.Add(newrow);
internal static class DataSetLinqOperators
public static DataTable CopyToDataTable&T&(this IEnumerable&T& source)
return new ObjectShredder&T&().Shred(source, null, null);
public static DataTable CopyToDataTable&T&(this IEnumerable&T& source,
DataTable table, LoadOption? options)
return new ObjectShredder&T&().Shred(source, table, options);
internal class ObjectShredder&T&
private FieldInfo[] _
private PropertyInfo[] _
private Dictionary&string, int& _ordinalM
private Type _
public ObjectShredder()
_type = typeof(T);
_fi = _type.GetFields();
_pi = _type.GetProperties();
_ordinalMap = new Dictionary&string, int&();
public DataTable Shred(IEnumerable&T& source, DataTable table, LoadOption? options)
if (typeof(T).IsPrimitive)
return ShredPrimitive(source, table, options);
if (table == null)
table = new DataTable(typeof(T).Name);
// now see if need to extend datatable base on the type T + build ordinal map
table = ExtendTable(table, typeof(T));
table.BeginLoadData();
using (IEnumerator&T& e = source.GetEnumerator())
while (e.MoveNext())
if (options != null)
table.LoadDataRow(ShredObject(table, e.Current), (LoadOption)options);
table.LoadDataRow(ShredObject(table, e.Current), true);
table.EndLoadData();
public DataTable ShredPrimitive(IEnumerable&T& source, DataTable table, LoadOption? options)
if (table == null)
table = new DataTable(typeof(T).Name);
if (!table.Columns.Contains(&Value&))
table.Columns.Add(&Value&, typeof(T));
table.BeginLoadData();
using (IEnumerator&T& e = source.GetEnumerator())
Object[] values = new object[table.Columns.Count];
while (e.MoveNext())
values[table.Columns[&Value&].Ordinal] = e.C
if (options != null)
table.LoadDataRow(values, (LoadOption)options);
table.LoadDataRow(values, true);
table.EndLoadData();
public DataTable ExtendTable(DataTable table, Type type)
// value is type derived
T, may need to extend table.
foreach (FieldInfo f in type.GetFields())
if (!_ordinalMap.ContainsKey(f.Name))
DataColumn dc = table.Columns.Contains(f.Name) ?
table.Columns[f.Name]
table.Columns.Add(f.Name, f.FieldType);
_ordinalMap.Add(f.Name, dc.Ordinal);
foreach (PropertyInfo p in type.GetProperties())
if (!_ordinalMap.ContainsKey(p.Name))
DataColumn dc = table.Columns.Contains(p.Name) ?
table.Columns[p.Name]
table.Columns.Add(p.Name, p.PropertyType);
_ordinalMap.Add(p.Name, dc.Ordinal);
public object[] ShredObject(DataTable table, T instance)
FieldInfo[] fi = _
PropertyInfo[] pi = _
if (instance.GetType() != typeof(T))
ExtendTable(table, instance.GetType());
fi = instance.GetType().GetFields();
pi = instance.GetType().GetProperties();
Object[] values = new object[table.Columns.Count];
foreach (FieldInfo f in fi)
values[_ordinalMap[f.Name]] = f.GetValue(instance);
foreach (PropertyInfo p in pi)
values[_ordinalMap[p.Name]] = p.GetValue(instance, null);
}下面的情况在前端绑定就可以
&private DataTable CreateData()
DataTable dt = new DataTable();
dt.Columns.Add(&专业名称&);
dt.Columns.Add(&学院&);
dt.Columns.Add(&就业去向&);
for (int i = 0; i & 100; i++)
DataRow dr = dt.NewRow();
dr[0] = &我是&+i;
dr[1] = &三年级&;
dr[2] = &二班&;
dt.Rows.Add(dr);
private void DynamicBindRV()
//new一个报表类对象
var dynamicReport = new DynamicReport { ReportType = ReportType.Tables };
//设置报表为本地报表
dynamicReport.SetReport(this.ReportViewer1);
//设置列宽度和对齐方式(可选)
dynamicReport.SetColoumStyle(new List&ReportColoumStyle&()
new ReportColoumStyle(){ColoumName = &专业名称&, ColoumWidth = 4F},
new ReportColoumStyle() {ColoumName = &学院&, ColoumWidth = 3.5F},
new ReportColoumStyle(){ColoumName = &就业去向&, ColoumWidth = 10F},
//加入标题
dynamicReport.AddText(&测试&);
//加入数据
dynamicReport.AddData(CreateData());
//设置导出报表的名称
ReportViewer1.LocalReport.DisplayName = &测试&;
//处理报表数据并显示
dynamicReport.ShowReport();
排名:第280名
(17)(1)(29)(41)(51)(3)(22)(3)(1)(2)(2)(1)(20)(1)

我要回帖

更多关于 rdlc自定义函数 的文章

 

随机推荐