本地生成RDL报表文件的创建工具

昨天尝试了一下,不使用Web Service,本地使用同样的方法
None.gif          string  strCon;
None.gif
None.gif        DataSet ds 
=   new  DataSet();
None.gif        XmlDataDocument xmlDataDoc;
None.gif
None.gif        strCon 
=   " Server=10.100.3.248;initial catalog=IGS-SMP-WorkTest;User Id=WorkDeveloper;Password=developer; " ;
None.gif
None.gif        
string  selectText  =   " SELECT * FROM SMP_WorkItem " ;
None.gif
None.gif        SqlDataAdapter dataAdapter 
=   new  SqlDataAdapter(selectText, strCon);
None.gif
None.gif
None.gif        
try
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            dataAdapter.Fill(ds);
InBlock.gif
InBlock.gif            xmlDataDoc 
= new XmlDataDocument(ds);
InBlock.gif
InBlock.gif            
using(XmlTextWriter writer = new XmlTextWriter("Your Report Location",System.Text.Encoding.UTF8))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif
InBlock.gif         
InBlock.gif            xmlDataDoc.WriteTo(writer);
InBlock.gif       
InBlock.gif            writer.Flush();
ExpandedSubBlockEnd.gif            }

InBlock.gif
ExpandedBlockEnd.gif        }

None.gif        
catch
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            xmlDataDoc 
= null;
ExpandedBlockEnd.gif        }

None.gif        
finally
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            strCon 
= null;
InBlock.gif            ds.Dispose();
ExpandedBlockEnd.gif        }

None.gif    }


然后在Shared Data Source里指定生成的文件路径,Query String根据微软的说明,为空就可以了。
但是不能正确识别XML文件格式,参照向导生成的格式,缺少了很多元素。

通过查找资料的时候发现一个解决方案,我们可以自己制作一个报表生成器,步骤如下:

1. 新建一个Console Application,建立报表生成器:
None.gif using  System;
None.gif
using  System.Collections;
None.gif
using  System.Data;
None.gif
using  System.Data.SqlClient;
None.gif
using  System.IO;
None.gif
using  System.Text;
None.gif
using  System.Xml;
None.gif
None.gif
namespace  RDLGenerator
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
class RdlGenerator
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        SqlConnection m_connection;
InBlock.gif        
string m_connectString;
InBlock.gif        
string m_commandText;
InBlock.gif        ArrayList m_fields;
InBlock.gif
InBlock.gif        
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            RdlGenerator myRdlGenerator 
= new RdlGenerator();
InBlock.gif            myRdlGenerator.Run();
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void Run()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
// Call methods to create the RDL
InBlock.gif
                this.OpenConnection();
InBlock.gif                
this.GenerateFieldsList();
InBlock.gif                
this.GenerateRdl();
InBlock.gif
InBlock.gif                Console.WriteLine(
"RDL file generated successfully.");
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
catch (Exception exception)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Console.WriteLine(
"An error occurred: " + exception.Message);
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
// Close the connection string
InBlock.gif
                m_connection.Close();
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void OpenConnection()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            TODO:OpenConnection
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif
InBlock.gif        
public void GenerateFieldsList()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            TODO:GenerateFieldsList
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif
InBlock.gif        
public void GenerateRdl()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif           TODO: GenerateRdl
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

2.创建你自己的数据库连接:
None.gif          public   void  OpenConnection()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
// Create a connection object
InBlock.gif
            m_connection = new SqlConnection();
InBlock.gif
InBlock.gif            
// Create the connection string
InBlock.gif
            m_connectString = "Your Connnection String
InBlock.gif
            m_connection.ConnectionString = m_connectString;
InBlock.gif
InBlock.gif            
// Open the connection
InBlock.gif
            m_connection.Open();
ExpandedBlockEnd.gif        }
3.获取你需要的数据:
None.gif
None.gif        
public   void  GenerateFieldsList()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            SqlCommand command;
InBlock.gif            SqlDataReader reader;
InBlock.gif
InBlock.gif            
// Executing a query to retrieve a fields list for the report
InBlock.gif
            command = m_connection.CreateCommand();
InBlock.gif            m_commandText 
=
InBlock.gif               
"Your SELECT STRING";
InBlock.gif            command.CommandText 
= m_commandText;
InBlock.gif
InBlock.gif            
// Execute and create a reader for the current command
InBlock.gif
            reader = command.ExecuteReader(CommandBehavior.SchemaOnly);
InBlock.gif
InBlock.gif            
// For each field in the resultset, add the name to an array list
InBlock.gif
            m_fields = new ArrayList();
