虚位以待(AD)
虚位以待(AD)
首页 > 网络编程 > ASP.NET > C# winform打印excel的方法

C# winform打印excel的方法
类别:ASP.NET   作者:码皇   来源:互联网   点击:

这篇文章主要为大家详细介绍了C winform打印excel的方法,使用NPOI+Spire xls+PrintDocument直接打印excel,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

c#做winform程序要求生成并打印Excel报告,为了不安装Office相应组件,我选择了NPOI来生成Excel报告,用winform的PrintDocument控件来触发打印操作,而难点在于如何将excel转换成Graphics对象,在NPOI中我只找到了excel打印的设置(如横向/纵向),还需要打开excel去触发打印操作,但项目要求是一次性直接实现打印,要用PrintDocument控件而不是再去操作excel。不得已重新搜索,发现了类库Spire.xls,最终实现了要求。有什么错误或更简洁的方法还请广大博友不吝赐教。

思路

用npoi生成Excel =》 用spire.xls转换成图片.png =》 获取生成的图片,利用Graphic的drawimage方法对图片进行操作,当然了,如果不介意的话,可以不对图片进行操作:) =》使用printDocument控件的print方法实现打印( 当然这里可以直接用spire.xls直接生成Excel,但是Spire.xls的免费版本有每个sheet最多有150行的限制 )

知识点

【0】NPOI使用方法

下载:http://npoi.codeplex.com/releases/

【1】winform的printDocument控件

参考: https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/how-to-print-a-multi-page-text-file-in-windows-forms

理解:

PrintDocument控件的作用是定义一个向打印机发送输出的对象,有BeginPrint,PrintPage,EndPrint方法,当执行printdocument.Print()语句时,会检查是否存在BeginPrint方法,存在则先调用。然后调用PrintPage方法,该方法会向PrintPageEcentArgs类中获得一个空白的Graphics对象,我们可以对Graphics对象进行操作(可以理解对画布进行绘制,Graphics对象有内置的类似DrawString,DrawPie的方法),在PrintPage方法的最后,会向打印设备发送这个Graphics对象。打印设备完成打印后,会检查是否存在EndPrint方法,存在则调用。

【2】spire.xls使用方法

参考:.NET读写Excel工具Spire.Xls使用入门教程(1)

具体代码

【1】winform使用的打印控件介绍

使用的插件截图

printDocument1作用:定义一个向打印机发送输出的对象

printPreviewDialog1作用:显示一个对话框,向用户显示关联文档打印的样子

printDialog1作用:显示一个对话框,允许用户选择打印机并选择其他打印选项(如分数,纸张方向)

【2】代码展示

“直接打印” 按钮的后台设置

    private void DirectPrint_Click(object sender, EventArgs e){
    isprint = false;
    GenerateExcel_Click(sender, e);
    //使用NPOI生成excelif (newsavefilepath != "" && isprint==true){
    isprint = false;
    ChangeExcel2Image(newsavefilepath);
    //利用Spire将excel转换成图片if (printDialog1.ShowDialog() == DialogResult.OK){
    printDocument1.Print();
    //打印}
    }
    }

"生成excel" 按钮后台设置

    private void Generate_Click(object sender, EventArgs e){
    CreateExcel();
    //使用NPOI生成excel内容SaveFileDialog savedialog = new SaveFileDialog();
    //弹出让用户选择excel保存路径的窗口savedialog.Filter = " excel files(*.xlsx)|*.xlsx|All files(*.*)|*.*";
    savedialog.RestoreDirectory = true;
    savedialog.FileName = string.Format("销售订单审批单{
    0}
    ", DateTime.Now.ToString("yyyyMMddHHmm"));
    if (savedialog.ShowDialog() == DialogResult.OK){
    //newsavefilepath是excel的保存路径newsavefilepath = savedialog.FileName.ToString().Trim();
    using (FileStream newfs = new FileStream(newsavefilepath, FileMode.Create, FileAccess.ReadWrite)){
    singlexssfwk.Write(newfs);
    //将生成的excel写入用户选择保存的文件路径中newfs.Close();
    }
    }
    }

CreateExcel()方法举例

    using NPOI.XSSF.UserModel;
    XSSFWorkbook singlexssfwk;
    //注意,不同的NPOI版本调用的方法不一致,这里使用的版本是2.1.3.1private void CreatExcel() {
    //获取模板excel的路径string str = System.Environment.CurrentDirectory + "\XXXX.xlsx";
    if (File.Exists(str)){
    using (FileStream fs = new FileStream(str, FileMode.Open, FileAccess.Read)){
    singlexssfwk = new XSSFWorkbook(fs);
    fs.Close();
    }
    //获取表XSSFSheet xssfsheet = (XSSFSheet)singlexssfwk.GetSheetAt(0);
    //创建行 XSSFRow xssfrow1 = (XSSFRow)xssfsheet.GetRow(1);
    //设置单元格内容xssfrow1.GetCell(0).SetCellValue("...");
    ... ...    }
    else{
    ... ...}
    }

ChangeExcel2Image()方法举例

    using Spire.Xls;
    public void ChangeExcel2Image(string filename){
    Workbook workbook = new Workbook();
    workbook.LoadFromFile(filename);
    Worksheet sheet = workbook.Worksheets[0];
    sheet.SaveToImage(imagepath);
    //图片后缀.bmp ,imagepath自己设置}

执行printDocument1.Print()的方法会调用printDocument1_PrintPage方法

    //在PrintPage方法中写截取图片 的代码private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e){
    #region 如果不需要截取图片,可以不用写以下代码GC.Collect();
    Graphics g = e.Graphics;
    //imagepath是指 excel转成的图片的路径using (Bitmap bitmap = new dBitmap(imagepath)){
    //如何截取自己摸索Rectangle newarea = new Rectangle();
    newarea.X = 0;
    newarea.Y = 50;
    newarea.Width = bitmap.Width;
    newarea.Height = bitmap.Height - 120;
    using (Bitmap newbitmap = bitmap.Clone(newarea, bitmap.PixelFormat)){
    g.DrawImage(newbitmap, 0, 0, newbitmap.Width - 200, newbitmap.Height - 150);
    }
    }
    #endregion}

备注:关于预览的设置,关键在于printDocument1是个全局对象,直接设置printPreviewDialog1.Document = printDocument1; printPreviewDialog1.ShowDialog();即可,这个的原理没有研究,反正这样设置后,只要你处理好内容,就能在预览中看到。

总结

以上就是我实现c# winform打印excel的经过,或许这只是一种比较冗杂的方法,如果有大佬有更精简的方法,请不吝赐教。如有错误,也请不吝赐教。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • C#创建Excel多级分组的方法
  • C# 添加、修改以及删除Excel迷你图表的实现方法
  • C# 创建EXCEL图表并保存为图片的实例
  • C#使用Gembox.SpreadSheet向Excel写入数据及图表的实例
  • C#仪器数据文件解析Excel文件的方法浅析(xls、xlsx)
  • C# 文件上传下载(Excel导入,多线程下载)功能的实现代码
  • C#实现文件上传下载Excel文档示例代码
  • C# 操作Excel代码总结
相关热词搜索: c winform excel