动态RDLC报表类DynamicReport:基础设置
了解了RDLC报表的结构后,我们就来把传递进来的数据转变成符合RDLC报表结构的xml格式文档,用一个类的形式来做,方便以后调用。
这个报表是按我项目的需要来做的,基本要求:
1、可以设置页面大小、边距、字体、数据表样式;
2、可以做多维表头和统计;
3、可以添加多个数据表和标题;
4、可以自动签名、盖章。
基础的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Data;
using Microsoft.Reporting.WinForms;
using System.Text;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Xml.Serialization;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.Drawing.Imaging;
namespace RDLC
{
public class DynamicReport : IDynamicReport
{
//需要一个ReportViewer来接收送递进来的ReportViewer加载RDLC
private ReportViewer _report;
private string languageCode = "zh_CHS";
private string totalString = "合计:";
private string notesString = "备注:";
//设置字体和大小
private string fontString = "微软雅黑";
private int fontSize = 9;
//设置页面大小
private float pageWidth = 21.0F;
private float pageHeight = 29.7F;
//设置上边距和左边距,右边和下边就不用设置了,一般是对称的
private float topMargin = 0.8F;
private float leftMargin = 1.5F;
#region 参数设置
public string LanguageCode
{
get { return languageCode; }
set
{
languageCode = value;
if (languageCode == "zh_CHT")
{
totalString = "合計:";
notesString = "備註:";
}
else if (languageCode == "en")
{
totalString = "Total:";
notesString = "Remark:";
}
else
{
totalString = "合计:";
notesString = "备注:";
}
}
}
public string FontString
{
get { return fontString; }
set { fontString = value; }
}
public int FontSize
{
get { return fontSize; }
set { fontSize = value; }
}
public float PageHeight
{
get { return pageHeight; }
set { pageHeight = value; }
}
public float PageWidth
{
get { return pageWidth; }
set { pageWidth = value; }
}
public float LeftMargin
{
get { return leftMargin; }
set { leftMargin = value; }
}
public float TopMargin
{
get { return topMargin; }
set { topMargin = value; headerHeight = value; }
}
#endregion
public DynamicReport()
{
}
}
}
这里继承了一个IDynamicReport接口
public interface IDynamicReport
{
void SetReport(ReportViewer reportViewer, DisplayMode displayMode = DisplayMode.PrintLayout, ZoomMode zoomMode = ZoomMode.PageWidth);
void AddData(DataTable dataTable, string totalColumn);
void ShowReport();
void LoadReport(string reportPath);
void SetColoumStyle(List<ReportColoumStyle> coloumStyle);
}
需要为表格的样式增加一个辅助类和枚举,这样主涌方便地设置表格的样式。
public class ReportColoumStyle
{
public string ColoumName { get; set; }
public float ColoumWidth { get; set; }
public TextAlign TextAlign { get; set; }
public ConsoleColor ConsoleColor { get; set; }
public Boolean IsShortDate { get; set; }
public ReportColoumStyle()
{
ColoumWidth = DynamicReport.ColoumWidth;
}
}
public enum TextAlign
{
Left,
Center,
Right
}
接下来就是主体部分了,先来定义一个空白的包含RDLC所需节点的xml文档来做模板,模板中用@XXX来表示相应的节点内容,比如@DataSets、@Tablix分别代表要设置的数据源中的数据表和<Body>中要显示的数据表格,后面会用传递进来的数据替换。
protected string _docTemplate =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<Report xmlns:rd=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\" xmlns=\"http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition\">" +
"<DataSources>" +
" &