InBlock.gif            
for (int i = 0; i <= reader.FieldCount - 1; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                m_fields.Add(reader.GetName(i));
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif

4.创建报表XML:
None.gif          public   void  GenerateRdl()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
// Open a new RDL file stream for writing
InBlock.gif
            FileStream stream;
InBlock.gif            stream 
= File.OpenWrite("Report1.rdl");
InBlock.gif            XmlTextWriter writer 
= new XmlTextWriter(stream, Encoding.UTF8);
InBlock.gif
InBlock.gif            
// Causes child elements to be indented
InBlock.gif
            writer.Formatting = Formatting.Indented;
InBlock.gif
InBlock.gif            
// Report element
InBlock.gif
            writer.WriteProcessingInstruction("xml""version=\"1.0\" encoding=\"utf-8\"");
InBlock.gif            writer.WriteStartElement(
"Report");
InBlock.gif            writer.WriteAttributeString(
"xmlns"null"http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
InBlock.gif            writer.WriteAttributeString(
"xmlns:rd"null"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
InBlock.gif            writer.WriteElementString(
"Width""6in");
InBlock.gif
InBlock.gif            
// DataSource element
InBlock.gif
            writer.WriteStartElement("DataSources");
InBlock.gif            writer.WriteStartElement(
"DataSource");
InBlock.gif            writer.WriteAttributeString(
"Name"null"DataSource1");
InBlock.gif            writer.WriteStartElement(
"ConnectionProperties");
InBlock.gif            writer.WriteElementString(
"DataProvider""SQL");
InBlock.gif            writer.WriteElementString(
"ConnectString", m_connectString);
InBlock.gif            writer.WriteElementString(
"IntegratedSecurity""false");
InBlock.gif            writer.WriteEndElement(); 
// ConnectionProperties
InBlock.gif
            writer.WriteEndElement(); // DataSource
InBlock.gif
            writer.WriteEndElement(); // DataSources
InBlock.gif
InBlock.gif            
// DataSet element
InBlock.gif
            writer.WriteStartElement("DataSets");
InBlock.gif            writer.WriteStartElement(
"DataSet");
InBlock.gif            writer.WriteAttributeString(
"Name"null"DataSet1");
InBlock.gif
InBlock.gif            
// Query element
InBlock.gif
            writer.WriteStartElement("Query");
InBlock.gif            writer.WriteElementString(
"DataSourceName""DataSource1");
InBlock.gif            writer.WriteElementString(
"CommandType""Text");
InBlock.gif            writer.WriteElementString(
"CommandText", m_commandText);
InBlock.gif            writer.WriteElementString(
"Timeout""30");
InBlock.gif            writer.WriteEndElement(); 
// Query
InBlock.gif
InBlock.gif            
// Fields elements
InBlock.gif
            writer.WriteStartElement("Fields");
InBlock.gif            
foreach (string fieldName in m_fields)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                writer.WriteStartElement(
"Field");
InBlock.gif                writer.WriteAttributeString(
"Name"null, fieldName);
InBlock.gif                writer.WriteElementString(
"DataField"null, fieldName);
InBlock.gif                writer.WriteEndElement(); 
// Field
ExpandedSubBlockEnd.gif
            }

InBlock.gif
InBlock.gif            
// End previous elements
InBlock.gif
            writer.WriteEndElement(); // Fields
InBlock.gif
            writer.WriteEndElement(); // DataSet
InBlock.gif
            writer.WriteEndElement(); // DataSets
InBlock.gif
InBlock.gif            
// Body element
InBlock.gif
            writer.WriteStartElement("Body");
InBlock.gif            writer.WriteElementString(
"Height""5in");
InBlock.gif
InBlock.gif            
// ReportItems element
InBlock.gif
            writer.WriteStartElement("ReportItems");
InBlock.gif
InBlock.gif            
// Table element
InBlock.gif
            writer.WriteStartElement("Table");
InBlock.gif            writer.WriteAttributeString(
"Name"null"Table1");
InBlock.gif            writer.WriteElementString(
"DataSetName""DataSet1");
InBlock.gif            writer.WriteElementString(
"Top"".5in");
InBlock.gif            writer.WriteElementString(
"Left"".5in");
InBlock.gif            writer.WriteElementString(
"Height"".5in");
InBlock.gif            writer.WriteElementString(
"Width", (m_fields.Count * 1.5+ "in");
InBlock.gif
InBlock.gif            
// Table Columns
InBlock.gif
            writer.WriteStartElement("TableColumns");
InBlock.gif            
for (int i = 0; i < m_fields.Count; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                writer.WriteStartElement(
"TableColumn");
InBlock.gif                writer.WriteElementString(
"Width""1.5in");
InBlock.gif                writer.WriteEndElement(); 
// TableColumn
ExpandedSubBlockEnd.gif
            }

InBlock.gif            writer.WriteEndElement(); 
// TableColumns
InBlock.gif
InBlock.gif            
// Header Row
InBlock.gif
            writer.WriteStartElement("Header");
InBlock.gif            writer.WriteStartElement(
"TableRows");
InBlock.gif            writer.WriteStartElement(
"TableRow");
InBlock.gif            writer.WriteElementString(
"Height"".25in");
InBlock.gif            writer.WriteStartElement(
"TableCells");
InBlock.gif
InBlock.gif            
foreach (string fieldName in m_fields)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                writer.WriteStartElement(
"TableCell");
InBlock.gif                writer.WriteStartElement(
"ReportItems");
InBlock.gif
InBlock.gif                
// Textbox
InBlock.gif
                writer.WriteStartElement("Textbox");
InBlock.gif                writer.WriteAttributeString(
"Name"null"Header" + fieldName);
InBlock.gif
InBlock.gif                writer.WriteStartElement(
"Style");
InBlock.gif                writer.WriteElementString(
"TextDecoration""Underline");
InBlock.gif                writer.WriteEndElement(); 
// Style
InBlock.gif

InBlock.gif                writer.WriteElementString(
"Top""0in");
InBlock.gif                writer.WriteElementString(
"Left""0in");
InBlock.gif                writer.WriteElementString(
"Height"".5in");
InBlock.gif                writer.WriteElementString(
"Width""1.5in");
InBlock.gif                writer.WriteElementString(
"Value", fieldName);
InBlock.gif                writer.WriteEndElement(); 
// Textbox
InBlock.gif

InBlock.gif                writer.WriteEndElement(); 
// ReportItems
InBlock.gif
                writer.WriteEndElement(); // TableCell
ExpandedSubBlockEnd.gif
            }

InBlock.gif
InBlock.gif            writer.WriteEndElement(); 
// TableCells
InBlock.gif
            writer.WriteEndElement(); // TableRow
InBlock.gif
            writer.WriteEndElement(); // TableRows
InBlock.gif
            writer.WriteEndElement(); // Header
InBlock.gif
InBlock.gif            
// Details Row
InBlock.gif
            writer.WriteStartElement("Details");
InBlock.gif            writer.WriteStartElement(
"TableRows");
InBlock.gif            writer.WriteStartElement(
"TableRow");
InBlock.gif            writer.WriteElementString(
"Height"".25in");
InBlock.gif            writer.WriteStartElement(
"TableCells");
InBlock.gif
InBlock.gif            
foreach (string fieldName in m_fields)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                writer.WriteStartElement(
"TableCell");
InBlock.gif                writer.WriteStartElement(
"ReportItems");
InBlock.gif
InBlock.gif                
// Textbox
InBlock.gif
                writer.WriteStartElement("Textbox");
InBlock.gif                writer.WriteAttributeString(
"Name"null, fieldName);
InBlock.gif
InBlock.gif                writer.WriteStartElement(
"Style");
InBlock.gif                writer.WriteEndElement(); 
// Style
InBlock.gif

InBlock.gif                writer.WriteElementString(
"Top""0in");
InBlock.gif                writer.WriteElementString(
"Left""0in");
InBlock.gif                writer.WriteElementString(
"Height"".5in");
InBlock.gif                writer.WriteElementString(
"Width""1.5in");
InBlock.gif                writer.WriteElementString(
"Value""=Fields!" + fieldName + ".Value");
InBlock.gif                writer.WriteElementString(
"HideDuplicates""DataSet1");
InBlock.gif                writer.WriteEndElement(); 
// Textbox
InBlock.gif

InBlock.gif                writer.WriteEndElement(); 
// ReportItems
InBlock.gif
                writer.WriteEndElement(); // TableCell
ExpandedSubBlockEnd.gif
            }

InBlock.gif
InBlock.gif            
// End Details element and children   
InBlock.gif
            writer.WriteEndElement(); // TableCells
InBlock.gif
            writer.WriteEndElement(); // TableRow
InBlock.gif
            writer.WriteEndElement(); // TableRows
InBlock.gif
            writer.WriteEndElement(); // Details
InBlock.gif
InBlock.gif            
// End table element and end report definition file
InBlock.gif
            writer.WriteEndElement(); // Table
InBlock.gif
            writer.WriteEndElement(); // ReportItems
InBlock.gif
            writer.WriteEndElement(); // Body
InBlock.gif
            writer.WriteEndElement(); // Report
InBlock.gif
InBlock.gif            
// Flush the writer and close the stream
InBlock.gif
            writer.Flush();
InBlock.gif            stream.Close();
ExpandedBlockEnd.gif        }

5.编译运行你的程序,选择Start Without Debugging.

然后一个rdl格式的报表文件就生成在你制定的目录了,你只要在Report Services Project中添加这个报表进一步设计就可以了。

不过我们可以主要到GenerateRdl方法中的XML基本都是手动方式添加元素,如果把前面的SqlDataReader换成DataSet,那么GenerateRdl方法中的语句也要重写,所以不是特别方便。

这里只是提供一种选择,是好事坏,是否选择,那就是使用者自己的事情了。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值