一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - C# winform打印excel的方法

C# winform打印excel的方法

2020-05-18 14:23wwachi ASP.NET教程

這篇文章主要為大家詳細介紹了C# winform打印excel的方法,使用NPOI+Spire.xls+PrintDocument直接打印excel,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

c#做winform程序要求生成并打印Excel報告,為了不安裝Office相應(yīng)組件,我選擇了NPOI來生成Excel報告,用winform的PrintDocument控件來觸發(fā)打印操作,而難點在于如何將excel轉(zhuǎn)換成Graphics對象,在NPOI中我只找到了excel打印的設(shè)置(如橫向/縱向),還需要打開excel去觸發(fā)打印操作,但項目要求是一次性直接實現(xiàn)打印,要用PrintDocument控件而不是再去操作excel。不得已重新搜索,發(fā)現(xiàn)了類庫Spire.xls,最終實現(xiàn)了要求。有什么錯誤或更簡潔的方法還請廣大博友不吝賜教。

思路

用npoi生成Excel =》 用spire.xls轉(zhuǎn)換成圖片.png =》 獲取生成的圖片,利用Graphic的drawimage方法對圖片進行操作,當(dāng)然了,如果不介意的話,可以不對圖片進行操作:) =》使用printDocument控件的print方法實現(xiàn)打印( 當(dāng)然這里可以直接用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控件的作用是定義一個向打印機發(fā)送輸出的對象,有BeginPrint,PrintPage,EndPrint方法,當(dāng)執(zhí)行printdocument.Print()語句時,會檢查是否存在BeginPrint方法,存在則先調(diào)用。然后調(diào)用PrintPage方法,該方法會向PrintPageEcentArgs類中獲得一個空白的Graphics對象,我們可以對Graphics對象進行操作(可以理解對畫布進行繪制,Graphics對象有內(nèi)置的類似DrawString,DrawPie的方法),在PrintPage方法的最后,會向打印設(shè)備發(fā)送這個Graphics對象。打印設(shè)備完成打印后,會檢查是否存在EndPrint方法,存在則調(diào)用。

【2】spire.xls使用方法

參考:.NET讀寫Excel工具Spire.Xls使用入門教程(1)

具體代碼

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

使用的插件截圖

printDocument1作用:定義一個向打印機發(fā)送輸出的對象

printPreviewDialog1作用:顯示一個對話框,向用戶顯示關(guān)聯(lián)文檔打印的樣子

printDialog1作用:顯示一個對話框,允許用戶選擇打印機并選擇其他打印選項(如分?jǐn)?shù),紙張方向)

【2】代碼展示

“直接打印” 按鈕的后臺設(shè)置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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轉(zhuǎn)換成圖片
if (printDialog1.ShowDialog() == DialogResult.OK)
{
printDocument1.Print(); //打印
}
}
 
}

"生成excel" 按鈕后臺設(shè)置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void Generate_Click(object sender, EventArgs e)
{
CreateExcel(); //使用NPOI生成excel內(nèi)容
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()方法舉例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using NPOI.XSSF.UserModel;
 
XSSFWorkbook singlexssfwk;
 
//注意,不同的NPOI版本調(diào)用的方法不一致,這里使用的版本是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);
//創(chuàng)建行
XSSFRow xssfrow1 = (XSSFRow)xssfsheet.GetRow(1);
//設(shè)置單元格內(nèi)容
xssfrow1.GetCell(0).SetCellValue("...");
... ...
    }
else{
... ...
}
}

ChangeExcel2Image()方法舉例

?
1
2
3
4
5
6
7
8
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自己設(shè)置
}

執(zhí)行printDocument1.Print()的方法會調(diào)用printDocument1_PrintPage方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//在PrintPage方法中寫截取圖片 的代碼
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
#region 如果不需要截取圖片,可以不用寫以下代碼
GC.Collect();
Graphics g = e.Graphics;
//imagepath是指 excel轉(zhuǎn)成的圖片的路徑
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
}

備注:關(guān)于預(yù)覽的設(shè)置,關(guān)鍵在于printDocument1是個全局對象,直接設(shè)置printPreviewDialog1.Document = printDocument1; printPreviewDialog1.ShowDialog();即可,這個的原理沒有研究,反正這樣設(shè)置后,只要你處理好內(nèi)容,就能在預(yù)覽中看到。

總結(jié)

以上就是我實現(xiàn)c# winform打印excel的經(jīng)過,或許這只是一種比較冗雜的方法,如果有大佬有更精簡的方法,請不吝賜教。如有錯誤,也請不吝賜教。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/achigwwblog/archive/2017/11/18/6441374.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 36美女厕所撒尿全过程 | 国产一区二区精品久久 | 边摸边操| 手机在线观看精品国产片 | 国产成人高清视频 | free性欧洲 | 麻豆视频入口 | lilisha李丽莎喷水大胆在线 | 亚洲欧美日韩精品 | 国产综合成色在线视频 | 全肉一女n男np高h双龙养成 | 波多野结衣同性系列698 | 99综合在线 | 国产男人搡女人免费视频 | 羞羞答答免费人成黄页在线观看国产 | 农夫色综合| 好大用力深一点 | 国产一级在线观看 | 国产精品视频人人做人人爱 | 国产日韩精品一区二区三区 | 久久综合网久久综合 | 亚欧精品在线观看 | 魔兽官方小说 | 北岛玲在线视频 | 国产精品女主播大秀在线 | 美女视频在线观看视频 | 亚洲男人第一天堂 | 婷婷久久综合九色综合九七 | 欧美白虎逼 | 天天操夜夜操狠狠操 | 国产成人久久精品一区二区三区 | 欧美一区二区三区gg高清影视 | 免费视频片在线观看大片 | 亚州在线播放 | 国产欧美精品一区二区三区 | 亚洲国产精品久久丫 | 久久精品国产清白在天天线 | 91制片厂制作果冻传媒破解 | 侮辱丰满美丽的人妻 | 秋霞黄色| 日本成年片高清在线观看 |