前言
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生成excel if (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.1 private 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#使用winform简单导出Excel的方法,包括了C#使用winform简单导出Excel的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用winform简单导出Excel的方法。分享给大家供大家参考,具体如下: 在项目中引入Excel.dll 更多关于C#相关内容感兴趣的读者可查看本站专题:《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《
本文向大家介绍C# WinForm创建Excel文件的实例,包括了C# WinForm创建Excel文件的实例的使用技巧和注意事项,需要的朋友参考一下 实例如下: 以上这篇C# WinForm创建Excel文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
本文向大家介绍C#实现Winform中打开网页页面的方法,包括了C#实现Winform中打开网页页面的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现Winform中打开网页页面的方法。分享给大家供大家参考。具体实现方法如下: 1、首先比较简单的我们知道有类似的方法如下 2、比较灵活一点,可以定义窗口大小,我们要实现网页中脚本打开页面的方法,即window.open 那么,我们
本文向大家介绍C#打印日志的方法总结,包括了C#打印日志的方法总结的使用技巧和注意事项,需要的朋友参考一下 在我们对程序进行操作过程中,一般都需要有一个操作流程的记录显示。用C#进行编程时可以很容易实现这个功能。本经验提供案例仅供参考 下面小编就来介绍一下如何使用textbox控件实现日志功能。 打开Visual Studio 2010,建立一个新的C#程序。在工具箱中双击【textbox】控件。
本文向大家介绍winform导出dataviewgrid数据为excel的方法,包括了winform导出dataviewgrid数据为excel的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了winform导出dataviewgrid数据为excel的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍C#中给Excel添加水印的具体方法,包括了C#中给Excel添加水印的具体方法的使用技巧和注意事项,需要的朋友参考一下 我们知道Microsoft Excel并没有内置的功能直接给Excel表添加水印,但是其实我们可以用其他变通的方式来解决此问题,如通过添加页眉图片或艺术字的方法来模仿水印的外观。所以在这篇文章中,我将向您演示来如何通过在Excel中创建和插入页眉图片来为excel