使用C#实现操作Word打印-创新互联

使用C#实现操作Word打印?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都网站制作、盘龙网络推广、重庆小程序开发、盘龙网络营销、盘龙企业策划、盘龙品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们大的嘉奖;成都创新互联公司为所有大学生创业者提供盘龙建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
class PrintClass
{
  #region 全局变量
  private DataGridView datagrid;//需要打印的数据来源

  private PageSetupDialog pagesetupdialog;
  private PrintPreviewDialog printpreviewdialog;
  int currentpageindex = 0;//当前页的编号
  int rowcount = 0;//数据的行数
  public Size PaperSize = new Size(827, 1169);//答应的纸张大小
  public int headerheight = 30;//标题高度
  Margins margins = new Margins(50, 60, 50, 80);
  public int celltopmargin = 6;//单元格顶边距 
  public int pagerowcount = 7;//每页行数 
  public int rowgap = 23;//行高 
  public int colgap = 5;//每列间隔 
  public Font headerfont = new Font("Arial", 9, FontStyle.Bold);//列名标题字体
  public Brush brushHeaderFont = new SolidBrush(Color.Black);//列名字体画刷
  public Font Cellfont = new Font("Arial", 9);//单元格字体
  public bool isautopagerowcount = true;//是否自动计算行数
  public bool PageAspect = false;//打印的方向
  public static bool PageScape = false;//打印方向
  public string paperName = string.Empty;
  #endregion

  #region 打印信息的初始化
  /// 
  /// 打印信息的初始化
  /// 
  /// 打印数据
  /// 纸张大小
  /// 是否横向打印
  public PrintClass(DataGridView datagrid, string paperName, bool lendscape)
  {
    this.datagrid = datagrid;//获取打印数据
    this.paperName = paperName;
    PrintDocument printdocument = new PrintDocument();//实例化PrintDocument类
    printpreviewdialog = new PrintPreviewDialog();//实例化PrintPreviewDialog类
    printpreviewdialog.Document = printdocument;//获取预览文档的信息
    printpreviewdialog.FormBorderStyle = FormBorderStyle.Fixed3D;//设置窗体的边框样式
    //横向打印的设置
    if (!string.IsNullOrEmpty(paperName) )
    {
      if (lendscape == true)
      {
        printdocument.DefaultPageSettings.Landscape = lendscape;//横向打印
      }
      else
      {
        printdocument.DefaultPageSettings.Landscape = lendscape;//纵向打印
      }
    }
    pagesetupdialog = new PageSetupDialog();//实例化PageSetupDialog类
    pagesetupdialog.Document = printdocument;//获取当前页的设置
    printdocument.PrintPage += new PrintPageEventHandler(this.printdocument_printpage);//事件的重载
  }
  #endregion
  
  #region 页的打印事件
  /// 
  /// 页的打印事件(主要用于绘制打印报表)
  /// 
  private void printdocument_printpage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
  {
    if (this.isautopagerowcount)//自动计算页的行数
    {
      double countHeight = e.PageBounds.Height - this.margins.Top - this.headerfont.Height - this.headerheight - this.margins.Bottom;
      pagerowcount = (int)Math.Ceiling(countHeight / this.rowgap);//获取每页的行数
    }
    int pagecount = (int)(rowcount / pagerowcount);//获取打印多少页
    pagesetupdialog.AllowOrientation = true;//启动打印页面对话框的方向部分
    int colcount = 0;//记录数据的列数
    int y = margins.Top;//获取表格的顶边距
    string cellvalue = "";//记录文本信息(单元格的文本信息)
    int startrow = currentpageindex * pagerowcount;//设置打印的初始页数
    int endrow = startrow + this.pagerowcount < rowcount ? startrow + pagerowcount : rowcount;//设置打印的大页数
    int currentpagerowcount = endrow - startrow;//获取打印页数
    colcount = datagrid.ColumnCount;//获取打印数据的列数

    int x = margins.Left;//获取表格的左边距  绘画时的x轴位置
    //获取报表的宽度
    int cwidth = 0;
    for (int j = 0; j < colcount; j++)//循环数据的列数
    {
      if (datagrid.Columns[j].Width > 0)//如果列的宽大于0
      {
        cwidth += datagrid.Columns[j].Width + colgap;//累加每列的宽度
      }
    }
    y += rowgap;//设置表格的上边线的位置
    //设置标题栏中的文字
    for (int j = 0; j < colcount; j++)//遍历列数据
    {
      int colwidth = datagrid.Columns[j].Width;//获取列的宽度
      if (colwidth > 0)//如果列的宽度大于0
      {
        cellvalue = datagrid.Columns[j].HeaderText;//获取列标题
        //绘制标题栏文字
        e.Graphics.DrawString(cellvalue, headerfont, brushHeaderFont, x, y + celltopmargin);//绘制列标题
        x += colwidth + colgap;//横向,下一个单元格的位置
        int nnp = y + currentpagerowcount * rowgap + this.headerheight;//下一行线的位置
      }
    }
    //打印所有的行信息
    for (int i = startrow; i < endrow; i++) //对行进行循环
    {
      x = margins.Left; //获取线的X坐标点
      for (int j = 0; j < colcount; j++)//对列进行循环
      {
        if (datagrid.Columns[j].Width > 0)//如果列的宽度大于0
        {
          cellvalue = datagrid.Rows[i].Cells[j].Value.ToString();//获取单元格的值
          e.Graphics.DrawString(cellvalue, Cellfont, brushHeaderFont, x, y + celltopmargin+rowgap);//绘制单元格信息
          x += datagrid.Columns[j].Width + colgap;//单元格信息的X坐标
          y = y + rowgap * (cellvalue.Split(new char[] { '\r', '\n' }).Length - 1);//单元格信息的Y坐标
        }
      }
      y += rowgap;//设置下行的位置
    }
    currentpageindex++;//下一页的页码
    if (currentpageindex < pagecount)//如果当前页不是最后一页
    {
      e.HasMorePages = true;//打印副页
    }
    else
    {
      e.HasMorePages = false;//不打印副页
      this.currentpageindex = 0;//当前打印的页编号设为0
    }
  }
  #endregion

  #region 显示打印预览窗体
  /// 
  /// 显示打印预览窗体
  /// 
  public void print()
  {
    rowcount = 0;//记录数据的行数
    PageSettings storePageSetting = new PageSettings();//实列化一个对PageSettings对象
    PrintDocument printdocument = pagesetupdialog.Document;
    foreach (PaperSize ps in printdocument.PrinterSettings.PaperSizes)//查找当前设置纸张
    {
      if (paperName == ps.PaperName)//如果找到当前纸张的名称
      {
        printdocument.DefaultPageSettings.PaperSize = ps;//获取当前纸张的信息
      }
    }
    if (datagrid.DataSource is System.Data.DataTable)//判断数据类型
    {
      rowcount = ((DataTable)datagrid.DataSource).Rows.Count;//获取数据的行数
    }
    else if (datagrid.DataSource is System.Collections.ArrayList)//判断数据类型
    {
      rowcount = ((ArrayList)datagrid.DataSource).Count;//获取数据的行数
    }
    try
    {
      printdocument.DefaultPageSettings.Landscape = PageScape;//设置横向打印
      printpreviewdialog.ShowDialog();//显示打印预览窗体
    }
    catch (Exception e)
    {
      throw new Exception("printer error." + e.Message);
    }
  }
  #endregion
}

当前标题:使用C#实现操作Word打印-创新互联
文章来源:http://myzitong.com/article/deigdc.html