C#的REPORTVIEW通用框架

 内容摘要:最近花了很多工夫研究了C# 2005的RDLC报表,个人感觉功能是很强大,但是编码却很费力,并且这方面的示例也实在是太少了。以下是我整理的一报表控件,在此与大家分享。一、改进后的ReportViewer1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using Microsoft.Repor。

 

最近花了很多工夫研究了C# 2005的RDLC报表,个人感觉功能是很强大,但是编码却很费力,并且这方面的示例也实在是太少了。以下是我整理的一报表控件,在此与大家分享。


一、改进后的ReportViewer

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Reporting.WinForms;
using System.ComponentModel;
using System.IO;

namespace FBS.GDTVMember.Report
{
    public class ReportViewer : Microsoft.Reporting.WinForms.ReportViewer
    {
        private string _rcfile;
        private ReportConfig _rpc;
        private object _datasource;
        private MemoryStream m_rdl;
 
        public ReportViewer() :base()
        {
 
        }
 
        /// <summary>
        /// 配置文件
       /// </summary>
        [DefaultValue("")]
        public string Filename
        {
            get { return _rcfile; }
            set
            {
                _rcfile = value;
                _rpc = new ReportConfig(_rcfile);
            }
        }
 
        /// <summary>
        /// 报表配置
        /// </summary>
        public ReportConfig ReportConfig
        {
            get { return _rpc; }
        }
 
        /// <summary>
        /// 数据源
        /// </summary>
        public object DataSource
        {
            get { return _datasource; }
            set { _datasource = value; }
        }
 
        /// <summary>
        /// 显示报表
        /// </summary>
        public void ShowReport()
        {
            if (m_rdl != null)
                m_rdl.Dispose();
            m_rdl = GenerateRdl();
 
            Reset();
            LocalReport.LoadReportDefinition(m_rdl);
            LocalReport.DataSources.Add(new ReportDataSource("FaibLists", _datasource));
            RefreshReport();
        }
 
        /// <summary>
        /// 生成Rdl流
        /// </summary>
        /// <returns></returns>
        private MemoryStream GenerateRdl()
        {
            MemoryStream ms = new MemoryStream();
            RdlGenerator gen = new RdlGenerator();
            gen.ReportConfig = _rpc;
            gen.WriteXml(ms);
            ms.Position = 0;
            return ms;
        }
 
    }
 }




二、Rdl生成类


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;
 
namespace FBS.GDTVMember.Report
{
    public class RdlGenerator
    {
        private ReportConfig _rpc;
 
        /// <summary>
        /// 报表配置
        /// </summary>
        public ReportConfig ReportConfig
        {
            get { return _rpc; }
            set { _rpc = value; }
        }
 
        /// <summary>
        /// 创建报表
        /// </summary>
        /// <returns></returns>
        private Rdl.Report CreateReport()
        {
            Rdl.Report report = new Rdl.Report();
            string w = "", h = "", lm = "", tm = "", rm = "", bm = "";
            //设置报表页面
            if(!string.IsNullOrEmpty(_rpc.Unit))
            {
                w = _rpc.Width + _rpc.Unit;
                h = _rpc.Height + _rpc.Unit;
                lm = _rpc.LeftMargin + _rpc.Unit;
                tm = _rpc.TopMargin + _rpc.Unit;
                rm = _rpc.RightMargin + _rpc.Unit;
                bm = _rpc.BottomMargin + _rpc.Unit;
            }
            else
            {
                w = (_rpc.PageSettings.PaperSize.Width / 96.0) + "in";
                h = (_rpc.PageSettings.PaperSize.Height / 96.0) + "in";
                lm = (_rpc.LeftMargin / 96.0) + "in";
                tm = (_rpc.TopMargin / 96.0) + "in";
                rm = (_rpc.RightMargin / 96.0) + "in";
                bm = (_rpc.BottomMargin / 96.0) + "in";
            }
            report.Items = new object[] 
                {
                    CreateDataSources(),
                    CreateHeader(),
                    CreateBody(),
                    CreateFooter(),
                    CreateDataSets(),
                    w,
                    h,
                    lm,
                    tm,
                    rm,
                    bm,
                };
            report.ItemsElementName = new Rdl.ItemsChoiceType37[]
                { 
                    Rdl.ItemsChoiceType37.DataSources, 
                    Rdl.ItemsChoiceType37.PageHeader,
                    Rdl.ItemsChoiceType37.Body,
                    Rdl.ItemsChoiceType37.PageFooter,
                    Rdl.ItemsChoiceType37.DataSets,
                    Rdl.ItemsChoiceType37.Width,
                    Rdl.ItemsChoiceType37.PageHeight,
                    Rdl.ItemsChoiceType37.LeftMargin,
                    Rdl.ItemsChoiceType37.TopMargin,
                    Rdl.ItemsChoiceType37.RightMargin,
                    Rdl.ItemsChoiceType37.BottomMargin,
                };
            return report;
        }
 
