生活随笔
收集整理的這篇文章主要介紹了
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
;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
;report
.Render("Image", deviceInfo
, CreateStream
, out warnings
);return report
;}private List<Stream> m_streams
= null;private Stream CreateStream(string name
, string fileNameExtension
, Encoding encoding
, string mimeType
, bool willSeek
){Stream stream
= new MemoryStream();m_streams
.Add(stream
);return stream
;}private int m_currentPageIndex
= 0;public void Print(string printername
,Size size
){m_currentPageIndex
= 0;if (m_streams
== null || m_streams
.Count
== 0) return;PrintDocument printDoc
= new PrintDocument();printDoc
.PrinterSettings
.PrinterName
= printername
;if (!printDoc
.PrinterSettings
.IsValid
){MessageBox
.Show("未發現打印機 " + printDoc
.PrinterSettings
.PrinterName
, "提示", MessageBoxButtons
.OK
, MessageBoxIcon
.Exclamation
);return;}printDoc
.DefaultPageSettings
.Landscape
= false;printDoc
.DefaultPageSettings
.PaperSize
= new PaperSize("Custom Size 1", size
.Width
,size
.Height
);printDoc
.PrintPage
+= new PrintPageEventHandler(PrintPage
);printDoc
.Print();foreach (Stream stream
in m_streams
){stream
.Dispose();stream
.Close();}m_streams
= null;}private void PrintPage(object sender
, PrintPageEventArgs ev
){m_streams
[0].Position
= 0;Metafile pageImage
= new Metafile(m_streams
[0]);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打印票据的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。