c# winform列印excel(使用NPOI+Spire.xls+PrintDocument直接列印excel)

来源:http://www.cnblogs.com/achigwwblog/archive/2017/11/18/6441374.html
-Advertisement-
Play Games

前言 c#做winform程式要求生成並列印Excel報告,為了不安裝Office相應組件,我選擇了NPOI來生成Excel報告,用winform的PrintDocument控制項來觸發列印操作,而難點在於如何將excel轉換成Graphics對象,在NPOI中我只找到了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使用方法

參考:http://www.cnblogs.com/asxinyu/p/4346907.html

 

具體代碼  

  【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的經過,或許這隻是一種比較冗雜的方法,如果有大佬有更精簡的方法,請不吝賜教。如有錯誤,也請不吝賜教。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第1章 Rsync開篇介紹 1.1 rsync的定義 Rsync是一款開源的、快速的、多功能的、可實現全量及增量的本地或遠程數據同步備份的優秀工具。Rsync軟體適用於unix/linux/windows等多種操作系統平臺 ① 全量備份:第一次傳輸數據過程中使用全量備份,將全部數據進行傳輸覆蓋 ② ...
  • Server 2008 R2遠程桌面授權,解決120天過期問題 ...
  • 搭建MySQL 1、查看yum庫中的mysql 2、選擇需要的mysql進行安裝 3、驗證是否安裝成功 4、啟動mysql服務 5、進入mysql,並修改密碼 FLUSH PRIVILEGES; //刷新user表,如果沒有寫這句那麼就沒有用 6、退出並用剛修改過的密碼重新登錄 7、開放遠程登錄許可權 ...
  • 在網站運行中,錯誤是不可避免的,錯誤頁的產生也是不可缺少的。 這幾天看了博友的很多文章,自己想總結下我從中學到的和實際中配置的。 首先,需要知道產生錯誤頁的來源,一種是我們的.NET平臺拋出的,一種是網站所依賴的宿主拋出的,一般來講我們所依賴的宿主就是IIS了。 IIS中的錯誤頁入口: 其中的錯誤碼 ...
  • 返回總目錄 6.5Introduce Explaining Variable(引用解釋性變數) 概要 你有一個複雜的表達式。 將該複雜表達式(或其中一部分)的結果放進一個臨時變數,以此變數名稱來解釋表達式用途。 動機 有時候你會遇到一系列複雜的表達式連續運算的時候,這個時候你可能根本招架不住如此長或 ...
  • 上一篇簡單介紹了日誌的使用方法,也僅僅是用來做下學習,更何況只能在console輸出。 NLog已是日誌庫的一員大佬,使用也簡單方便,本文介紹的環境是居於.NET CORE 2.0 ,目前的版本也只有beta版。 一、安裝和配置 1.安裝 命令如下 2.創建配置文件 在web項目根目錄下,創建配置文 ...
  • 1、前言 surging內部使用的是高性能RPC遠程服務調用,如果用json.net序列化肯定性能上達不到最優,所以後面擴展了protobuf,messagepack序列化組件,以支持RPC二進位傳輸. 在這裡需要感謝白紙無字Zonciu,新增了messagepack序列化,讓surging 性能上 ...
  • 1、 在表單需要提交Html的頁面頭部加入 ValidateRequest="false" 2、webConfig 的 <system.web> 節點下配置 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...