日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 使用Microsoft.Reporting打印票据

發布時間:2024/8/1 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 使用Microsoft.Reporting打印票据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

打印票據的功能,很多軟件都用到,C# Winform開發的桌面管理軟件,大多數情況下需要打印票據功能。作為成熟的軟件,打印票據的功能需要滿足如下條件:
1、可以使用針式打印機自動打印,自動走紙。
2、可以靈活設置紙張尺寸。
3、票據設計和業務功能分開,數據可以自動“灌輸”到票據模板中。
4、可以動態加載模板,方便各單位選擇適合自己的票據模板,模板升級不需要調整代碼。
Microsoft.Reporting提供了票據打印功能,它可以操作畫布,通過自由繪制的方式打印各種報表,例如繪制表格,在指定位置打印文字等等。但是這種方式需要通過代碼操控,如果用戶提出需要調整票據格式,就需要升級程序。

有沒有辦法,報表的樣式不通過代碼操控,而是可視化編輯,最終表達到一個文件中,后期用戶如果要調整樣式,只需要升級這個文件呢?
需要用到Microsoft.Reporting + RDLC,RDLC負責模板設計,Microsoft.Reporting負責調用模板并控制打印。

```csharp public class PrintHelper3{private Size rdlcPageSize = new Size();public LocalReport LoadFile(string rdlcfile, string sourceName, DataTable sourceTable){LocalReport report = new LocalReport();//設置需要打印的報表的文件名稱。report.ReportPath = rdlcfile;//創建要打印的數據源ReportDataSource source = new ReportDataSource(sourceName, sourceTable);report.SetParameters(new ReportParameter[] {new ReportParameter("TimeNow", DateTime.Now.ToString()),new ReportParameter("ReportTitle", PubConstant.REPORTTITLE)});m_streams = new List<Stream>();report.DataSources.Add(source);//刷新報表中的需要呈現的數據report.Refresh();rdlcPageSize.Width = report.GetDefaultPageSettings().PaperSize.Width;rdlcPageSize.Height = report.GetDefaultPageSettings().PaperSize.Height;//OutputFormat 如果字體太大,可以用PDF格式,首選EMF格式//一等分一整張28cm,寬度是固定的:21.4cm;二等分高度是:13.9cm,三等分的話高度是9.3cm。 //紙寬指標反映出打印機最大打印寬度,通用打印機的該項指標一般為9英寸和13.6英寸;//紙厚度則反映出打印頭的擊打能力,這項指標對于需要復寫拷貝的用途很重要。string deviceInfo ="<DeviceInfo>" +"<OutputFormat>EMF</OutputFormat>" +"<PageWidth>21cm</PageWidth>" +"<PageHeight>13.9cm</PageHeight>" +"<MarginTop>0cm</MarginTop>" +"<MarginLeft>0cm</MarginLeft>" +"<MarginRight>0cm</MarginRight>" +"<MarginBottom>0cm</MarginBottom>" +"</DeviceInfo>";Warning[] warnings;//將報表的內容按照deviceInfo指定的格式輸出到CreateStream函數提供的Stream中。report.Render("Image", deviceInfo, CreateStream, out warnings);return report;}//聲明一個Stream對象的列表用來保存報表的輸出數據//LocalReport對象的Render方法會將報表按頁輸出為多個Stream對象。private List<Stream> m_streams = null;//用來提供Stream對象的函數,用于LocalReport對象的Render方法的第三個參數。private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek){//如果需要將報表輸出的數據保存為文件,請使用FileStream對象。Stream stream = new MemoryStream();m_streams.Add(stream);return stream;}//用來記錄當前打印到第幾頁了private int m_currentPageIndex = 0;public void Print(string printername,Size size ){//size = rdlcPageSize;m_currentPageIndex = 0;if (m_streams == null || m_streams.Count == 0) return;//聲明PrintDocument對象用于數據的打印PrintDocument printDoc = new PrintDocument();//指定需要使用的打印機的名稱,使用空字符串""來指定默認打印機printDoc.PrinterSettings.PrinterName = printername;//printDoc.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";//判斷指定的打印機是否可用if (!printDoc.PrinterSettings.IsValid){MessageBox.Show("未發現打印機 " + printDoc.PrinterSettings.PrinterName, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);return;}//聲明PrintDocument對象的PrintPage事件,具體的打印操作需要在這個事件中處理。//指定是否橫向打印 printDoc.DefaultPageSettings.Landscape = false;//827 552printDoc.DefaultPageSettings.PaperSize = new PaperSize("Custom Size 1", size.Width,size.Height);printDoc.PrintPage += new PrintPageEventHandler(PrintPage);//執行打印操作,Print方法將觸發PrintPage事件。//將寫好的格式給打印預覽控件以便預覽//PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();//printPreviewDialog1.Document = printDoc;//顯示打印預覽//DialogResult result = printPreviewDialog1.ShowDialog();printDoc.Print();//釋放資源foreach (Stream stream in m_streams){stream.Dispose();stream.Close();}m_streams = null;}private void PrintPage(object sender, PrintPageEventArgs ev){//Metafile對象用來保存EMF或WMF格式的圖形,//我們在前面將報表的內容輸出為EMF圖形格式的數據流。m_streams[0].Position = 0;Metafile pageImage = new Metafile(m_streams[0]);//這里的Graphics對象實際指向了打印機//這幾個參數很重要,否則會出現打印很大的現象int w = Convert.ToInt32(ev.PageBounds.Width / 1.8);int h = Convert.ToInt32(ev.PageBounds.Height / 1.8);ev.Graphics.DrawImage(pageImage, ev.PageBounds, 0, 0, w, h, System.Drawing.GraphicsUnit.Millimeter);m_streams[m_currentPageIndex].Close();m_currentPageIndex++;//設置是否需要繼續打印ev.HasMorePages = (m_currentPageIndex < m_streams.Count);} 需要留意RDLC設計器版本,有些版本的設計器,輸出的RDLC文件,使用LocalReport載入后,生成到Meta的文件出現莫名其妙的字體放大,無法控制寬度等問題,需要對尺寸等參數微調。

總結

以上是生活随笔為你收集整理的C# 使用Microsoft.Reporting打印票据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。