        #region 数据源
        /// <summary>
        /// 数据源
        /// </summary>
        /// <returns></returns>
        private Rdl.DataSourcesType CreateDataSources()
        {
            Rdl.DataSourcesType dataSources = new Rdl.DataSourcesType();
            dataSources.DataSource = new Rdl.DataSourceType[] { CreateDataSource() };
            return dataSources;
        }
 
        private Rdl.DataSourceType CreateDataSource()
        {
            Rdl.DataSourceType dataSource = new Rdl.DataSourceType();
            dataSource.Name = "FaibLists";
            dataSource.Items = new object[] { CreateConnectionProperties() };
            return dataSource;
        }
 
        private Rdl.ConnectionPropertiesType CreateConnectionProperties()
        {
            Rdl.ConnectionPropertiesType connectionProperties = new Rdl.ConnectionPropertiesType();
            connectionProperties.Items = new object[]
                {
                    "",
                    "SQL",
                };
            connectionProperties.ItemsElementName = new Rdl.ItemsChoiceType[]
                {
                    Rdl.ItemsChoiceType.ConnectString,
                    Rdl.ItemsChoiceType.DataProvider,
                };
            return connectionProperties;
        }
        #endregion
 
        #region 主体
        /// <summary>
        /// 报表主体
        /// </summary>
        /// <returns></returns>
        private Rdl.BodyType CreateBody()
        {
            Rdl.BodyType body = new Rdl.BodyType();
            body.Items = new object[]
                {
                    CreateReportItems(),
                    "1in",
                };
            body.ItemsElementName = new Rdl.ItemsChoiceType30[]
                {
                    Rdl.ItemsChoiceType30.ReportItems,
                    Rdl.ItemsChoiceType30.Height,
                };
            return body;
        }
 
        private Rdl.ReportItemsType CreateReportItems()
        {
            Rdl.ReportItemsType reportItems = new Rdl.ReportItemsType();
            TableRdlGenerator tableGen = new TableRdlGenerator();
            tableGen.Fields = _rpc.DataItem;
            reportItems.Items = new object[] { tableGen.CreateTable() };
            return reportItems;
        }
        #endregion
 
        #region 页头页尾
        private Rdl.PageHeaderFooterType CreateHeader()
        {
            Rdl.PageHeaderFooterType header = new FBS.GDTVMember.Report.Rdl.PageHeaderFooterType();
            HeaderFooterRdlGenerator headerGen = new HeaderFooterRdlGenerator();
            headerGen.Fields = _rpc.Header;
 
            header.Items = new object[]
                {
                    (_rpc.HeadHeight / 96.0) + "in",
                    true,
                    true,
                    headerGen.CreateItems(),
                };
            header.ItemsElementName = new Rdl.ItemsChoiceType34[]
                {
                    Rdl.ItemsChoiceType34.Height,
                    Rdl.ItemsChoiceType34.PrintOnFirstPage,
                    Rdl.ItemsChoiceType34.PrintOnLastPage,
                    Rdl.ItemsChoiceType34.ReportItems
                };
            return header;
        }
 
        private Rdl.PageHeaderFooterType CreateFooter()
        {
            Rdl.PageHeaderFooterType footer = new FBS.GDTVMember.Report.Rdl.PageHeaderFooterType();
            HeaderFooterRdlGenerator footerGen = new HeaderFooterRdlGenerator();
            footerGen.Fields = _rpc.Footer;
 
            footer.Items = new object[]
                {
                    (_rpc.FootHeight / 96.0) + "in",
                    true,
                    true,
                    footerGen.CreateItems(),
                };
            footer.ItemsElementName = new Rdl.ItemsChoiceType34[]
                {
                    Rdl.ItemsChoiceType34.Height,
                    Rdl.ItemsChoiceType34.PrintOnFirstPage,
                    Rdl.ItemsChoiceType34.PrintOnLastPage,
                    Rdl.ItemsChoiceType34.ReportItems
                };
            return footer;
        }
        #endregion
 
        #region 数据集
        private Rdl.DataSetsType CreateDataSets()
        {
            Rdl.DataSetsType dataSets = new Rdl.DataSetsType();
            dataSets.DataSet = new Rdl.DataSetType[] { CreateDataSet() };
            return dataSets;
        }
 
        private Rdl.DataSetType CreateDataSet()
        {
            Rdl.DataSetType dataSet = new Rdl.DataSetType();
            dataSet.Name = "FaibLists";
            dataSet.Items = new object[] { CreateQuery(), CreateFields() };
            return dataSet;
        }
 
