在我們開發各種工具軟件的時候,我們不可避免的會遇到打印的問題。而使用.NET開發打印功能,水晶報表或許會是一個十分不象錯的選擇!
一般步驟:
- 准備好想要打印的數據源;
- 制作用於規定打印結果樣式的模板文件(.rpt);
- 創建用於打印的執行窗口Form1,並在其中放置一個CrystalReportViewer (第三方控件,來自SAP)
- 創建打印按鍵所在的Form2;
- 獲取系統所能使用的打印機;
- 設置使用的打印機,及打印相關參數;
- 使用Form2調用Form1完成打印。
水晶報表的一般概念
水晶報表的兩種模式:
- 拉 PULL:設置好數據連接之后,使用水晶報表文件中所使用的獲得數據的方式,由水晶報表自己解決數據獲取操作。
- 推 PUSH:使用DataSet裝載數據,然后填充到水晶報表中,再按照水晶報表的格式來展示。
相關控件:
- CrystalReportViewer 「數據展示者」「ASP.NET & WinForm」
- CrystalReportSource 「數據提供者」「ASP.NET」
- CrystalReport 「數據提供者」「WinForm」
命名空間:
- CrystalDecisions.Shared
- CrystalDecisions.CrystalReports.Engine
相關成員:
| 類名 |
成員名 |
描述 |
| CrystalReport |
Load |
加載水晶報表(.rpt)文件 |
| |
SetDatabaseLogon |
設置數據庫連接,PULL中會用到 |
| |
SetParameterValue |
設置報表值 |
| |
|
|
| CrystalReportViewer |
ReportSource |
設置報表數據源 |
| |
DataBind |
綁定數據源 |
| |
|
|
| CrystalReportSource |
ReportDocument.Load |
加載水晶報表(.rpt)文件,Server.MapPath("*********.rpt") |
| |
ReportDocument.SetDatabaseLogon |
設置數據庫連接,PULL中會用到 |
| |
ReportDocument.SetParameterValue |
設置報表值 |
| |
|
|
具體實現
打印模板文件樣式

Form2樣式


Form2using System.Windows;
// 引入可以訪問 app.config 中的項
using System.Drawing.Printing; // 打印必須
namespace csdemo.reportdemo
{
/// <summary>
/// MainWindow.xaml 的交互邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 獲取可用打印機
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, RoutedEventArgs e)
{
comboBox1.Items.Clear();
foreach (var item in PrinterSettings.InstalledPrinters)
{
comboBox1.Items.Add(item.ToString());
}
comboBox1.SelectedIndex = 0;
}
/// <summary>
/// 打印機名稱
/// </summary>
private string _printerName=string.Empty;
/// <summary>
/// 設置打印機
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, RoutedEventArgs e)
{
_printerName = comboBox1.SelectedValue.ToString();
}
/// <summary>
/// 調用打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, RoutedEventArgs e)
{
PrintWindow pw = new PrintWindow();
pw.printerName = _printerName;
pw.Show();
pw.Close();
}
}
}

Form1using System.Windows;
using System.Data.SqlClient;
using CrystalDecisions.CrystalReports.Engine;
namespace csdemo.reportdemo
{
/// <summary>
/// PrintWindow.xaml 的交互邏輯
/// </summary>
public partial class PrintWindow : Window
{
public PrintWindow()
{
InitializeComponent();
Data_Binding();
}
public string printerName = string.Empty;
private void Data_Binding()
{
System.Data.DataSet ds = new System.Data.DataSet();
SqlConnection conn = new SqlConnection();
conn.ConnectionString = @"Data Source=192.168.0.196;Initial Catalog=NewEMaxTest;Persist Security Info=True;User ID=sa;Password=qwerta";
conn.Open();
string cmd = "select * from TBusRetail";
SqlDataAdapter da = new SqlDataAdapter(cmd, conn);
da.Fill(ds, "TBusRetail");
conn.Close();
string pathRpt = @"D:\Projects\csdemo\branches\csdemo2010\csdemo.reportdemo\ReportFile\DemoCrystalReport.rpt";
// ****************************************************
ReportDocument repostDoc = new ReportDocument();
repostDoc.Load(pathRpt); // 加載打印模板文件
repostDoc.SetDataSource(ds); // 設置數據源
repostDoc.PrintOptions.PrinterName = printerName; // 設置打印機名稱
repostDoc.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4; // 設置打印紙張樣式
repostDoc.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.DefaultPaperOrientation;
repostDoc.PrintToPrinter(1, false, 1, 1); // 只打印一頁,不核對,從第 0 頁打印到第0頁
// ****************************************************
// 如果要顯示數據的話,就可以使用這個來在Viwer中綁定數據源了。
// crv.ViewerCore.ReportSource = repostDoc;
}
}
}
注意:
- 在使用VS2010配合水晶報表時,需要更改工程的目標框架為「.NET Framework 4」不然會出現錯誤。
- 我在使用的時候,不知道是不是我個人機器的原因,一真會提示有一個文件在「dotnet1」下找不到,之后我到它的上級目錄拷貝了相關的文件過去就好了~
參考網摘:
- C#水晶報表教程
- C#實現打印功能