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

來源:互聯網
上載者:User

標籤:...   eve   model   預覽   text   mat   data   使用   bsp   

前言

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.