        private Rdl.QueryType CreateQuery()
        {
            Rdl.QueryType query = new Rdl.QueryType();
            query.Items = new object[] 
                {
                    "FaibLists",
                    "",
                };
            query.ItemsElementName = new Rdl.ItemsChoiceType2[]
                {
                    Rdl.ItemsChoiceType2.DataSourceName,
                    Rdl.ItemsChoiceType2.CommandText,
                };
            return query;
        }
 
        private Rdl.FieldsType CreateFields()
        {
            Rdl.FieldsType fields = new Rdl.FieldsType();
            Dictionary<string, TextItem> m_fields = _rpc.DataItem;
            fields.Field = new Rdl.FieldType[m_fields.Count];
            int i = 0;
            foreach (string key in m_fields.Keys)
            {
                fields.Field[i++] = CreateField(m_fields[key]);
            }
 
            return fields;
        }
 
        private Rdl.FieldType CreateField(TextItem item)
        {
            Rdl.FieldType field = new Rdl.FieldType();
            field.Name = item.DataMember;
            field.Items = new object[] { item.DataMember };
            field.ItemsElementName = new Rdl.ItemsChoiceType1[] { Rdl.ItemsChoiceType1.DataField };
            return field;
        }
        #endregion
 
        public void WriteXml(Stream stream)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Rdl.Report));
            serializer.Serialize(stream, CreateReport());
        }
    }
 }




