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

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

时间: 2017-11-17

C#使用winform简单导出Excel的方法

本文实例讲述了C#使用winform简单导出Excel的方法.分享给大家供大家参考,具体如下: using Excel; 在项目中引入Excel.dll /// <summary> /// 导出Excel /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnEx

C#数据导入/导出Excel文件及winForm导出Execl总结

一.asp.net中导出Execl的方法: 在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器.在Response输出时,\t分隔的数据,导出execl时,等价于分列,\n等价于换行. 1.将整个html全部输出execl 此法将html中所有的内容,如按钮,表格,图片等全部输出到Execl中. 复制代码 代码如下: Response.Clear(); Response.Buffer= t

C# winform打开Excel文档的方法总结(必看篇)

C#打开Excel文档方法一:调用Excel的COM组件 在项目中打开Add Reference对话框,选择COM栏,之后在COM列表中找到"Microsoft Excel 11.0 Object Library"(Office 2003),然后将其加入到项目的References中即可.Visual C#.NET会自动产生相应的.NET组件文件,以后即可正常使用. 按钮的点击事件如下: privatevoid button1_Click(object sender, EventArg

C# WinForm导出Excel方法介绍

.NET开发人员首选的方法,通过COM组件调用Office软件本身来实现文件的创建和读写,但是数据量较大的时候异常缓慢:如下代码所示已经做了优化,将一个二维对象数组赋值到一个单元格区域中(下面的代码中只能用于导出列数不多于26列的数据导出): Office PIA 复制代码 代码如下: public static void ExportToExcel(DataSet dataSet, string outputPath){    Excel.ApplicationClass excel = ne

C# WinForm创建Excel文件的实例

实例如下: private bool creatExcel(string xlsfile) { try { object missing = System.Reflection.Missing.Value; Excel.ApplicationClass myExcel = new Excel.ApplicationClass(); Excel._Workbook xBk; //工作薄 Excel._Worksheet xSt; //工作Sheet xBk = myExcel.Workbooks.

使用Python操作excel文件的实例代码

使用的类库 pip install openpyxl 操作实现 •工作簿操作 # coding: utf-8 from openpyxl import Workbook # 创建一个excel工作簿 wb = Workbook() # 打开一个工作簿 wb = load_workbook('test.xlsx') # 保存工作簿到文件 wb.save('save.xlsx') •工作表操作 # 获得当前的工作表对象 ws = wb.active # 通过工作表名称得到工作表对象 ws = wb.

.Net创建Excel文件(插入数据、修改格式、生成图表)的方法

1.添加Excel引用 可以在.Net选项卡下添加Microsoft.Office.Interop.Excel引用,或在COM下添加Microsoft Excel 12.0 Object Library.它们都会生成Microsoft.Office.Interop.Excel.dll. 2.创建Excel. 有两种方法创建一个Excel Workbook实例. 1.需要一个模板文件,使用Open方法,参数较多: 复制代码 代码如下: object miss = Missing.Value; Ap

POI通过模板导出EXCEL文件的实例

一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中的内容.样式.2.自己需要新增的内容.样式.),还需要设置单元格的样式,在网上搜了一些blog,完成后记录一下. 分析这次需求,最关键的就是如何获取到填充了模板的新HSSFWorkbook,如果获取到它,我们可以熟练的往里面添加内容. File fi = new File("F:/usr/user.

python使用xlrd和xlwt读写Excel文件的实例代码

安装模块 如果使用的是Linux系统,并且安装了pip,可以直接使用pip安装xlrd, xlwt: pip install xlwt pip install xlrd 也可以从官网下载源代码安装: https://pypi.org/project/xlwt/1.1.2/ https://pypi.org/project/xlrd/ 下载tar.gz文件,解压,并转到解压后的目录中,找到setup.py,输入命令: sudo python setup.py install 安装完成. 导入模块:

elemetUi 组件--el-upload实现上传Excel文件的实例

elemetUi 组件--el-upload实现上传Excel文件的实例 [需求]实现上传Excel文件,在上传到服务器时,还要附加一个参数,在请求上传文件接口前,先要进行文件格式判断. [知识点] 1.el-upload 官方文档中,主要用到了以下属性: data 可选参数, 上传时附带的额外参数 name 可选参数, 上传的文件字段名 before-upload 可选参数, 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传.

使用实现XlsxWriter创建Excel文件并编辑

之前操作Excel使用过其他的方式,针对Excel的写入来说,使用过xlwt模块,也直接使用过win32com接口.如果说哪个最能够发挥Excel的威力,那么肯定是win32com接口实现的方式,然而这种方式需要的是Office软件支持. 至于xlwt,我觉得我们平时用到的功能基本上都有了,通常这个基本就能够满足我个人的要求. 今天使用了一下XlsxWriter模块,暂时没有找到什么比较特殊的功能.当然,我自己也仅仅是照搬了一个demo程序而已.先展示一下程序代码: #!/usr/bin/pyt

使用Python横向合并excel文件的实例

起因: 有一批数据需要每个月进行分析,数据存储在excel中,行标题一致,需要横向合并进行分析. 数据示意: 具有多个 代码: # -*- coding: utf-8 -*- """ Created on Sun Nov 12 11:19:03 2017 @author: Li Ying """ #读取第一列作为合并后表格的第一列 from pandas import read_csv df = read_csv(r'E:\excel\vb\ex

Python xlrd/xlwt 创建excel文件及常用操作

一.创建excel代码 备注:封装好了(可直接调用) """ -*- coding:utf-8 -*- @Time :2020/8/20 21:02 @Author :Jarvis @File :jar_excel_util.py @Version:1.0 """ from typing import List import xlwt class JarExcelUtil: def __init__(self, header_list: List

Python读写Excel文件的实例

最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理.首先贴出网上找来的读写Excel的脚本. 1.读取Excel(需要安装xlrd): #-*- coding: utf8 -*- import xlrd fname = "reflect.xls" bk = xlrd.open_workbook(fname) shxrange = range(bk.nsheets) try: sh = bk.sheet_by_name(