哈哈,小弟不才,在前辈大牛的基础上做了多维表头打印,代码粗糙,凑合用,有时间再做优化!
public class PrintClass
{
#region 全局变量
private Dictionary<int, List<MoreHead>> dicMoreHead = new Dictionary<int, List<MoreHead>>();
private Dictionary<int, int> dicCelWidth;
private string wLineStr = "\n";
private DataGridView datagrid;
private PrintDocument printdocument;
private PageSetupDialog pagesetupdialog;
private PrintPreviewDialog printpreviewdialog;
private string title = "";//标题
private string sPrintTime = "";//打印时间
int currentpageindex = 0;//当前页的编号
int rowcount = 0;//数据的行数
int pagecount = 0;//打印页数
int titlesize = 16;//标题的大小
int xoffset = 0;//标题位置
public int x = 0;//z绘画时的x轴位置
public int PrintPageHeight = 1169;//打印的默认高度
public int PrintPageWidth = 827;//打印的默认宽度
public bool iseverypageprinttitle = false;//是否每一页都要打印标题
public int headerheight = 30;//标题高度
public int topmargin = 60; //顶边距
public int celltopmargin = 6;//单元格顶边距
public int cellleftmargin = 4;//单元格左边距
public int pagerowcount = 7;//每页行数
public int rowgap = 23;//行高
public int colgap = 5;//每列间隔
public int leftmargin = 50;//左边距
public Font titlefont = new Font("arial", 14);//标题字体
public Font font = new Font("arial", 10);//正文字体
public Font footerfont = new Font("arial", 8);//页脚显示页数的字体
public Font uplinefont = new Font("arial", 9, FontStyle.Bold);//当header分两行显示的时候,上行显示的字体
public Font underlinefont = new Font("arial", 8);//当header分两行显示的时候,下行显示的字体
public Brush brush = new SolidBrush(Color.Black);//画刷
public Font headerfont = new Font("arial", 9, FontStyle.Bold);//列名标题字体
public Brush brushHeaderFont = new SolidBrush(Color.Black);//列名字体画刷
public Brush brushHeaderBack = new SolidBrush(Color.White);//列名背景画刷
public Font Cellfont = new Font("arial", 9);//单元格字体
public Brush brushCellFont = new SolidBrush(Color.Black);//单元格字体画刷
public Brush brushCellBack = new SolidBrush(Color.White);//单元格背景画刷
public bool isautopagerowcount = true;//是否自动计算行数
public int buttommargin = 80;//底边距
public bool needprintpageindex = true;//是否打印页脚页数
public Color LineColor = Color.Black;//线的颜色
public bool LineUP = true;//上边线
public bool LineLeft = true;//左边线
public bool LineUnit = true;//单元格的线
public bool Boundary = false;//下边线
public int AlignmentSgin = -1;//对齐方式的标识
public int HAlignment = 0;//标题对齐方式
public int UAlignment = 0;//单元格对齐方式
public int LeftAlignment = 50;//左对齐的边界
public int RightAlignment = 50;//右对齐的边界
public int CenterAlignment = 0;//居中对齐边界
public bool PageAspect = false;//打印的方向
public static bool PageScape = false;//打印方向
public int PageSheet = 0;
/// <summary>
/// 自定义列宽
/// </summary>
public Dictionary<int, int> DicCelWidth { get => dicCelWidth; set => dicCelWidth = value; }
/// <summary>
/// 自定义多维表头
/// </summary>
public Dictionary<int, List<MoreHead>> DicMoreHead { get => dicMoreHead; set => dicMoreHead = value; }
/// <summary>
/// 自定义换行符
/// </summary>
public string WLineStr { get => wLineStr; set => wLineStr = value; }
#endregion
#region 打印信息的初始化
/// <summary>
/// 打印信息的初始化
/// </summary>
/// <param datagrid="DataGridView">打印数据</param>
/// <param title="string">打印标题</param>
/// <param titlesize="int">标题大小</param>
/// <param PageS="int">纸张大小</param>
/// <param lendscape="bool">是否横向打印</param>
/// <returns>返回DataSet对象</returns>
public PrintClass(DataGridView datagrid, string title, int titlesize, int PageS, bool lendscape)
{
this.title = title;//设置标题的名称
this.titlesize = titlesize;//设置标题的大小
this.datagrid = datagrid;//获取打印数所据
this.PageSheet = PageS;//纸张大小
printdocument = new PrintDocument();//实例化PrintDocument类
pagesetupdialog = new PageSetupDialog();//实例化PageSetupDialog类
pagesetupdialog.Document = printdocument;//获取当前页的设置
printpreviewdialog = new PrintPreviewDialog();//实例化PrintPreviewDialog类
printpreviewdialog.Document = printdocument;//获取预览文档的信息
printpreviewdialog.FormBorderStyle = FormBorderStyle.Fixed3D;//设置窗体的边框样式
//横向打印的设置
if (PageSheet >= 0)
{
if (lendscape == true)
{
printdocument.DefaultPageSettings.Landscape = lendscape;//横向打印
}
else
{
printdocument.DefaultPageSettings.Landscape = lendscape;//纵向打印
}
}
pagesetupdialog.Document = printdocument;
//MessageBox.Show(printdocument.DefaultPageSettings.Landscape.ToString());
printdocument.PrintPage += new PrintPageEventHandler(this.printdocument_printpage);//事件的重载
}
/// <summary>
/// 重载实例化打印类
/// </summary>
/// <param name="datagrid"></param>
/// <param name="title"></param>
/// <param name="sPrinterName"></param>
/// <param name="lendscape"></param>
public PrintClass(DataGridView datagrid, s