三、报表主体生成类TableRdlGenerator


 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Drawing;
 
 namespace FBS.GDTVMember.Report
 {
    public class TableRdlGenerator
    {
        private Dictionary<string, TextItem> m_fields;
 
        public Dictionary<string, TextItem> Fields
        {
            get { return m_fields; }
            set { m_fields = value; }
        }
 
        public Rdl.TableType CreateTable()
        {
            //定义表格
            Rdl.TableType table = new Rdl.TableType();
            table.Name = "Table1";
            table.Items = new object[]
                {
                    CreateTableColumns(),
                    CreateHeader(),
                    CreateDetails(),
                };
            table.ItemsElementName = new Rdl.ItemsChoiceType21[]
                {
                    Rdl.ItemsChoiceType21.TableColumns,
                    Rdl.ItemsChoiceType21.Header,
                    Rdl.ItemsChoiceType21.Details,
                };
            return table;
        }
 
        private Rdl.HeaderType CreateHeader()
        {
            Rdl.HeaderType header = new Rdl.HeaderType();
            header.Items = new object[]
                {
                    CreateHeaderTableRows(),
                    true,
                };
            header.ItemsElementName = new Rdl.ItemsChoiceType20[]
                {
                    Rdl.ItemsChoiceType20.TableRows,
                    Rdl.ItemsChoiceType20.RepeatOnNewPage,
                };
            return header;
        }
 
        private Rdl.TableRowsType CreateHeaderTableRows()
        {
            Rdl.TableRowsType headerTableRows = new Rdl.TableRowsType();
            headerTableRows.TableRow = new Rdl.TableRowType[] { CreateHeaderTableRow() };
            return headerTableRows;
        }
 
        private Rdl.TableRowType CreateHeaderTableRow()
        {
            Rdl.TableRowType headerTableRow = new Rdl.TableRowType();
            headerTableRow.Items = new object[] { CreateHeaderTableCells(), "0.25in" };
            return headerTableRow;
        }
 
        private Rdl.TableCellsType CreateHeaderTableCells()
        {
            Rdl.TableCellsType headerTableCells = new Rdl.TableCellsType();
            headerTableCells.TableCell = new Rdl.TableCellType[m_fields.Count];
            int i = 0;
            foreach (string key in m_fields.Keys)
            {
                headerTableCells.TableCell[i++] = CreateHeaderTableCell(m_fields[key]);
            }
            return headerTableCells;
        }
 
        private Rdl.TableCellType CreateHeaderTableCell(TextItem item)
        {
            Rdl.TableCellType headerTableCell = new Rdl.TableCellType();
            headerTableCell.Items = new object[] { CreateHeaderTableCellReportItems(item) };
            return headerTableCell;
        }
 
        private Rdl.ReportItemsType CreateHeaderTableCellReportItems(TextItem item)
        {
            Rdl.ReportItemsType headerTableCellReportItems = new Rdl.ReportItemsType();
            headerTableCellReportItems.Items = new object[] { CreateHeaderTableCellTextbox(item) };
            return headerTableCellReportItems;
        }
 
        private Rdl.TextboxType CreateHeaderTableCellTextbox(TextItem item)
        {
            Rdl.TextboxType headerTableCellTextbox = new Rdl.TextboxType();
            headerTableCellTextbox.Name = item.Text + "_Header";
            headerTableCellTextbox.Items = new object[] 
                {
                    item.Text,
                    CreateHeaderTableCellTextboxStyle(item),
                    true,
                };
            headerTableCellTextbox.ItemsElementName = new Rdl.ItemsChoiceType14[] 
                {
                    Rdl.ItemsChoiceType14.Value,
                    Rdl.ItemsChoiceType14.Style,
                    Rdl.ItemsChoiceType14.CanGrow,
                };
            return headerTableCellTextbox;
        }
 
        private Rdl.StyleType CreateHeaderTableCellTextboxStyle(TextItem item)
        {
            Rdl.StyleType headerTableCellTextboxStyle = new Rdl.StyleType();
            headerTableCellTextboxStyle.Items = new object[]
                {
                    item.HeaderFont.Name,
                    item.HeaderFont.Size + "pt",
                    item.HeaderFont.Bold ? "700" : "100",
                    "Center",
                    "Middle",
                    CreateBorderStyle(),
                };
            headerTableCellTextboxStyle.ItemsElementName = new Rdl.ItemsChoiceType5[]
                {
                    Rdl.ItemsChoiceType5.FontFamily,
                    Rdl.ItemsChoiceType5.FontSize,
                    Rdl.ItemsChoiceType5.FontWeight,
                    Rdl.ItemsChoiceType5.TextAlign,
                    Rdl.ItemsChoiceType5.VerticalAlign,
                    Rdl.ItemsChoiceType5.BorderStyle,
                };
            return headerTableCellTextboxStyle;
        }
 
        private Rdl.DetailsType CreateDetails()
        {
            Rdl.DetailsType details = new Rdl.DetailsType();
            details.Items = new object[] { CreateTableRows() };
            return details;
        }
 
        private Rdl.TableRowsType CreateTableRows()
        {
            Rdl.TableRowsType tableRows = new Rdl.TableRowsType();
            tableRows.TableRow = new Rdl.TableRowType[] { CreateTableRow() };
            return tableRows;
        }
 
        private Rdl.TableRowType CreateTableRow()
        {
            Rdl.TableRowType tableRow = new Rdl.TableRowType();
            tableRow.Items = new object[] { CreateTableCells(), "0.25in" };
            return tableRow;
        }
 
        private Rdl.TableCellsType CreateTableCells()
        {
            Rdl.TableCellsType tableCells = new Rdl.TableCellsType();
            tableCells.TableCell = new Rdl.TableCellType[m_fields.Count];
            int i = 0;
            foreach(string key in m_fields.Keys)
            {
                tableCells.TableCell[i++] = CreateTableCell(m_fields[key]);
            }
            return tableCells;
        }
 
        private Rdl.TableCellType CreateTableCell(TextItem item)
        {
            Rdl.TableCellType tableCell = new Rdl.TableCellType();
            tableCell.Items = new object[] { CreateTableCellReportItems(item) };
            return tableCell;
        }
 
        private Rdl.ReportItemsType CreateTableCellReportItems(TextItem item)
        {
            Rdl.ReportItemsType reportItems = new Rdl.ReportItemsType();
            reportItems.Items = new object[] { CreateTableCellTextbox(item) };
            return reportItems;
        }
 
        private Rdl.TextboxType CreateTableCellTextbox(TextItem item)
        {
            Rdl.TextboxType textbox = new Rdl.TextboxType();
            textbox.Name = item.Key;
            textbox.Items = new object[] 
                {
                    "=Fields!" + item.DataMember + ".Value",
                    CreateTableCellTextboxStyle(item),
                    true,
                };
            textbox.ItemsElementName = new Rdl.ItemsChoiceType14[] 
                {
                    Rdl.ItemsChoiceType14.Value,
                    Rdl.ItemsChoiceType14.Style,
                    Rdl.ItemsChoiceType14.CanGrow,
                };
            return textbox;
        }
 
        private Rdl.StyleType CreateTableCellTextboxStyle(TextItem item)
        {
            Rdl.StyleType style = new Rdl.StyleType();
            style.Items = new object[]
                {
                    item.Font.Name,
                    item.Font.Size + "pt",
                    item.Font.Bold ? "400" : "100",
                    GetAlign(item.Align.Alignment),
                    "Middle",
                    CreateBorderStyle(),
                    "1pt",
                    "1pt",
                    "1pt",
                    "1pt",
                };
            style.ItemsElementName = new Rdl.ItemsChoiceType5[]
                {
                    Rdl.ItemsChoiceType5.FontFamily,
                    Rdl.ItemsChoiceType5.FontSize,
                    Rdl.ItemsChoiceType5.FontWeight,
                    Rdl.ItemsChoiceType5.TextAlign,
                    Rdl.ItemsChoiceType5.VerticalAlign,
                    Rdl.ItemsChoiceType5.BorderStyle,
                    Rdl.ItemsChoiceType5.PaddingLeft,
                    Rdl.ItemsChoiceType5.PaddingTop,
                    Rdl.ItemsChoiceType5.PaddingRight,
                    Rdl.ItemsChoiceType5.PaddingBottom,
                };
            return style;
        }
 
        private Rdl.TableColumnsType CreateTableColumns()
        {
            Rdl.TableColumnsType tableColumns = new Rdl.TableColumnsType();
            tableColumns.TableColumn = new Rdl.TableColumnType[m_fields.Count];
            int i = 0;
            foreach (string key in m_fields.Keys)
            {
                tableColumns.TableColumn[i++] = CreateTableColumn(m_fields[key]);
            }
            return tableColumns;
        }
 
        private Rdl.TableColumnType CreateTableColumn(TextItem item)
        {
            Rdl.TableColumnType tableColumn = new Rdl.TableColumnType();
            tableColumn.Items = new object[] { (item.Rect.Width / 96.0) + "in" };
            return tableColumn;
        }
 
        private Rdl.BorderColorStyleWidthType CreateBorderStyle()
        {
            Rdl.BorderColorStyleWidthType bstyle = new Rdl.BorderColorStyleWidthType();
            bstyle.Items = new object[]
                {
                    "Solid",
                };
            bstyle.ItemsElementName = new Rdl.ItemsChoiceType3[]
                {
                    Rdl.ItemsChoiceType3.Default,
                };
            return bstyle;
        }
 
        private string GetVAlign(StringAlignment sformat)
        {
            switch (sformat)
            {
                case StringAlignment.Center: return "Middle";
                case StringAlignment.Far: return "Bottom";
                default: return "Top";
            }
        }
 
        private string GetAlign(StringAlignment sformat)
        {
            switch (sformat)
            {
                case StringAlignment.Center: return "Center";
                case StringAlignment.Far: return "Right";
                default: return "Left";
            }
        }
    }
 }

 


