日期:2014-05-20  浏览次数:20909 次

C# WEBFORM报表打印问题!
protected void Button1_Click(object sender, EventArgs e)
  {  

  ......//为以下参数打开数据库取值;

  ReportDocument ocr = new ReportDocument();
  ocr.Load(Server.MapPath("~/SYYHPDJB.rpt"));
  //第一个参数是报表中的变量,第二个是传递给报表的变量
  ocr.SetParameterValue("djzsbh", djzsbh);
  ocr.SetParameterValue("hphm", hphm);
  ocr.SetParameterValue("hpzl", hpzl);
  ocr.SetParameterValue("xm", xm);
  ocr.SetParameterValue("zsdz", zsdz);
  ocr.SetParameterValue("yzbh", yzbh);
  ocr.SetParameterValue("lxdh", lxdh);
  ocr.SetParameterValue("sfzhm", sfzhm);
  ocr.SetParameterValue("sfzm", sfzm);
  ocr.SetParameterValue("sfzhm1", sfzhm1);
  ocr.SetParameterValue("sfzm1", sfzm1);
  ocr.SetParameterValue("xm1", xm1);
  ocr.SetParameterValue("djzsbh", djzsbh);
  //ocr.PrintOptions.PrinterName = @"\\Zshz-44f05c55cf\Canon iP1900 series";
  ocr.PrintToPrinter(1, false, 0, 0);
  }

在VS里运行得很好,代码也没有报错,怪就怪在当发布成为网站后,报表不能打印了。为什么呢?

请各大侠们“拔刀相助”


另:因为需求原因,机器不能连入互联网,为了解决这个问题,我在
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASP.NETClientFiles\CrystalReportWebFormViewer4\html
里的“crystalprinthost.html”这个文件进行了修改,令客户端能通过服务器下载“PrintControl.cab”包。
后来想想,会不会是因为我是直接把参数值SET到报表里,再直接从默认打印机打印,从而令JS不能调用“PrintControl.cab”包导致不能打印呢???



------解决方案--------------------
你自己做的一个按钮,那肯定是服务器端打印了。
所以那个cab根本用不上

而且肯定是服务器端打印

注:服务器端打印,打印机不一定非是连在服务器上的,但是必须要作为共享打印机装在服务器上
打印任务从服务器发出,传递给目标打印机

如果用的是工具栏自带的打印功能,那就直接是从本地的打印机发起的打印任务,跟服务器无关

你的代码
//这句必须
ocr.PrintOptions.PrinterName = @"\\Zshz-44f05c55cf\Canon iP1900 series";
ocr.PrintToPrinter(1, false, 0, 0);

你在自己机器上能打,是因为你调试时用的是admin账号,有全部权限
但是IIS上则是用的internet来宾账号,权限很悠闲,一般也没有访问打印机的权限
所以你还要开放打印机的权限
------解决方案--------------------
看来越来越复杂了,现在用一个替代的方案,如果不行,真的没有门了

这段代码可以放到以前代码的LOAD事件后面,连CrystalReportView控件也不用了,整个页面当成水晶报表预览(整个页面就是一个打开的PDF文件),客户端可能都要装PDF

......//为以下参数打开数据库取值;

ReportDocument ocr = new ReportDocument();
ocr.Load(Server.MapPath( "~/SYYHPDJB.rpt "));
//第一个参数是报表中的变量,第二个是传递给报表的变量
ocr.SetParameterValue( "djzsbh ", djzsbh);
ocr.SetParameterValue( "hphm ", hphm);
ocr.SetParameterValue( "hpzl ", hpzl);
ocr.SetParameterValue( "xm ", xm);
ocr.SetParameterValue( "zsdz ", zsdz);
ocr.SetParameterValue( "yzbh ", yzbh);
ocr.SetParameterValue( "lxdh ", lxdh);
ocr.SetParameterValue( "sfzhm ", sfzhm);
ocr.SetParameterValue( "sfzm ", sfzm);
ocr.SetParameterValue( "sfzhm1 ", sfzhm1);
ocr.SetParameterValue( "sfzm1 ", sfzm1);
ocr.SetParameterValue( "xm1 ", xm1);
ocr.SetParameterValue( "djzsbh ", djzsbh);
//ocr.PrintOptions.PrinterName = @ "\\Zshz-44f05c55cf\Canon iP1900 series ";
//ocr.PrintToPrinter(1, false, 0, 0);

//以下设置导出水晶报表的格式,位置及文件类型,一般不用word,excel,而用PDF是因为导出质量更好些
ExportOptions myExportOptions = new ExportOptions();
DiskFileDestinationOptions myDiskFileDestinationOptions = new DiskFileDestinationOptions();
//exports文件夹要有权限并存在
string myFileName = @ "C:\exports\ " + Session.SessionID.ToString() + ".pdf ";