c# winform 繪製表格填充數據並且打印預覽表格

 

調用打印類並執行預覽

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinHis
{
    public partial class TempleTable : Form
    {
        public TempleTable()
        {
            InitializeComponent();
        }
        private int currentPageIndex = 0;
        private int rowCount = 0;
        private int pageCount = 0;
        private void TempleTable_Load(object sender, EventArgs e)
        {
            PrintPreviewDialog ppvw = new PrintPreviewDialog();
            ppvw.PrintPreviewControl.Zoom = 1.0; //顯示比例爲100%

            DataTable dt = new DataTable();
            dt.Columns.Add("id");
            dt.Columns.Add("name");
            dt.Columns.Add("date");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["id"] = i.ToString();
                dr["name"] = "設置要打印的文檔設置要打印的文檔";
                dr["date"] = "2023-12-21";
                dt.Rows.Add(dr);

            }
            dt.Dispose();
            ToPrint bll = new ToPrint();

            System.Drawing.Printing.PrintDocument printDoc = bll.CreatePrintDocument(dt, "dd");



            //System.Drawing.Printing.PrintDocument printDoc = new System.Drawing.Printing.PrintDocument();
            PrintDialog MyDlg = new PrintDialog();
            MyDlg.Document = printDoc;
            printDoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("A4", 850, 1000);
            printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(60, 60, 60, 60); //設置邊距             
            ppvw.Document = printDoc;   //設置要打印的文檔 
            ((Form)ppvw).WindowState = FormWindowState.Maximized; //最大化  
            printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDoc_PrintPage); //打印事件 
            //printDoc.EndPrint += new System.Drawing.Printing.PrintEventHandler(printDoc_EndPrint);
            //ppvw.Document.DefaultPageSettings.Landscape = true;    // 設置打印爲橫向               
            ppvw.ShowDialog(); //打開預覽
        }
        private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Font titleFont = new Font("宋體", 11, System.Drawing.FontStyle.Regular);//標題字體
            System.Drawing.Brush brush = new SolidBrush(System.Drawing.Color.Black);//畫刷   
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 1);

            pageCount = 3;     //定義頁數
            if (currentPageIndex == 0)   //當爲第一頁時
            {
               // ShowSecond(e, titleFont, brush, pen);
                ShowFirst(e, titleFont, brush, pen);
            }
            else if (currentPageIndex == 1)   //當爲第二頁時
            {
               // ShowFirst(e, titleFont, brush, pen);
            }
            else if (currentPageIndex == 2)   //當爲第一頁時
            {
               // ShowFirst(e, titleFont, brush, pen);
            }
            #region 分頁控件
            currentPageIndex++;      //加新頁
            if (currentPageIndex < pageCount)
            {
                e.HasMorePages = true;  //如果小於定義頁 那麼增加新的頁數
            }
            else
            {
                e.HasMorePages = false; //停止增加新的頁數
                currentPageIndex = 0;
            }
            #endregion
        }
        #region 首頁內容
        private void ShowFirst(System.Drawing.Printing.PrintPageEventArgs e, Font titleFont3, System.Drawing.Brush brush, System.Drawing.Pen pen)
        {

            

        }
        #endregion

    }
}

繪製表格類:

using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Data;
using System;

namespace WinHis
{
    /// <summary>
    /// 打印,打印預覽
    /// </summary>
    public class ToPrint
    {

        //以下用戶可自定義
        //當前要打印文本的字體及字號
        private static Font TableFont = new Font("Verdana", 10, FontStyle.Regular);
        //表頭字體
        private Font HeadFont = new Font("Verdana", 20, FontStyle.Bold);
        //表頭文字
        private string HeadText = string.Empty;
        //表頭高度
        private int HeadHeight = 40;
        //表的基本單位
        private int[] XUnit;
        private int YUnit = TableFont.Height * 2;
        //以下爲模塊內部使用
        private PrintDocument DataTablePrinter;
        private DataRow DataGridRow;
        private DataTable DataTablePrint;
        //當前要所要打印的記錄行數,由計算得到
        private int PageRecordNumber;
        //正要打印的頁號
        private int PrintingPageNumber = 1;
        //已經打印完的記錄數
        private int PrintRecordComplete;
        private int PLeft;
        private int PTop;
        private int PRight;
        private int PBottom;
        private int PWidth;
        private int PHeigh;
        //當前畫筆顏色
        private SolidBrush DrawBrush = new SolidBrush(Color.Black);
        //每頁打印的記錄條數
        private int PrintRecordNumber;
        //第一頁打印的記錄條數
        private int FirstPrintRecordNumber;
        //總共應該打印的頁數
        private int TotalPage;
        //與列名無關的統計數據行的類目數(如,總計,小計......)
        public int TotalNum = 0;