四、页头页尾生成类HeaderFooterRdlGenerator


 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Drawing;
 
 namespace FBS.GDTVMember.Report
 {
    public class HeaderFooterRdlGenerator
    {
        private Dictionary<string, TextItem> m_fields;
        private int m_height;
 
        public Dictionary<string, TextItem> Fields
        {
            get { return m_fields; }
            set { m_fields = value; }
        }
 
        public int Height
        {
            get { return m_height; }
            set { m_height = value; }
        }
 
        public Rdl.ReportItemsType CreateItems()
        {
            Rdl.ReportItemsType items = new Rdl.ReportItemsType();
            items.Items = new Rdl.TextboxType[m_fields.Count];
            int i = 0;
            foreach (string key in m_fields.Keys)
            {
                items.Items[i++] = CreateTextBox(m_fields[key]);
            }
            return items;
        }
 
        private Rdl.TextboxType CreateTextBox(TextItem item)
        {
            Rdl.TextboxType textbox = new Rdl.TextboxType();
            textbox.Name = item.Key;
            textbox.Items = new object[] 
                {
                    item.Text,
                    CreateTextboxStyle(item),
                    true,
                    (item.Rect.Left / 96.0) + "in",
                    (item.Rect.Top / 96.0) + "in",
                    (item.Rect.Width / 96.0) + "in",
                    (item.Rect.Height / 96.0) + "in",
                };
            textbox.ItemsElementName = new Rdl.ItemsChoiceType14[] 
                {
                    Rdl.ItemsChoiceType14.Value,
                    Rdl.ItemsChoiceType14.Style,
                    Rdl.ItemsChoiceType14.CanGrow,
                    Rdl.ItemsChoiceType14.Left,
                    Rdl.ItemsChoiceType14.Top,
                    Rdl.ItemsChoiceType14.Width,
                    Rdl.ItemsChoiceType14.Height,
                };
            return textbox;
        }
 
        private Rdl.StyleType CreateTextboxStyle(TextItem item)
        {
            Rdl.StyleType style = new Rdl.StyleType();
            style.Items = new object[]
                {
                    GetAlign(item.Align.Alignment),
                    GetVAlign(item.Align.LineAlignment),
                    item.Font.Name,
                    item.Font.Size + "pt",
                    item.Font.Bold ? "700" : "100",
                };
            style.ItemsElementName = new Rdl.ItemsChoiceType5[]
                {
                    Rdl.ItemsChoiceType5.TextAlign,
                    Rdl.ItemsChoiceType5.VerticalAlign,
                    Rdl.ItemsChoiceType5.FontFamily,
                    Rdl.ItemsChoiceType5.FontSize,
                    Rdl.ItemsChoiceType5.FontWeight,
                };
            return style;
        }
 
        private string GetVAlign(StringAlignment sformat)
        {
            switch(sformat)
            {
                case StringAlignment.Center: return "Middle";
                case StringAlignment.Far: return "Bottom";
                default: return "Top";
            }
        }
 
        private string GetAlign(StringAlignment sformat)
        {
            switch (sformat)
            {
                case StringAlignment.Center: return "Center";
                case StringAlignment.Far: return "Right";
                default: return "Left";
            }
        }
    }
 }




