zoukankan      html  css  js  c++  java
  • C# 调用打印机 打印 Excel

    打印 Excel 模板

    大体思路,通过NPOI操作Excel文件,通过Spire将Excel转成图片,将图片传给系统打印。

     Spire是收费工具,在微软库中下载Free版本。

     

     

    #region 打印所用到的函数

            private void btnPrint_Click(object sender, EventArgs e)

            {

                if (!pnlRes.Visible) { MessageBox.Show("请先测量数据!", "提示"); return; }             //未测量无法打印

                try

                {

                    Settings.PrintDataRead();

                    if (File.Exists(Settings.path_printExcel))

                    {

                        File.Copy(Settings.path_printExcel, Settings.path_printExcelCopy, true);//三个参数分别是源文件路径,存储路径,若存储路径有相同文件是否替换

                    }

                    writeExcel();

                    prtDoc.PrinterSettings.PrinterName = Settings.PrintData.PrinterName;               //设置打印机名称

                    System.Drawing.Printing.PaperSize ps = new System.Drawing.Printing.PaperSize();

                    //ps.RawKind = 150;

                    ps.Height = Settings.PrintData.PaperSizeHeight - 5;

                    ps.Width = Settings.PrintData.PaperSizeWidth + 2;

                    //ps.PaperName = "default";

                    prtDoc.DefaultPageSettings.PaperSize = ps;

                    excelToImage(Settings.path_printExcelCopy);

                    prtDoc.Print();

                    cleanAll();

                    File.Delete(Settings.path_printExcelCopy);

                }

                catch (Exception ex)

                {

                    LogHelper.Error(ex.GetType(), ex);

                    MessageBox.Show(ex.Message, "错误");

                    File.Delete(Settings.path_printExcelCopy);

                }

            }

            //写入信息到Excel

            private void writeExcel()

            {

                try

                {

                    string tempPath = Settings.path_printExcelCopy;

                    //Excel对象

                    XSSFWorkbook wk = null;

                    using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

                    {

                        wk = new XSSFWorkbook(fs);

                        fs.Close();

                    }

                    //Excel页面 设置->Sheet1

                    ISheet sheet = wk.GetSheet("Sheet1");

     

        /* 写入操作 依据需求自己编写

                    for (int j = 0; j < chList.Length; ++j)

                    {

                        if ((string)chList[j].ckb.Tag != "0")

                        {

                            int cell = (j + 1) * 3 - 2;

                            //写入通道

                            sheet.GetRow(1).GetCell(cell).SetCellValue("CH" + (j + 1));

     

                            //写入OK / NG     Tag 1,OK 2NG

                            if ((string)chList[j].ckb.Tag == "1")

                            {

                                sheet.GetRow(1).GetCell(cell + 1).SetCellValue("OK");

                            }

                            else

                            {

                                sheet.GetRow(1).GetCell(cell + 1).SetCellValue("NG");

                            }

                            //写入机型 时间

                            sheet.GetRow(2).GetCell(cell).SetCellValue("机型:" + Settings.Model.deviceName);

     

                            sheet.GetRow(3).GetCell(cell).SetCellValue(DateTime.Now.ToString("yyyy-MM-dd HH:mm"));

     

                            for (int i = 0; i < chList[j].lblList.Length; ++i)

                            {

                                switch (i)

                                {

                                    case 0:

                                        sheet.GetRow(4).GetCell(cell).SetCellValue("流量:" + chList[j].lblList[i].Text);

                                        break;

                                    case 1:

                                        sheet.GetRow(5).GetCell(cell).SetCellValue("出口压力:" + chList[j].lblList[i].Text);

                                        break;

                                    case 2:

                                        sheet.GetRow(6).GetCell(cell).SetCellValue("浓度:" + chList[j].lblList[i].Text);

                                        break;

                                    case 3:

                                        sheet.GetRow(7).GetCell(cell).SetCellValue("雾化压力:" + chList[j].lblList[i].Text);

                                        break;

                                }

                            }

                        }

                        else

                        {

     

                        }

                    }

        */

                    using (var fs = new FileStream(tempPath, FileMode.Create, FileAccess.Write))

                    {

                        wk.Write(fs);

                    }

                }

                catch (Exception ex)

                {

                    LogHelper.Error(ex.GetType(), ex);

                    MessageBox.Show(ex.Message, "错误");

                }

            }

            private void excelToImage(string filename)

            {

                try

                {

                    Workbook workbook = new Workbook();

                    workbook.LoadFromFile(filename);

                    Worksheet sheet = workbook.Worksheets[0];

                    sheet.SaveToImage(Settings.path_printImage); //图片后缀.bmp ,imagepath自己设置

                }

                catch (Exception ex)

                {

                    LogHelper.Error(ex.GetType(), ex);

                    MessageBox.Show(ex.Message, "错误");

                }

            }

     

            private void prtDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)

            {

                #region 如果不需要截取图片,可以不用写以下代码

                //截取左上角宽度

                int rectangleWidth = Settings.PrintData.MarginWidth + 72;

                int rectangleHight = Settings.PrintData.MarginHeight + 96;

                try

                {

                    GC.Collect();

                    Graphics g = e.Graphics;

                    //imagepath是指 excel转成的图片的路径

                    using (Bitmap bitmap = new Bitmap(Settings.path_printImage))

                    {

                        Rectangle newarea = new Rectangle();

                        newarea.X = rectangleWidth;

                        newarea.Y = rectangleHight;

                        newarea.Width = bitmap.Width - rectangleWidth;

                        newarea.Height = bitmap.Height - rectangleHight;

                        using (Bitmap newbitmap = bitmap.Clone(newarea, bitmap.PixelFormat))

                        {

                            //打印

                            g.DrawImage(newbitmap, 0, 0, newbitmap.Width, newbitmap.Height);

                        }

                    }

                }

                catch (Exception ex)

                {

                    LogHelper.Error(ex.GetType(), ex);

                    MessageBox.Show(ex.Message, "错误");

                }

                #endregion

            }

     

            #endregion

  • 相关阅读:
    Linux-进程描述(1)—进程控制块
    C++中的继承(2)类的默认成员
    Linux系统date命令的参数及获取时间戳的方法
    new/new[]和delete/delete[]是如何分配空间以及释放空间的
    golang垃圾回收
    golang内存分配
    go中的关键字-reflect 反射
    go中的关键字-go(下)
    go中的关键字-go(上)
    go中的关键字-defer
  • 原文地址:https://www.cnblogs.com/z45281625/p/10615657.html
Copyright © 2011-2022 走看看