• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > C# winform打印excel的方法

C# winform打印excel的方法

作者:wwachi 字体:[增加 减小] 来源:互联网 时间:2018-08-20

wwachi 通过本文主要向大家介绍了c#,winform,excel等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

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的经过,或许这只是一种比较冗杂的方法,如果有大佬有更精简的方法,请不吝赐教。如有错误,也请不吝赐教。

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

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • asp.net动态更新
  • asp.net利用母版制作页脚效果
  • SqlDataReader生成动态Lambda表达式
  • Asp.net SignalR应用并实现群聊功能
  • asp.net利用反射实现给model类赋值的方法
  • Visual Studio 2017正式版离线安装教程
  • Visual Studio 2017 离线安装教程
  • Asp.net中使用DapperExtensions和反射来实现一个通用搜索
  • Winform OpenFileDialog打开文件对话框
  • Winform控件SaveFileDialog用于保存文件

相关文章

  • 2017-05-11浅析GridView中显示时间日期格式的问题
  • 2017-05-11ASP.NET Mvc开发之查询数据
  • 2017-05-11详解.NET中使用Redis数据库
  • 2017-05-11asp.net网络数据库开发实例精解 源文件
  • 2017-05-11如何在不同.net版本实现单点登录
  • 2017-05-11剖析ASP.NET MVC的DependencyResolver组件
  • 2017-05-11asp.net获取网站目录物理路径示例
  • 2017-05-11C#使用正则表达式实例
  • 2017-05-11ASP.NET中制作各种3D图表的方法
  • 2017-05-11asp.net slickupload 使用方法(文件上传)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详细说明asp.net中datareader 和 dataset 的区别
    • RichTextBox 显示图片和word的代码
    • asp.net清空Cookie的两种方法
    • asp.net 设置GridView的选中行
    • ASP.NET 2.0 中的创建母版页
    • VS2015中C#版本6.0的新特性 你需要知道
    • 在ASP.NET 2.0中操作数据之五十八:在程序启动阶段缓存数据
    • ASP.NET中各种连接数据库的配置的方法及json数据转换
    • ASP.NET网站使用Kindeditor富文本编辑器配置步骤
    • 一步步打造简单的MVC电商网站BooksStore(2)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有