五、报表配置类ReportConfig


 using System;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Drawing.Printing;
 using System.Text;
 using System.Reflection;
 using System.Xml;
 
 namespace FBS.GDTVMember.Report
 {
    /// <summary>
    /// 报表配置
    /// </summary>
    public class ReportConfig
    {
        private string _filename;
        private bool _autosize;
        private PageSettings _pset = new PageSettings();
        private Dictionary<string, TextItem> _header;
        private Dictionary<string, TextItem> _dataitem;
        private Dictionary<string, TextItem> _footer;
        private Dictionary<string, object> _cusmdata;
        private float _headheight;
        private float _footheight;
        private float _width, _height, _lm, _tm, _rm, _bm;
        private string _unit;
 
        public ReportConfig()
        {
        }
 
        public ReportConfig(string frpFile)
        {
            _filename = frpFile;
            XmlDocument xdoc = new XmlDocument();
            xdoc.Load(frpFile);
            XmlNode pnode = xdoc.SelectSingleNode("//configuration/pageset");
            ReportConfig.GetAttribute(pnode, "unit", ref _unit);
            if(string.IsNullOrEmpty(_unit)) //没有单位
            {
                //页面大小
                int w = 0, h = 0;
                ReportConfig.GetAttribute(pnode, "width", ref w);
                ReportConfig.GetAttribute(pnode, "height", ref h);
                _autosize = h == 0;
                _pset.PaperSize = new PaperSize(frpFile, w, h);
                //页边距
                int m_left = 0, m_top = 0, m_right = 0, m_bottom = 0;
                ReportConfig.GetAttribute(pnode, "margin-left", ref m_left);
                ReportConfig.GetAttribute(pnode, "margin-top", ref m_top);
                ReportConfig.GetAttribute(pnode, "margin-right", ref m_right);
                ReportConfig.GetAttribute(pnode, "margin-bottom", ref m_bottom);
                _pset.Margins = new Margins(m_left, m_right, m_top, m_bottom);
            }
            else
            {
                ReportConfig.GetAttribute(pnode, "width", ref _width);
                ReportConfig.GetAttribute(pnode, "height", ref _height);
                ReportConfig.GetAttribute(pnode, "margin-left", ref _lm);
                ReportConfig.GetAttribute(pnode, "margin-top", ref _tm);
                ReportConfig.GetAttribute(pnode, "margin-right", ref _rm);
                ReportConfig.GetAttribute(pnode, "margin-bottom", ref _bm);
            }
            //头
            pnode = xdoc.SelectSingleNode("//configuration/header");
            ReportConfig.GetAttribute(pnode, "height", ref _headheight);
            //字段
            foreach (XmlNode node in xdoc.SelectNodes("//configuration/header/textitem"))
            {
                TextItem item = new TextItem(node);
                if (_header == null)
                {
                    _header = new Dictionary<string, TextItem>();
                }
                _header.Add(item.Key, item);
            }
            //尾
            pnode = xdoc.SelectSingleNode("//configuration/footer");
            ReportConfig.GetAttribute(pnode, "height", ref _footheight);
            //字段
            foreach (XmlNode node in xdoc.SelectNodes("//configuration/footer/textitem"))
            {
                TextItem item = new TextItem(node);
                if (_footer == null)
                {
                    _footer = new Dictionary<string, TextItem>();
                }
                _footer.Add(item.Key, item);
            }
            //数据字段
            foreach (XmlNode node in xdoc.SelectNodes("//configuration/dataitem/textitem"))
            {
                TextItem item = new TextItem(node);
                if(_dataitem == null)
                {
                    _dataitem = new Dictionary<string, TextItem>();
                }
                _dataitem.Add(item.Key, item);
            }
        }
 
        public Dictionary<string, object> CustomData
        {
            get {
                if (_cusmdata == null)
                    _cusmdata = new Dictionary<string, object>();
                return _cusmdata; 
            }
        }
 
        public Dictionary<string, TextItem> Header
        {
            get { return _header; }
        }
 
        public Dictionary<string, TextItem> DataItem
        {
            get { return _dataitem; }
        }
 
        public Dictionary<string, TextItem> Footer
        {
            get { return _footer; }
        }
 
        public PageSettings PageSettings
        {
            get { return _pset; }
        }
 
        public float HeadHeight
        {
            get { return _headheight; }
        }
 
        public float FootHeight
        {
            get { return _footheight; }
        }
 
        public float Width
        {
            get { return _width; }
        }
 
        public float Height
        {
            get { return _height; }
        }
 
        public float LeftMargin
        {
            get { return _lm; }
        }
 
        public float TopMargin
        {
            get { return _tm; }
        }
 
        public float RightMargin
        {
            get { return _rm; }
        }
 
        public float BottomMargin
        {
            get { return _bm; }
        }
 
        public bool AutoSize
        {
            get { return _autosize; }
            set { _autosize = value; }
        }
 
        public string Unit
        {
            get { return _unit; }
            set { _unit = value; }
        }
 
        /// <summary>
        /// 从一个类获取数据
        /// </summary>
        /// <param name="data"></param>
        public void DataFromDataItem(object data)
        {
            Type type = data.GetType();
            foreach (PropertyInfo pinfo in type.GetProperties(BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Public))
            {
                if (CustomData.ContainsKey(pinfo.Name))
                    continue;
                object value = type.InvokeMember(pinfo.Name, BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.NonPublic, null, data, null);
                if(value != null)
                {
                    CustomData.Add(pinfo.Name, value);
                }
            }
        }
 
        internal static void GetAttribute(XmlNode node, string key, ref string value)
        {
            if (node.Attributes[key] != null)
            {
                value = node.Attributes[key].Value;
            }
        }
 
        internal static void GetAttribute(XmlNode node, string key, ref int value)
        {
            if (node.Attributes[key] != null)
            {
                value = int.Parse(node.Attributes[key].Value);
            }
        }
 
        internal static void GetAttribute(XmlNode node, string key, ref float value)
        {
            if (node.Attributes[key] != null)
            {
                value = float.Parse(node.Attributes[key].Value);
            }
        }
    }
 }



