国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

C# winform打印excel的方法

2024-07-10 13:32:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

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

思路

用npoi生成Excel =》 用spire.xls轉(zhuǎn)換成圖片.png =》 獲取生成的圖片,利用Graphic的drawimage方法對(duì)圖片進(jìn)行操作,當(dāng)然了,如果不介意的話,可以不對(duì)圖片進(jìn)行操作:) =》使用printDocument控件的print方法實(shí)現(xiàn)打印( 當(dāng)然這里可以直接用spire.xls直接生成Excel,但是Spire.xls的免費(fèi)版本有每個(gè)sheet最多有150行的限制 )

知識(shí)點(diǎn)

【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控件的作用是定義一個(gè)向打印機(jī)發(fā)送輸出的對(duì)象,有BeginPrint,PrintPage,EndPrint方法,當(dāng)執(zhí)行printdocument.Print()語(yǔ)句時(shí),會(huì)檢查是否存在BeginPrint方法,存在則先調(diào)用。然后調(diào)用PrintPage方法,該方法會(huì)向PrintPageEcentArgs類中獲得一個(gè)空白的Graphics對(duì)象,我們可以對(duì)Graphics對(duì)象進(jìn)行操作(可以理解對(duì)畫(huà)布進(jìn)行繪制,Graphics對(duì)象有內(nèi)置的類似DrawString,DrawPie的方法),在PrintPage方法的最后,會(huì)向打印設(shè)備發(fā)送這個(gè)Graphics對(duì)象。打印設(shè)備完成打印后,會(huì)檢查是否存在EndPrint方法,存在則調(diào)用。

【2】spire.xls使用方法

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

具體代碼

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

使用的插件截圖

printDocument1作用:定義一個(gè)向打印機(jī)發(fā)送輸出的對(duì)象

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

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

【2】代碼展示

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

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轉(zhuǎn)換成圖片if (printDialog1.ShowDialog() == DialogResult.OK){ printDocument1.Print(); //打印}} }

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

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("銷(xiāo)售訂單審批單{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寫(xiě)入用戶選擇保存的文件路徑中newfs.Close();}} }

CreateExcel()方法舉例

using NPOI.XSSF.UserModel;XSSFWorkbook singlexssfwk;//注意,不同的NPOI版本調(diào)用的方法不一致,這里使用的版本是2.1.3.1private void CreatExcel() { //獲取模板e(cuò)xcel的路徑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()方法舉例

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()的方法會(huì)調(diào)用printDocument1_PrintPage方法

//在PrintPage方法中寫(xiě)截取圖片 的代碼private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e){ #region 如果不需要截取圖片,可以不用寫(xiě)以下代碼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是個(gè)全局對(duì)象,直接設(shè)置printPreviewDialog1.Document = printDocument1; printPreviewDialog1.ShowDialog();即可,這個(gè)的原理沒(méi)有研究,反正這樣設(shè)置后,只要你處理好內(nèi)容,就能在預(yù)覽中看到。

總結(jié)

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到ASP.NET教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 姜堰市| 瓦房店市| 潍坊市| 定边县| 琼结县| 绥阳县| 淮安市| 潍坊市| 扬中市| 新闻| 印江| 嘉兴市| 大悟县| 龙井市| 崇州市| 封丘县| 尼玛县| 铅山县| 阿拉善左旗| 晴隆县| 滁州市| 安远县| 大厂| 万全县| 丰台区| 鄂伦春自治旗| 吉安市| 满洲里市| 习水县| 金华市| 巴塘县| 克东县| 龙海市| 清新县| 盐城市| 土默特左旗| 鹤岗市| 阳城县| 镇原县| 阳春市| 潮安县|