        /// <summary>
        /// 打印
        /// </summary>
        /// <param name="dt">要打印的DataTable</param>
        /// <param name="Title">打印文件的標題</param>
        public void Print(DataTable dt, string Title)
        {
            try
            {
                CreatePrintDocument(dt, Title).Print();
            }
            catch (Exception ex)
            {
                MessageBox.Show("打印錯誤,請檢查打印設置!");

            }
        }

        /// <summary>
        /// 打印預覽
        /// </summary>
        /// <param name="dt">要打印的DataTable</param>
        /// <param name="Title">打印文件的標題</param>
        public void PrintPriview(DataTable dt, string Title)
        {
            try
            {
                PrintPreviewDialog PrintPriview = new PrintPreviewDialog();
                PrintPriview.Document = CreatePrintDocument(dt, Title);
                PrintPriview.WindowState = FormWindowState.Maximized;
                PrintPriview.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show("打印錯誤,請檢查打印設置!");

            }
        }

        /// <summary>
        /// 創建打印文件
        /// </summary>
        public PrintDocument CreatePrintDocument(DataTable dt, string Title)
        {

            DataTablePrint = dt;
            HeadText = Title;
            DataTablePrinter = new PrintDocument();

            PageSetupDialog PageSetup = new PageSetupDialog();
            PageSetup.Document = DataTablePrinter;
            DataTablePrinter.DefaultPageSettings = PageSetup.PageSettings;
            DataTablePrinter.DefaultPageSettings.Landscape = true;//設置打印橫向還是縱向
            //PLeft = 30; //DataTablePrinter.DefaultPageSettings.Margins.Left;
            PTop = DataTablePrinter.DefaultPageSettings.Margins.Top;
            //PRight = DataTablePrinter.DefaultPageSettings.Margins.Right;
            PBottom = DataTablePrinter.DefaultPageSettings.Margins.Bottom;
            PWidth = DataTablePrinter.DefaultPageSettings.Bounds.Width;
            PHeigh = DataTablePrinter.DefaultPageSettings.Bounds.Height;
            XUnit = new int[DataTablePrint.Columns.Count];
            PrintRecordNumber = Convert.ToInt32((PHeigh - PTop - PBottom - YUnit) / YUnit);
            FirstPrintRecordNumber = Convert.ToInt32((PHeigh - PTop - PBottom - HeadHeight - YUnit) / YUnit);

            if (DataTablePrint.Rows.Count > PrintRecordNumber)
            {
                if ((DataTablePrint.Rows.Count - FirstPrintRecordNumber) % PrintRecordNumber == 0)
                {
                    TotalPage = (DataTablePrint.Rows.Count - FirstPrintRecordNumber) / PrintRecordNumber + 1;
                }
                else
                {
                    TotalPage = (DataTablePrint.Rows.Count - FirstPrintRecordNumber) / PrintRecordNumber + 2;
                }
            }
            else
            {
                TotalPage = 1;
            }

            DataTablePrinter.PrintPage += new PrintPageEventHandler(DataTablePrinter_PrintPage);
            DataTablePrinter.DocumentName = HeadText;

            return DataTablePrinter;
        }

        /// <summary>
        /// 打印當前頁
        /// </summary>
        private void DataTablePrinter_PrintPage(object sende, PrintPageEventArgs Ev)
        {


            int tableWith = 0;
            string ColumnText;

            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;

            //打印表格線格式
            Pen Pen = new Pen(Brushes.Black, 1);

            #region 設置列寬

            foreach (DataRow dr in DataTablePrint.Rows)
            {
                for (int i = 0; i < DataTablePrint.Columns.Count; i++)
                {
                    int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(dr[i].ToString().Trim(), TableFont).Width);
                    if (colwidth > XUnit[i])
                    {
                        XUnit[i] = colwidth;
                    }
                }
            }

