做系统,到大半了,到搞打印了,却没有有了思路......★要求打印送货单(一般的针式打印机连单纸)。如何在WEB页面上实现点击[打印]按钮直接打印出送货单到默认打印机(不要预览,连单可连续打印)?注:不要对我说导出到Excel,PDF之类的再打印,现不考虑该类方法
分可以另外开贴再加,为求正果!!

解决方案 »

  1.   

    一、利用IE内部打印组件: 
    这个方案也许是最简单的,当然不会很“专业”。我们假设客户端是IE6.0版本,因为在IE6.0中才完全体现我们所要应用的“打印模板机制”。它在精确控制页面边界,文本间隔,以及打印的统一性上,功能更为完备。 
      至于这种方案的实现也相当简单,它主要只涉及到DEVICERECT,LAYOUTRECT两种行为方式,分别用来定义整体页面风格及单个页面内容风格。而我们所要打印的HTML可以通过LAYOUTRECT的CONTENTSRC属性来指定。可喜的是即使我们有1000个页面要打印,也可以简单的通过我们的打印模板添加动态修建HTML功能,实现单模板控制多文件风格。(请参考本文所附代码)。这个方案在CSDN有详细的介绍,但没有附示例。示例文件可以在MSDN上下载得到。 
    二、利用外部DLL打印组件:   此类方案实现倒也不很复杂,只是利用DLL本身内部类函数操作,创建报表、格式并进行打印,而无需考虑内部实现环节。但对于WEB打印来说,似乎不合适。我个人认为在WEB上创建报表的HTML,然后利用客户端IE打印是最好的解决方式。而如果你的C#或VB不是很好,那么外部DLL的类型解决是一个很让人头疼的事情,何况还要应用到WEB环境下。这种方案我用傻儿的打印组件调试过,但没成功。 三、利用外部OCX类控件 
      这类方案和第二种差不多,也是建立在别人的成果的基础上,但是在ASP.net下,如果没有这个控件的说明书,我相信你也会和我一样,不知道该从哪里下手开始设计。 四、利用XML解析打印 
      这种解决方案在微软家园有很详细的介绍,其原理就是解析出定义好的XML格式标记,解读出文件中标记的参数定义,最后将这些信息还原成打印机输出的图形格式。很简单的理解,例如你要打印一个简单的表格,那么我们将表格解析成为文本和表格两部分,程式设计时我们遇到文本文本则输出文本到打印机,遇到表格标签即输出LINE到打印机。如此你可以自定义一些特殊的标签,如图片,特殊形状等。这种方案开发起来很简单,而且很“专业”,不过其缺点:客户端需要安装.NET FrameWork.(傻了。。) 五、转化为PDF文件,利用PDF打印 
      转化为其它类型的文件输出,是打印方案很常用的一种方式,而PDF文件格式以其优异的“品质”(打印品质)和“性能”(应用功能)无疑是一种很经济的方式。而且从WEB向PDF转换不是很困难,资源占用也不是很严重,这是它在同类方案中的优点,也是异类方案中的缺点。如此你可以去PDFCHINA上搜寻相关可用信息。 六、利用外部设计器设计报表,内部程式码控制打印 
      这里我针对思路来讲这种方案,并针对VISUAL DESIGNER报表组件。我们预先得利用设计器做好报表的格式,尔后在程式码里面住报表各表单“套值”,就这么简单。有点像ACCESS里面的报表设计方式。我所在公司的管理系统就是ACCESS写的,所以我其实挺喜欢这种方案。至于VISUAL DESIGNER可以在CSDN下载到,并有开发说明书。 七、自己写专业报表打印组件 
      这是*不得已的作法,当然更符合自己的要求,但是如果你不是专业的开发人员或有其它特殊目的,这些时间就不要花了。很罗索的。如果你有兴趣写,那么我建议你先看看第五种方案的思路和说明文档。   WEB打印至今还没有完美的解决方案,我个人期待IE在这一方面再加改进,以方便我们这一群“劳苦大众”。 八、打印頁面:<a href="javascript:window.print()"> 打印 </a> 
    打印时选择内容进行打印: 往往在打印网页时,执行window.print会把网页的所有内容全部打印,而有一大部分比如网页头部的图片、尾部的版权声明、按钮等,并没有必要打印出来,打印出来浪费时间又浪费油墨。如何把这些内容进行有选择的打印让你的打印文本更简洁明了,更省时美观呢?以下就对这个问题写一个JS文本,供有缘人参考。
      

  2.   

    <script language="javascript">
    function DtPrint() {
    if (window.print) {
    var p_1       = document.all.p_1.innerHTML;
    var p_2     = document.all.p_2.innerHTML;这里根据你要打印的哪些内容,从原显示页面中用
    <div id=P_1>p_1....</div><div id=P_2>p_2...</div>等标示,要打印多少项目就用多少下
    提示一下,自己体会:),此处我只写出两个出来:Dvar css = '<style type="text/css">' +
      'p {  line-height: 120%}' +
      '.ftitle {  line-height: 120%; font-size: 18px; color: #000000}' +
      'td {  font-size: 10px; color: #000000}' +
      '</style>' ;这里是定义打印用的CSS,可以根据你自己的设定去写适合你的格式哦
    本文只定义三个,p,.ftitle,td,其余自己写。越美观越好。var body ='<table width="640" border="0" cellspacing="0" cellpadding="5">' +
         '  <tr> ' +
         '    <td  class="fbody"> ' +
         '      <div align="center" class=ftitle>' + p_title + '</div>' + p_2 + 
         '    </td>' +
         '  </tr>' +
         '</table>';body这才是你重新设置的打印格式,根据你的打印要求,重新把原显示网页的DIV内容重新
    组合,可以根据你原来的表格内容,去掉不要打印的东东,只调用你要打印的内容
    另外:根据经验,表格大小为640左右正好是适合A4打印幅面!哈!document.body.innerHTML = '<center>' + css + body + '</center>';然后在这里把document.body重新设一下,这就是打印文档!(有加CSS格式了)window.print();}
    }
    </SCRIPT>在页面中,然后通过:dtPrint()调用,就行了
    比如:
    <input type="button" value="打印" LANGUAGE="javascript" onclick="return 
    dtPrint()" ID="Button2" NAME="Button1">噢!注意这个可以不用<div></div>标示哦,即使标示,也不用在以上打印文本中调用出来,那样这个Button就不会打印出来了哦
      

  3.   

    谢谢goody9807() ,
    你的方案是打印web页面,
    我想实现的不是直接打印当前页面,想通过水晶报表之类方法,先设定好打印格式,
    传送数据,再直接无预览打印(不好意思,开头没有说明白)。好像Crystal Reports 10 可以实现(?),谁有做过,给点思路
      

  4.   

    二、使用CrystalReportViewer进行预览
    CrystalReportViewer控件允许在应用程序中查看 Crystal Report。ReportSource 属性用于设置要查看哪个报表。该属性设置之后,报表显示在查看器中。报表源可以是ReportDocument、报表文件的路径,也可以是强类型报表。
    1.打开“工具箱”,并将一个 CrystalReportViewer 拖到窗体上,我们命名为rptVew。 
    2.通过拖放操作将 Windows 窗体查看器调整到希望的大小并将其移动到所需位置。 
    3.当运行应用程序时,报表将显示在查看器中。
    三、创建新报表
    1.指向“添加”,单击“添加新项”。 
    2.在“添加新项”对话框中,从“模板”区域选择 Crystal Report,将报表命名为rptClient,单击“打开”。 
    3.在 Crystal Report 库中,选择下列选项之一: 
    &#8226;使用报表专家 — 指导您完成报表的创建过程,并将您的选择添加到 Crystal Report Designer。 
    &#8226;作为空白报表 — 打开 Crystal Report Designer。 
    &#8226;来自于现有的报表 — 创建新报表,它与指定的另一报表设计相同。 
    注意   Crystal Report 库包含许多专家,可以指导您完成数个特定类型报表的创建工作。您可能希望使用专家来创建最初的报表,以确定哪种报表构造方法适合您的需要。
    4.单击“确定”按钮。 
    如果选择使用“报表专家”,便会出现“报表专家”对话框,并带有数据资源管理器。为每个文件夹选择所需数据,完成“报表专家”选项卡界面上的操作,然后单击“完成”来访问 Crystal Report Designer 和您的报表
    四、是否需要动态设置数据源?
    Crystal Reports 通过数据库驱动程序与数据库连接。每个驱动程序都被编写为可处理特定数据库类型或数据库访问技术。 
    拉和推模型
    为了向开发人员提供最灵活的数据访问方法,Crystal Reports 数据库驱动程序被设计为可同时提供数据访问的拉模型和推模型。 
    拉模型
      

  5.   

    相反,推模型需要开发人员编写代码以连接到数据库,执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在 Crystal Reports 收到数据之前先将数据筛选出来。 四、从 ADO.NET 数据集制作报表
    从数据库创建数据集对象
    1.在项目中新建一个架构文件: 
    a.在解决方案资源管理器中,右击项目名,指向“添加”,然后单击“添加新项”。 
    b.在“添加新项”对话框的“类别”区域,展开文件夹,然后选择“数据”。 
    c.在“模板”区域选择“数据集”。 
    d.接受默认名称 Dataset1.xsd。 
    这就创建了一个新的架构文件 (Dataset1.xsd),以后将用它来生成强类型数据集。该架构文件将显示在 ADO.NET 数据集设计器中。 
    2.指定数据库位置: 
    a.在服务器资源管理器中,右击“数据连接”并选择“添加连接”。 
    b.在“数据链接属性”对话框中,单击“提供程序”选项卡,然后选择一个提供程序(例如 Microsoft OLE DB Provider for SQL Server)。 
    c.单击“连接”选项卡,然后指定您的数据库所在位置。在所需位置输入服务器和登录信息。 
    d.单击“确定”按钮。 
    此时,您的数据库及其表和字段就出现在服务器资源管理器的“数据连接”节点下面。 
    3.在解决方案资源管理器中,双击 Dataset1.xsd (如果它尚不是活动视图)。 
    Dataset1.xsd 现在应显示在“数据集”选项卡中。 
    4.若要为数据集建立架构,请将需要的表从服务器资源管理器中拖动到 Dataset1.xsd 的“数据集”选项卡上。 
    5.单击“保存 Dataset1.xsd”来保存“Dataset1.xsd”文件。 
    6.在“生成”菜单上,单击“生成”为项目生成数据集对象。 
    ADO.NET 数据集对象提供数据的描述,从它可以向 Crystal report 添加表。使用 Crystal Report Designer 中的“数据库专家”从 ADO.NET 数据集对象添加表。 
    请在使用“报表专家”创建新报表时调用“数据库专家”。或者,要从一个已经使用 ADO.NET 建立好的报表中访问“数据库专家”,请在 Report Designer 中右击,指向“数据库”,然后单击“添加/删除数据库”。
    将报表连接到 ADO.NET 数据集对象 
    1.在“数据库专家”中,展开“项目数据”文件夹。 
    2.展开“ADO.NET 数据集”文件夹。 
    3.选择所需数据集对象。 
    例如,如果当时使用的是从项目“WindowsApplication1”的架构文件“Dataset1.xsd”中生成的数据集对象,则应该选择“WindowsApplication1.Dataset1”。 
    4.选择要向报表中添加的表,和使用其他数据源一样。
      

  6.   

    谢谢 goody9807() !WinForm下的水晶报表我是做过的,但Web下的报表打印让我郁闷了.....
      

  7.   

    see:
    ------------------------------
    <html>
    <head>
    <title>广东省专业人员技术资格考试中心</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <link href="images/pro.css" rel="stylesheet" type="text/css">
    <script language="javascript">
    <!--
    function print_onclick() {
    form1.print.style.display = "none"
    form1.after.style.display = "none"
    window.print()
    document.location.href = 'zkz.asp?p=1'
    }
    -->
    </script>
    </head>
    <body>
    <form name="form1">
    <INPUT type="button" value="请装好A4纸后按此处打印" name="print" LANGUAGE="javascript" onclick="return print_onclick()"
    class="btn_04"> <INPUT type="button" value="以后打印" name="after" onclick="javascript:window.close();" class="btn_04">
    </form>
    <div align="center">
                        .........
    </body>
    </html>
      

  8.   

    这里结了,请楼上各位到
    http://community.csdn.net/Expert/topic/3494/3494729.xml?temp=.2091333 新贴看看多谢各位!