六、文本项类TextItem


 using System;
 using System.Drawing;
 using System.Drawing.Printing;
 using System.Text;
 using System.Xml;
 
 namespace FBS.GDTVMember.Report
 {
   [Serializable]
    public class TextItem
    {
        private string _text;
        private string _key;
        private string _datamember;
        private Rectangle _rect;
        private StringFormat _align;
        private bool _count;
        private string _format;
        internal decimal _sum;
        private Font _font = System.Windows.Forms.Control.DefaultFont;
        private Font _headerfont = System.Windows.Forms.Control.DefaultFont;
 
        public TextItem(XmlNode node)
        {
            _key = node.Attributes["key"].Value;
            if(!string.IsNullOrEmpty(node.InnerText))
            {
                _text = node.InnerText;
            }
            else
            {
                ReportConfig.GetAttribute(node, "text", ref _text);
            }
            ReportConfig.GetAttribute(node, "data", ref _datamember);
            ReportConfig.GetAttribute(node, "format", ref _format);
            string font_name = _font.Name;
            string font_bold = "";
            string font_italic = "";
            string font_underline = "";
            float font_size = Font.Size;
            FontStyle fsty = FontStyle.Regular;
            ReportConfig.GetAttribute(node, "font-name", ref font_name);
            ReportConfig.GetAttribute(node, "font-size", ref font_size);
            ReportConfig.GetAttribute(node, "font-bold", ref font_bold);
            ReportConfig.GetAttribute(node, "font-italic", ref font_italic);
            ReportConfig.GetAttribute(node, "font-underline", ref font_underline);
            if (font_bold.Equals("1"))
            {
                fsty |= FontStyle.Bold;
            }
            if (font_italic.Equals("1"))
            {
                fsty |= FontStyle.Italic;
            }
            if (font_underline.Equals("1"))
            {
                fsty |= FontStyle.Underline;
            }
            _font = new Font(font_name, font_size, fsty);
 
            font_name = _font.Name;
            font_bold = "";
            font_italic = "";
            font_underline = "";
            font_size = Font.Size;
            fsty = FontStyle.Regular;
            ReportConfig.GetAttribute(node, "header-font-name", ref font_name);
            ReportConfig.GetAttribute(node, "header-font-size", ref font_size);
            ReportConfig.GetAttribute(node, "header-font-bold", ref font_bold);
            ReportConfig.GetAttribute(node, "header-font-italic", ref font_italic);
            ReportConfig.GetAttribute(node, "header-font-underline", ref font_underline);
            if (font_bold.Equals("1"))
            {
                fsty |= FontStyle.Bold;
            }
            if (font_italic.Equals("1"))
            {
                fsty |= FontStyle.Italic;
            }
            if (font_underline.Equals("1"))
            {
                fsty |= FontStyle.Underline;
            }
            _headerfont = new Font(font_name, font_size, fsty);
 
            int left = 0, top = 0, width = 0, height = 0;
            ReportConfig.GetAttribute(node, "left", ref left);
            ReportConfig.GetAttribute(node, "top", ref top);
            ReportConfig.GetAttribute(node, "width", ref width);
            ReportConfig.GetAttribute(node, "height", ref height);
            _rect = new Rectangle(left, top, width, height);
 
            string align = "left";
            ReportConfig.GetAttribute(node, "align", ref align);
            string valign = "top";
            ReportConfig.GetAttribute(node, "valign", ref valign);
            _align = new StringFormat();
            if (align.Equals("right", StringComparison.OrdinalIgnoreCase))
            {
                _align.Alignment = StringAlignment.Far;
            }
            else if (align.Equals("center", StringComparison.OrdinalIgnoreCase))
            {
                _align.Alignment = StringAlignment.Center;
            }
            if (valign.Equals("bottom", StringComparison.OrdinalIgnoreCase))
            {
                _align.LineAlignment = StringAlignment.Far;
            }
            else if (valign.Equals("middle", StringComparison.OrdinalIgnoreCase))
            {
                _align.LineAlignment = StringAlignment.Center;
            }
 
            string count = "";
            ReportConfig.GetAttribute(node, "count", ref count);
            if(count.Equals("1"))
            {
                _count = true;
            }
        }
 
        public string Key
        {
            get { return _key; }
        }
 
        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }
 
        public string DataMember
        {
            get { return _datamember; }
        }
 
        public string DataFormat
        {
            get { return _format; }
        }
 
        public StringFormat Align
        {
            get { return _align; }
        }
 
        public Rectangle Rect
        {
            get { return _rect; }
            set { _rect = value; }
        }
 
        public bool Count
        {
            get { return _count; }
        }
 
        public Font Font
        {
            get { return _font; }
        }
 
        public Font HeaderFont
        {
            get { return _headerfont; }
        }
    }
 }