            if (PrintingPageNumber == 1)
            {
                for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
                {
                    ColumnText = DataTablePrint.Columns[Cols].ColumnName.ToString().Trim();
                    int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(ColumnText, TableFont).Width);
                    if (colwidth > XUnit[Cols])
                    {
                        XUnit[Cols] = colwidth;
                    }
                }
            }
            for (int i = 0; i < XUnit.Length; i++)
            {
                tableWith += XUnit[i];
            }
            #endregion

            PLeft = (Ev.PageBounds.Width - tableWith) / 2;
            int x = PLeft;
            int y = PTop;
            int stringY = PTop + (YUnit - TableFont.Height) / 2;
            int rowOfTop = PTop;

            //第一頁
            if (PrintingPageNumber == 1)
            {
                //打印表頭
                Ev.Graphics.DrawString(HeadText, HeadFont, DrawBrush, new Point(Ev.PageBounds.Width / 2, PTop), sf);


                //設置爲第一頁時行數
                PageRecordNumber = FirstPrintRecordNumber;
                rowOfTop = y = PTop + HeadFont.Height + 10;
                stringY = PTop + HeadFont.Height + 10 + (YUnit - TableFont.Height) / 2;
            }
            else
            {
                //計算,餘下的記錄條數是否還可以在一頁打印,不滿一頁時爲假
                if (DataTablePrint.Rows.Count - PrintRecordComplete >= PrintRecordNumber)
                {
                    PageRecordNumber = PrintRecordNumber;
                }
                else
                {
                    PageRecordNumber = DataTablePrint.Rows.Count - PrintRecordComplete;
                }
            }

            #region 列名
            if (PrintingPageNumber == 1 || PageRecordNumber > TotalNum)//最後一頁只打印統計行時不打印列名
            {
                //得到datatable的所有列名
                for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
                {
                    ColumnText = DataTablePrint.Columns[Cols].ColumnName.ToString().Trim();

                    int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(ColumnText, TableFont).Width);
                    Ev.Graphics.DrawString(ColumnText, TableFont, DrawBrush, x, stringY);
                    x += XUnit[Cols];
                }
            }
            #endregion



            Ev.Graphics.DrawLine(Pen, PLeft, rowOfTop, x, rowOfTop);
            stringY += YUnit;
            y += YUnit;
            Ev.Graphics.DrawLine(Pen, PLeft, y, x, y);

            //當前頁面已經打印的記錄行數
            int PrintingLine = 0;
            while (PrintingLine < PageRecordNumber)
            {
                x = PLeft;
                //確定要當前要打印的記錄的行號
                DataGridRow = DataTablePrint.Rows[PrintRecordComplete];
                for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
                {
                    Ev.Graphics.DrawString(DataGridRow[Cols].ToString().Trim(), TableFont, DrawBrush, x, stringY);
                    x += XUnit[Cols];
                }
                stringY += YUnit;
                y += YUnit;
                Ev.Graphics.DrawLine(Pen, PLeft, y, x, y);

                PrintingLine += 1;
                PrintRecordComplete += 1;
                if (PrintRecordComplete >= DataTablePrint.Rows.Count)
                {
                    Ev.HasMorePages = false;
                    PrintRecordComplete = 0;
                }
            }

            Ev.Graphics.DrawLine(Pen, PLeft, rowOfTop, PLeft, y);
            x = PLeft;
            for (int Cols = 0; Cols < DataTablePrint.Columns.Count; Cols++)
            {
                x += XUnit[Cols];
                Ev.Graphics.DrawLine(Pen, x, rowOfTop, x, y);
            }



            PrintingPageNumber += 1;

            if (PrintingPageNumber > TotalPage)
            {
                Ev.HasMorePages = false;
                PrintingPageNumber = 1;
                PrintRecordComplete = 0;
            }
            else
            {
                Ev.HasMorePages = true;
            }


        }

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章