根据模板打印所有数据动态配置

打印后生成的数据模板

在数据库配置表

表1记录 块项 数据库表如下

表2记录 布局行列中的数据项值,取什么数据,我这里是从TextBox中的取值,所以我记录的是Tag

详细代码如下

 public FrmSQ410()
        {
            InitializeComponent();
            gvTemp.OptionsBehavior.Editable = gvSlab.OptionsBehavior.Editable=false;
            date1.EditValue = DateTime.Now.Date.AddHours(0).AddMinutes(0).AddSeconds(0);
            date2.EditValue = DateTime.Now.Date.AddDays(1).AddHours(23).AddMinutes(59).AddSeconds(59);
            txtLen.TextChanged += txtLen_TextChanged;
            tsbPrintBindingSource.PositionChanged += tsbPrintBindingSource_PositionChanged;

            gvSlab.RowClick += gvSlab_RowClick;

         
        }

        void txtLen_TextChanged(object sender, EventArgs e)
        { 
            double wgt = Math.Round((Convert.ToDouble(txtLen.Text.Trim()) / 1000) * WgtMeter, 3);
            txtWgt.Text = string.Format("{0}", wgt*1000);

        }

        void gvSlab_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {

            if (e.RowHandle < 0) return;
            var row = gvSlab.GetDataRow(e.RowHandle); 
            txtStove.Text=row["炉号"].ToString();
            txtStlGrd.Text=row["钢种"].ToString();
            txtSpec.Text = row["规格"].ToString();
            txtStdCode.Text = row["执行标准"].ToString(); 
            txtLen.Text = row["长度"].ToString();
            txtNumTotal.Text = row["支数"].ToString();
            txtProdDate.Text =Convert.ToDateTime( row["生产日期"]).ToString("yyyy.MM.dd");
            txtWgt.Text = string.Format("{0}", Convert.ToDouble(row["重量"]) * 1000);
            WgtMeter = Convert.ToDouble(row["米重"]);



        }

        void tsbPrintBindingSource_PositionChanged(object sender, EventArgs e)
        {
            if (tsbPrintBindingSource.Current == null) return;
            var current = tsbPrintBindingSource.Current as RMES.IBatisEntity.TsbPrint;
            if (lst_TsbPrintItemAll != null)
                lst_TsbPrintItem = lst_TsbPrintItemAll.Where(m => m.CPid == current.CId).OrderBy(m => m.CRowIdx).ToList();
        }


        Spire.Xls.Core.IWorksheet worksheet = null;
        Workbook workbook = null;

        private string Plant = string.Empty;
         
        private string fileSavePath = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), "PrintGP.xls");

        private List<RMES.IBatisEntity.TsbPrintItem> lst_TsbPrintItemAll = null;

        private List<RMES.IBatisEntity.TsbPrintItem> lst_TsbPrintItem = null;

        List<Control> lstText = new List<Control>();


        private double WgtMeter = 0;


        private void InitLayoutText()
        {

            foreach(Control ctrl in layoutControl1.Controls)
            {
                if (ctrl is DevExpress.XtraEditors.BaseEdit&&ctrl.Tag!=null )
                {
                    lstText.Add(ctrl);
                }
            }
        }
        private void FrmSQ410_Load(object sender, EventArgs e)
        { 
            txtGroup.Text = RMES.BLL.ShiftInfo.Instance.Team;

            InitTemplate();
            InitLayoutText();
             

        }

        private void InitTemplate()
        {
            var lst_TsbPrint = RMES.IBatisEntity.TsbPrintList.GetAll();
            tsbPrintBindingSource.DataSource = lst_TsbPrint;
            gvTemp.BestFitColumns();

            //获取所有

            lst_TsbPrintItemAll = RMES.IBatisEntity.TsbPrintItemList.GetAll().ToList();

            if (lst_TsbPrint != null)
            {
                var item = lst_TsbPrint.FirstOrDefault();

                lst_TsbPrintItem = lst_TsbPrintItemAll.Where(m => m.CPid == item.CId).OrderBy(m => m.CRowIdx).ToList();
            }

        }

        private void QueryPrintSet()
        {

        }
        /// <summary>
        /// 字母转阿斯特码
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        private int CharacterToASCI(string c)
        {
            byte[] array = new byte[1];   //定义一组数组array
            array = System.Text.Encoding.ASCII.GetBytes(c); //string转换的字母
            int asciicode = (short)(array[0]);

            return asciicode;
        }

        private string ASIToCharacter(int a)
        {
            string c = string.Empty;
            byte[] array = new byte[1];
            array[0] = (byte)(Convert.ToInt32(a)); //ASCII码强制转换二进制
            c = Convert.ToString(System.Text.Encoding.ASCII.GetString(array));

            return c;
        }


        private int start_Num = 1;
        //获取值
        private string getVal(int col,int row)
        {

            //开始支数,总支数,

            string rs = string.Empty;

            var item = lst_TsbPrintItem.Where(m => m.CRowIdx == row && m.CColIdx == col).FirstOrDefault(); 
            //获取值
            if(item !=null)
            { 
               if (item.CFiledName == "支数")
               {
                    
                   rs = string.Format("{0}-{1}",txtNumTotal.Text.Trim(),start_Num++);
               }
               else
               {
                   var ctrl = lstText.Where(m => m.Tag.ToString() == item.CFiledName).FirstOrDefault();

                   rs = ctrl.Text.Trim();
               }
              
            }
            return rs;

        }

        private void btnPrint_Click(object sender, EventArgs e)
        {

            if (tsbPrintBindingSource.Current == null) return;


            var item_TbPrintSet = tsbPrintBindingSource.Current as RMES.IBatisEntity.TsbPrint;

            string fileTempPath = Path.Combine(Environment.CurrentDirectory, item_TbPrintSet.CWorkName);

            if (!File.Exists(fileTempPath))
            {
                DevExpress.XtraEditors.XtraMessageBox.Show(string.Format("模板{0}文件不存在", item_TbPrintSet.CWorkName), "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            workbook = new Workbook();
            if (!string.IsNullOrEmpty(item_TbPrintSet.CPwd.Trim()))
            {
                workbook.OpenPassword = item_TbPrintSet.CPwd;
            }

            workbook.LoadFromFile(fileTempPath);

            worksheet = workbook.Worksheets.Where(m => m.Name == item_TbPrintSet.CSheetName).FirstOrDefault();

            if (worksheet == null)
            {
                DevExpress.XtraEditors.XtraMessageBox.Show(string.Format("模板文件中Sheet{0}不存在", item_TbPrintSet.CSheetName), "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            //移除其它数据

            List<Spire.Xls.Core.IWorksheet> lstsheet = new List<Spire.Xls.Core.IWorksheet>();
            workbook.Worksheets.All(m => { if (m.Name != item_TbPrintSet.CSheetName) { lstsheet.Add(m); } return true; });


            lstsheet.All(m => { m.Remove(); return true; });


            //判定条件
            if (lst_TsbPrintItem == null)
            {

                DevExpress.XtraEditors.XtraMessageBox.Show("模板数据项目没有配置", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (lst_TsbPrintItem.Count == 0)
            {
                DevExpress.XtraEditors.XtraMessageBox.Show("模板数据项目没有配置", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (lst_TsbPrintItem.Where(m => string.IsNullOrEmpty(m.CFiledName)).Count() > 0)
            {
                DevExpress.XtraEditors.XtraMessageBox.Show("模板数据映射中有映射列为空数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (DevExpress.XtraEditors.XtraMessageBox.Show(string.Format("是否打印模板{0} ?", item_TbPrintSet.CSheetName ), "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) return;

            ///初始化开始支数
            if (!string.IsNullOrEmpty(txtNumStart.Text.Trim()))
            {
                start_Num = Convert.ToInt32(txtNumStart.Text.Trim());
            }
            //生成打印数据 
            int rows_item = lst_TsbPrintItem.Count;


            int rows = 0; //几行几列
            int cols = 0;

            int rowStart = 0; //从几开开始
            int colStart = 0;
           
            int rowSpan = 0; //列间隔
            int colSpan = 0;

            string lenChar = string.Empty;//规格分隔符


            rows = Convert.ToInt32(item_TbPrintSet.CRow);
            cols = Convert.ToInt32(item_TbPrintSet.CCol);



          
            rowStart = Convert.ToInt32(item_TbPrintSet.CRowStart);//行开始

            colStart = Convert.ToInt32(item_TbPrintSet.CColStart);//列开始

            rowSpan = Convert.ToInt32(item_TbPrintSet.CRowSpan); //行间隔

            colSpan = Convert.ToInt32(item_TbPrintSet.CColSpan); //列间隔
        
            int n = 65; //从A开始

            int index = 1; //从1行开始

            n += colStart; //从A B C 开始

            index += rowStart;


            int nl = n;  //临时变量存入列ABC

            //遍历行
            for (int i = 0; i < rows; i++)
            { 
                nl = n; 
                //遍历列
                for (int k = 0; k < cols; k++)
                { 
                    //遍历设置单元格
                    for (int i_row = 0; i_row < item_TbPrintSet.CLrow; i_row++)
                    { 
                        for (int i_col = 0; i_col < item_TbPrintSet.CLcol; i_col++)
                        {
                            string range = string.Format("{0}{1}", ASIToCharacter(nl + i_col), index+i_row);
                             
                            string val = getVal(i_col, i_row);
                            if (!string.IsNullOrEmpty(val))
                            {
                                worksheet.Range[range].Text = val;
                            }  
                        } 
                       
                    }

                    nl += colSpan + (int)item_TbPrintSet.CLcol;   //Excel //A B C D 
                } 
                index += rowSpan + (int)item_TbPrintSet.CLrow;  
            }

            workbook.SaveToFile(fileSavePath);

            worksheet.PageSetup.PaperSize = PaperSizeType.PaperA4;
            worksheet.PageSetup.PrintQuality = 2;
            PrintDocument pd = workbook.PrintDocument;

            pd.Print();
        }

        private void btnRefush_Click(object sender, EventArgs e)
        {
            InitTemplate();
        }

        private void btnQuery_Click(object sender, EventArgs e)
        {


            string Sql = string.Format(" SELECT TA. C_BATCH_NO 炉号, TA.C_GB_STL_GRD   钢种, TA.C_SPEC      规格, TA.N_LEN       长度, SUM(Ta.N_QUA)OVER(PARTITION BY TA.C_BATCH_NO)支数, TA.C_STD_CODE  执行标准, TA.N_WGT_METER 米重, TA.N_WGT       重量,TA.D_TRANS_DATE 生产日期, TA.C_CUS_NAME  客户 FROM (SELECT T.C_BATCH_NO, SUM(T.N_QUA) N_QUA,MAX(T.D_TRANS_DATE)D_TRANS_DATE, T.C_CUS_NAME, T.C_GB_STL_GRD, T.C_SPEC, T.N_LEN, T.C_STD_CODE, T.N_WGT_METER, T.N_WGT FROM RMES.TSC_SLAB_MAIN T WHERE T.C_SLAB_TYPE = 'S' AND T.C_REFINE = '0' AND T.C_REFINE_NUM = '0' AND T.C_MAT_TYPE IN ('1', '4') AND T.C_STOVE  LIKE '%{0}%'  AND T.D_TRANS_DATE BETWEEN  TO_DATE('{1}','YYYY-MM-DD HH24:MI:SS') AND TO_DATE('{2}','YYYY-MM-DD HH24:MI:SS') GROUP BY T.C_BATCH_NO, T.C_GB_STL_GRD, T.C_SPEC, T.N_LEN, T.C_STD_CODE, T.N_WGT_METER, T.N_WGT, T.C_CUS_NAME) TA ", txtStoveQuery.Text.Trim(), date1.Text.Trim(), date2.Text.Trim()); 

            QueryResult(Sql, gcSlab, gvSlab);


        }


        private void QueryResult(string Sql, DevExpress.XtraGrid.GridControl gridCtrl, DevExpress.XtraGrid.Views.Grid.GridView grid)
        {

            using (BackgroundWorker bk = new BackgroundWorker())
            {
                bk.DoWork += (x, y) =>
                {

                    DataTable tb_Rs = RV.BLL.Base.SqlService.ExecuteQuery(Sql);
                    y.Result = tb_Rs;
                };
                bk.RunWorkerCompleted += (m, n) =>
                {

                    if (n.Result != null)
                    {
                        var tb_Rs = n.Result as DataTable;
                        grid.Columns.Clear();
                        gridCtrl.DataSource = tb_Rs;
                        gridCtrl.RefreshDataSource();
                        grid.OptionsBehavior.ReadOnly = true;
                        //grid.OptionsView.ShowFooter = true;

                        foreach (GridColumn col in grid.Columns)
                        {

                            col.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near; 
                            if (col.FieldName.Contains("ID"))
                            {
                                col.Visible = false;
                            } 
                            else if (col.ColumnType == typeof(DateTime))
                            {
                                col.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
                                col.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm:ss";
                            }
                        }

                        grid.BestFitColumns();

                    }
                };
                bk.RunWorkerAsync();
            }

        }
    }

  

原文地址:https://www.cnblogs.com/Chareree/p/6192721.html