七、报表配置示例


 <?xml version="1.0" encoding="gb2312"?>
 <configuration>
  <pageset width="29.7" height="21" unit="cm" margin-left="1" margin-top="1" margin-right="1" margin-bottom="1" />
  <header height="90">
    <textitem key="ShopName" left="5" top="6" width="960" height="20" align="center" font-name="宋体" font-size="16" font-bold="1" text="" />
    <textitem key="Title" left="5" top="30" width="960" height="20" align="center" font-name="宋体" font-size="16" font-bold="1" text="消费明细报表" />
    <textitem key="Admin" left="0" top="60" width="300" height="24" text="" />
    <textitem key="Date" align="right" left="0" top="60" width="960" height="24" text="" />
  </header>
  <dataitem>
    <textitem key="Code" text="单号" data="Code" width="90" />
    <textitem key="Card" text="卡号" data="Card" width="100" />
    <textitem key="MemberName" text="姓名" data="MemberName" width="60" />
    <textitem key="ProductName" text="消费项目" data="ProductName" width="220" />
    <textitem key="Price" text="单价" data="Price" width="60" align="right" />
    <textitem key="Discount" text="折扣" data="Discount" width="60" align="right" />
    <textitem key="Quantity" text="数量" data="Quantity" width="60" align="right" />
    <textitem key="TCount" text="金额合计" data="TCount" width="60" align="right" />
    <textitem key="Score" text="商铺积分" data="Score" width="60" align="right" />
    <textitem key="MasterScore" text="平台积分" data="MasterScore" width="60" align="right" />
    <textitem key="AddTime" text="消费日期" data="AddTime" width="124" />
  </dataitem>
  <footer height="40">
    <textitem key="Count" left="5" top="10" width="400" height="24" text="" />
    <textitem key="Page" align="right" left="800" top="10" width="160" height="24">="第" & Globals!PageNumber & "页 共" & Globals!TotalPages & "页"</textitem>
  </footer>
 </configuration>



文章出处:http://www.cnblogs.com/faib/archive/2008/08/03/1259161.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]和\[2\]是关于C#中使用FastReport和System.Data.SqlClient的命名空间的引用。这些命名空间提供了在C#中生成报表所需的功能和类。引用\[3\]是一个关于使用本地动态数据作为测试用例来熟悉VS自带的ReportViewer控件的前言。 要在C#中生成报表,可以使用FastReport库。首先,确保已经安装了FastReport库,并在项目中引用了相应的命名空间。然后,可以使用FastReport提供的类和方法来创建和设计报表模板,设置数据源,填充数据,并最终生成报表。 另外,如果你想使用ReportViewer控件来生成报表,可以使用System.Data.SqlClient命名空间中的类来连接数据库并获取数据。然后,将数据绑定到ReportViewer控件上,以生成报表。 总之,要在C#中生成报表,你可以使用FastReport库或者使用ReportViewer控件,并根据需要引用相应的命名空间和类。 #### 引用[.reference_title] - *1* *2* [C#调用报表生成器成功案例示例研究](https://blog.csdn.net/RoffeyYang/article/details/118365066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C#——ReportView生成报表](https://blog.csdn.net/jiDxiaohuo/article/details/101371190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值