在ASP.NET C#中直接打印Crystal报表
Print Crystal Report Directly in ASP.NET C#
我正在使用 SQL 服务器存储过程在 Crystal 报告中填充数据。我能够通过使用 CR 中的公式传递和格式化每列的参数来实现我想要的打印输出。
在打印报告时,通常的过程是它会在Crystal 报告查看器中预览创建/生成的输出,然后,有打印、导出选项,它会首先将报告转换为 PDF 以继续到打印功能
我要的是当我点击打印按钮的时候,会自动跳出打印程序。
我被引导到这个 link 的答案 How to print crystal report directly to a client machine using C# Asp.net
using oReportDocument.PrintToPrinter(1,true,0,0);
代码,其他人也建议在页面初始化中填充数据集,但我似乎不知道该怎么做。
这是我当前的工作代码(通常的打印过程,它将首先引导您进入 Crystal 报告预览。
public partial class Report_MonthlySalesReportPrint : System.Web.UI.Page
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
ReportDocument report = new ReportDocument();
protected void Page_Load(object sender, EventArgs e)
{
con.Open();
//Parameters to be passed as needed in formulas in Report
string RP = Session["RP"].ToString();
DateTime cms = Convert.ToDateTime(Session["CurrentMonthStart"].ToString());
string Loc = Session["Location"].ToString();
string MonthCurrent = Session["MonthCurrent"].ToString();
string YearCurrent = Session["YearCurrent"].ToString();
string MonthPrevious = Session["MonthPrevious"].ToString();
string YearPrevious = Session["YearPrevious"].ToString();
string MonthLastYear = Session["MonthLastYear"].ToString();
string YearLastYear = Session["YearLastYear"].ToString();
report.Load(Server.MapPath("MSRC.rpt"));
CrystalReportViewer1.ReportSource = report;
CrystalReportViewer1.ReuseParameterValuesOnRefresh = true;
CrystalReportViewer1.DataBind();
report.SetParameterValue(0, MonthLastYear);
report.SetParameterValue(1, MonthCurrent);
report.SetParameterValue(2, MonthPrevious);
report.SetParameterValue(3, RP);
report.SetParameterValue(4, Loc);
report.SetParameterValue(5, cms);
report.SetParameterValue(6, YearCurrent);
report.SetParameterValue(7, YearPrevious);
report.SetParameterValue(8, YearLastYear);
report.PrintToPrinter(1, true, 0, 0);
con.Close();
}
}
更新:
我只是需要这个来更新以澄清以下接受的答案仅适用于服务器端。这意味着当用户远程访问服务器时,代码将不起作用。
using System.Drawing.Printing;
using Crystal Decisions.CrystalReports.Engine;
using Crystal Decisions.Shared;
protected void Page_Load(object sender, EventArgs e)
{
void();
}
public void()
{
try
{
ReportDocument crystalReport = new ReportDocument();
crystalReport.Load(Server.MapPath("~/CrystalReport2.rpt"));
DataSet dsCustomers = GetData("select * from visitor_details where id ='" + Session["sessionvid"] + "' and plant ='" + Session["sessionplant"] + "'");
DataTable dataTable = dsCustomers.Tables[0]; crystalReport.Database.Tables["visitor_details"].SetDataSource((DataTable)dataTable);
CrystalReportViewer2.ReportSource = crystalReport;
CrystalReportViewer2.Zoom(100);
//crystalReportViewer1.ExportReport() ;
CrystalReportViewer2.RefreshReport();
crystalReport.PrintOptions.PrinterName = GetDefaultPrinter();
crystalReport.PrintToPrinter(1, false, 0, 0);
}
catch
{
Response.Write("<script LANGUAGE='JavaScript' >alert('connect printer settings')</script>");
}
}
这对我有用。如果需要,您可以创建自己的 PageSettings
,否则只需使用一个空的。
如果你想打开打印对话,只需使用PrintDialog
;
using System.Windows.Forms;
//...
ReportClass report = new ReportClass();
report.FileName = @"C:/Layout.rpt";
report.Load();
report.SetDataSource(YourSource);
PrinterSettings settings = new PrinterSettings();
PrintDialog pdialog = new PrintDialog();
if (pdialog.ShowDialog() == DialogResult.OK)
{
settings = pdialog.PrinterSettings;
}
report.PrintToPrinter(settings, new PageSettings() { }, false);
1.客户端打印
这是在基于 Web 的应用程序中进行打印的最理想方法,因为大多数用户肯定会远程访问服务器。
将此 javascript 代码放在 crystal 报告查看器所在的 .aspx 页面的 head 标记内。
<script type="text/javascript">
function Print() {
var dvReport = document.getElementById("dvReport");
var frame1 = dvReport.getElementsByTagName("iframe")[0];
if (navigator.appName.indexOf("Internet Explorer") != -1) {
frame1.name = frame1.id;
window.frames[frame1.id].focus();
window.frames[frame1.id].print();
}
else {
var frameDoc = frame1.contentWindow ? frame1.contentWindow : frame1.contentDocument.document ? frame1.contentDocument.document : frame1.contentDocument;
frameDoc.print();
}
}
</script>
同一个页面,在正文标签中放这个
<body>
<form id="form1" runat="server">
<asp:Button ID="btnPrint" runat="server" Text="Print Directly" OnClientClick="Print()"></asp:Button>
<div id="dvReport">
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" ToolPanelView="None" EnableDatabaseLogonPrompt="false" />
</div>
</form>
</body>
--
注意那里的按钮。它应该在包含 crystal 报表查看器的 div 之外。这肯定会奏效。请参阅有关此方法的完整讨论:http://www.aspsnippets.com/Articles/Print-Crystal-Report-on-Client-Side-on-Button-Click-using-JavaScript-in-ASPNet.aspx
2。服务器端打印
此处最推荐的答案是 printToPrinter() 函数。此方法在服务器端完成,因此,当您远程访问基于 Web 的应用程序/网站的服务器时,它会受到限制,除非客户端可以映射或访问服务器打印机。
请阅读此内容以获取更多信息:http://aspalliance.com/509_Automatically_Printing_Crystal_Reports_in_ASPNET.3
CrystalReportSaleSlip _CrystalReportSaleSlip = new CrystalReportSaleSlip();
_CrystalReportSaleSlip.SetDataSource(dtReport);
_CrystalReportSaleSlip.PrintOptions.PrinterName = "Hp Laserjet M1522 MFP Series PCL 6";
_CrystalReportSaleSlip.PrintToPrinter(1, false, 0, 0);
crystalReportViewer1.Refresh();
只有在服务器中配置了打印机,PrintToPrinter 才会工作。对于客户端,这可能不起作用,因为打印机可能未列出
我正在使用 SQL 服务器存储过程在 Crystal 报告中填充数据。我能够通过使用 CR 中的公式传递和格式化每列的参数来实现我想要的打印输出。
在打印报告时,通常的过程是它会在Crystal 报告查看器中预览创建/生成的输出,然后,有打印、导出选项,它会首先将报告转换为 PDF 以继续到打印功能
我要的是当我点击打印按钮的时候,会自动跳出打印程序。
我被引导到这个 link 的答案 How to print crystal report directly to a client machine using C# Asp.net
using oReportDocument.PrintToPrinter(1,true,0,0);
代码,其他人也建议在页面初始化中填充数据集,但我似乎不知道该怎么做。
这是我当前的工作代码(通常的打印过程,它将首先引导您进入 Crystal 报告预览。
public partial class Report_MonthlySalesReportPrint : System.Web.UI.Page
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
ReportDocument report = new ReportDocument();
protected void Page_Load(object sender, EventArgs e)
{
con.Open();
//Parameters to be passed as needed in formulas in Report
string RP = Session["RP"].ToString();
DateTime cms = Convert.ToDateTime(Session["CurrentMonthStart"].ToString());
string Loc = Session["Location"].ToString();
string MonthCurrent = Session["MonthCurrent"].ToString();
string YearCurrent = Session["YearCurrent"].ToString();
string MonthPrevious = Session["MonthPrevious"].ToString();
string YearPrevious = Session["YearPrevious"].ToString();
string MonthLastYear = Session["MonthLastYear"].ToString();
string YearLastYear = Session["YearLastYear"].ToString();
report.Load(Server.MapPath("MSRC.rpt"));
CrystalReportViewer1.ReportSource = report;
CrystalReportViewer1.ReuseParameterValuesOnRefresh = true;
CrystalReportViewer1.DataBind();
report.SetParameterValue(0, MonthLastYear);
report.SetParameterValue(1, MonthCurrent);
report.SetParameterValue(2, MonthPrevious);
report.SetParameterValue(3, RP);
report.SetParameterValue(4, Loc);
report.SetParameterValue(5, cms);
report.SetParameterValue(6, YearCurrent);
report.SetParameterValue(7, YearPrevious);
report.SetParameterValue(8, YearLastYear);
report.PrintToPrinter(1, true, 0, 0);
con.Close();
}
}
更新:
我只是需要这个来更新以澄清以下接受的答案仅适用于服务器端。这意味着当用户远程访问服务器时,代码将不起作用。
using System.Drawing.Printing;
using Crystal Decisions.CrystalReports.Engine;
using Crystal Decisions.Shared;
protected void Page_Load(object sender, EventArgs e)
{
void();
}
public void()
{
try
{
ReportDocument crystalReport = new ReportDocument();
crystalReport.Load(Server.MapPath("~/CrystalReport2.rpt"));
DataSet dsCustomers = GetData("select * from visitor_details where id ='" + Session["sessionvid"] + "' and plant ='" + Session["sessionplant"] + "'");
DataTable dataTable = dsCustomers.Tables[0]; crystalReport.Database.Tables["visitor_details"].SetDataSource((DataTable)dataTable);
CrystalReportViewer2.ReportSource = crystalReport;
CrystalReportViewer2.Zoom(100);
//crystalReportViewer1.ExportReport() ;
CrystalReportViewer2.RefreshReport();
crystalReport.PrintOptions.PrinterName = GetDefaultPrinter();
crystalReport.PrintToPrinter(1, false, 0, 0);
}
catch
{
Response.Write("<script LANGUAGE='JavaScript' >alert('connect printer settings')</script>");
}
}
这对我有用。如果需要,您可以创建自己的 PageSettings
,否则只需使用一个空的。
如果你想打开打印对话,只需使用PrintDialog
;
using System.Windows.Forms;
//...
ReportClass report = new ReportClass();
report.FileName = @"C:/Layout.rpt";
report.Load();
report.SetDataSource(YourSource);
PrinterSettings settings = new PrinterSettings();
PrintDialog pdialog = new PrintDialog();
if (pdialog.ShowDialog() == DialogResult.OK)
{
settings = pdialog.PrinterSettings;
}
report.PrintToPrinter(settings, new PageSettings() { }, false);
1.客户端打印
这是在基于 Web 的应用程序中进行打印的最理想方法,因为大多数用户肯定会远程访问服务器。
将此 javascript 代码放在 crystal 报告查看器所在的 .aspx 页面的 head 标记内。
<script type="text/javascript">
function Print() {
var dvReport = document.getElementById("dvReport");
var frame1 = dvReport.getElementsByTagName("iframe")[0];
if (navigator.appName.indexOf("Internet Explorer") != -1) {
frame1.name = frame1.id;
window.frames[frame1.id].focus();
window.frames[frame1.id].print();
}
else {
var frameDoc = frame1.contentWindow ? frame1.contentWindow : frame1.contentDocument.document ? frame1.contentDocument.document : frame1.contentDocument;
frameDoc.print();
}
}
</script>
同一个页面,在正文标签中放这个
<body>
<form id="form1" runat="server">
<asp:Button ID="btnPrint" runat="server" Text="Print Directly" OnClientClick="Print()"></asp:Button>
<div id="dvReport">
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="true" ToolPanelView="None" EnableDatabaseLogonPrompt="false" />
</div>
</form>
</body>
-- 注意那里的按钮。它应该在包含 crystal 报表查看器的 div 之外。这肯定会奏效。请参阅有关此方法的完整讨论:http://www.aspsnippets.com/Articles/Print-Crystal-Report-on-Client-Side-on-Button-Click-using-JavaScript-in-ASPNet.aspx
2。服务器端打印
此处最推荐的答案是 printToPrinter() 函数。此方法在服务器端完成,因此,当您远程访问基于 Web 的应用程序/网站的服务器时,它会受到限制,除非客户端可以映射或访问服务器打印机。
请阅读此内容以获取更多信息:http://aspalliance.com/509_Automatically_Printing_Crystal_Reports_in_ASPNET.3
CrystalReportSaleSlip _CrystalReportSaleSlip = new CrystalReportSaleSlip();
_CrystalReportSaleSlip.SetDataSource(dtReport);
_CrystalReportSaleSlip.PrintOptions.PrinterName = "Hp Laserjet M1522 MFP Series PCL 6";
_CrystalReportSaleSlip.PrintToPrinter(1, false, 0, 0);
crystalReportViewer1.Refresh();
只有在服务器中配置了打印机,PrintToPrinter 才会工作。对于客户端,这可能不起作用,因为打印机可能未列出