VS2003下水晶報表的列印比較麻煩,看到有些朋友在為此而苦惱,分享一下偶的做法:
如果是局域網內中,可參考下面的步驟:
1.增加列印按鈕,其代碼如下

Dim rpt As ReportDocument = Session("report")

Dim pv() As String = Split(TextBox1.Text, ";")'TextBox1.text為點列印按鈕時返回的印表機及邊界的設定值,以;分隔

Dim margins As CrystalDecisions.Shared.PageMargins

If pv(0) > pv(1) Then

If Not IsStartupScriptRegistered("Startup") Then

Page.RegisterStartupScript("Startup", "<script language=javascript>window.alert('列印頁數設定錯誤!@_@')</script>")

End If

Exit Sub

End If


' 取得 PageMargins 結構並設定

' 報表的邊界。

margins = rpt.PrintOptions.PageMargins

margins.leftMargin = pv(6)

margins.rightMargin = pv(7)

margins.topMargin = pv(4)

margins.bottomMargin = pv(5)

' 套用頁面邊界。

rpt.PrintOptions.ApplyPageMargins(margins)


' 選取印表機。

rpt.PrintOptions.PrinterName = pv(3)

' 列印報表。將 startPageN 及 endPageN

' 參數設定為 0 即可列印所有頁面。

Try

rpt.PrintToPrinter(pv(2), False, pv(0), pv(1))

Catch exp As LoadSaveReportException

If Not IsStartupScriptRegistered("Startup") Then

Page.RegisterStartupScript("Startup", "<script language=javascript>window.alert('開啟報表檔時發生錯誤!@_@')</script>")

End If

Catch exp As PrintException

If Not IsStartupScriptRegistered("Startup") Then

Page.RegisterStartupScript("Startup", "<script language=javascript>window.alert('列印時發生錯誤,請檢查印表機相關設定!@_@')</script>")

End If

Catch exp As Exception

If Not IsStartupScriptRegistered("Startup") Then

Page.RegisterStartupScript("Startup", "<script language=javascript>window.alert('錯誤來源:" & exp.Source & "!@_@')</script>")

End If

End Try
2.增設列印設定頁面,包括印表機名稱及邊界,列印頁數等的設定,當點列印按鈕後秀出該列印設定頁面並將值返回至報表頁面的TextBox1中
P.S.值得注意:
1.服務器上要安裝所需用的印表機,建議印表機位址設成IP或用PrintServer
2.印表機盡可能選用功能完備的,偶之前有遇到過用HP1022對有些報表印不出,有些卻正常,而換用HP1200或HP3300,HP3390,EPSON LQ-680K等均正常