C# winform中的打印文件的实现方式

C# winform中的打印方式

在开发winform时,有时候会需要用到打印功能,在项目中原有的打印功能是先放一个模板文件,然后将自己需要打印的文件,放入模板文件,最后再打印出来。这样的实现方式是可以实现大多数的打印的,但是因为我从事的是工业互联网,服务的客户的硬件设备都还是比较落后的,有的系统还是win7,设置还有xp系统,这样就可能会导致格式不兼容的问题。比如最近客户要求打印的时候直接打印出发票格式,不想点击纸张格式来设置。用项目中原有的方法,在win10系统下,可以通过设置文件的打印格式,或者是设置打印机的首选项来满足客户的需求,但是我的客户用的是xp系统,无论我这边通过代码还是文件指定,又或者是指定打印机首选项都不能满足客户需求,最后我选择了重新绘制的方法来重新实现打印功能。在记录这种方法之前还是先学习一下项目中原有的打印功能,这样更能加深印象,而且在第一种方法可以满足客户需求的前提下,第一种实现方法要比第二种方便很多。

使用Excel.workbook来实现

首先在在管理解决方案的nuget中下载安装Microsoft.office.Interop.Excel。然后主要实现的代码如下:

 Microsoft.Office.Interop.Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();
 			//打开模板文件
            byte[] buff = Properties.Resources.OC2;
            File.WriteAllBytes("OC2.xls", buff);
            string path = Application.StartupPath; //获取当前路径
            Microsoft.Office.Interop.Excel.Workbook book = myExcel.Application.Workbooks.Add(path + @"\OC2.xls");
            Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)book.Worksheets[1];
            //指定为横向打印
            xlSheet.PageSetup.Orientation = Microsoft.Office.Interop.Excel.XlPageOrientation.xlPortrait;
            //指定纸张大小
            xlSheet.PageSetup.PaperSize = Microsoft.Office.Interop.Excel.XlPaperSize.xlPaperA4;
            //这里就是赋值过程,是给指定excle单元格赋值
            xlSheet.Cells[2, 9].Value += wp.getProcessNameStr(this.mProcCheckInfo.ProcId);
            xlSheet.Cells[3, 1].Value += this.mProcCheckInfo.MoldNum;
            xlSheet.PrintPreview();//打印预览
     

可以看的到这里的赋值过程是比较清楚的,就是将我们需要打印出来的值赋值到我们的模板excel文件中去。最后再调用打印来打印文件。

自已绘制指定纸张大小打印

上面有一行代码是指点纸张大小,默认的有常见的纸张大小,并不能自定义纸张大小。为了实现自定义纸张大小,首先要在页面中添加PrintDocument控件和PrintPreviewDialog控件。具体实现部分代码如下:

//指定纸张大小,这里的单位是英寸不是厘米,需要计算一下,百度上有换算计算机
 this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", 800, 551);

 this.printDocument1.PrintPage += new PrintPageEventHandler(this.MyPrintDocument_PrintPage);


        private void MyPrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
           //画图 
            Image newImage = Properties.Resources.logor;
            //前两个数表示起始点坐标,后两个点表示长宽
            e.Graphics.DrawImage(newImage, 40, 20, 180, 60);
            //this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", 820, 700);

            /*如果需要改变自己 可以在new Font(new FontFamily("黑体"),11)中的“黑体”改成自己要的字体就行了,黑体 后面的数字代表字体的大小
             System.Drawing.Brushes.Blue , 170, 10 中的 System.Drawing.Brushes.Blue 为颜色,后面的为输出的位置 */
            e.Graphics.DrawString("制造有限公司", new Font(new FontFamily("黑体"), 12), System.Drawing.Brushes.Black, 310, 20);
            e.Graphics.DrawString("施工单", new Font(new FontFamily("黑体"), 10), System.Drawing.Brushes.Black, 350, 60);
            //信息的名称
            e.Graphics.DrawString("NO."+this.mProcCheckInfo.ExtnNum, new Font(new FontFamily("黑体"), 10), System.Drawing.Brushes.Black, 660, 60);
            e.Graphics.DrawLine(Pens.Black, 10, 80, 765, 80);
			//画线
            e.Graphics.DrawLine(Pens.Black, 10, 80, 10, 505);
			//写字
            e.Graphics.DrawString("外协件名称:" + this.mProcCheckInfo.MoldNum, new Font(new FontFamily("黑体"), 10), System.Drawing.Brushes.Black, 15, 90);
     
}

通过自己写字和画图,来实现一个表格,可以指定笔的颜色,粗细,字体的大小等,也可以画图,基本上是可以实现所有的打印的,但是画图的过程还是比较麻烦的,要一条一条边去画,还要如果大小不合适,所有的线和文字的坐标又需要重新算一遍。同时,如果电脑连接多台打印机,会选择默认打印机,不会让我们选择打印机,所以要提前设置好默认打印机。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 `PrintDocument` 和 `PrintDialog` 类来打印 WinForm 控件,并使用 `SaveFileDialog` 类来保存打印后的文件。下面是一个简单的示例代码: ```csharp private void btnPrint_Click(object sender, EventArgs e) { // 创建打印文档对象 PrintDocument pd = new PrintDocument(); // 设置打印事件处理程序 pd.PrintPage += new PrintPageEventHandler(this.PrintImage); // 创建打印对话框 PrintDialog printDialog = new PrintDialog(); // 如果用户点击了“确定”按钮 if (printDialog.ShowDialog() == DialogResult.OK) { // 设置打印文档对象的打印机名称 pd.PrinterSettings.PrinterName = printDialog.PrinterSettings.PrinterName; // 打印文档 pd.Print(); } } private void PrintImage(object sender, PrintPageEventArgs e) { // 获取要打印的控件 Control control = this.Controls[0]; // 创建位图对象 Bitmap bmp = new Bitmap(control.Width, control.Height); // 将控件绘制到位图上 control.DrawToBitmap(bmp, control.ClientRectangle); // 绘制位图到打印页面上 e.Graphics.DrawImage(bmp, 0, 0); // 释放资源 bmp.Dispose(); } private void btnSave_Click(object sender, EventArgs e) { // 创建保存文件对话框 SaveFileDialog saveFileDialog = new SaveFileDialog(); // 设置文件类型 saveFileDialog.Filter = "JPEG图片|*.jpg|位图文件|*.bmp|PNG图片|*.png"; // 如果用户点击了“确定”按钮 if (saveFileDialog.ShowDialog() == DialogResult.OK) { // 获取要保存的控件 Control control = this.Controls[0]; // 创建位图对象 Bitmap bmp = new Bitmap(control.Width, control.Height); // 将控件绘制到位图上 control.DrawToBitmap(bmp, control.ClientRectangle); // 保存位图到文件 bmp.Save(saveFileDialog.FileName); // 释放资源 bmp.Dispose(); } } ``` 你需要将 `this.Controls[0]` 替换为你要打印或保存的控件。此外,你还可以根据需要修改保存文件类型的过滤器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值