C# winfrom调用Bartender打印,具名打印,以及数据库打印

我采用的调用方法是需要安装Bartender10.1的。首先要先安装。网上很多安装包,就不发链接了。

安装好后需要添加引用

然后我们创建一个CLASS文件,充分利用面向对象思想。一下是代码,如果有土豪也可以去支持一下我的下载。

namespace ALL_PROJECT
{
    class BarTender_class
    {
        BarTender.Application BarTApp;
        BarTender.Format BarTFormat;
        private static BarTender_class BartenderPrin = null;

        #region
        public static BarTender_class GetInstance()
        {
            if (BartenderPrin != null)
            {
                return BartenderPrin;
            }
            BartenderPrin = new BarTender_class();
            return BartenderPrin;
        }

        private BarTender_class()
        {
            if (BarTApp == null)
            {
                BarTApp = new BarTender.Application();
            }
        }
        #endregion

        /// <summary>
        /// 数据设置方式打印条码
        /// </summary>
        /// <param name="Path">路径</param>
        /// <param name="Qty">单个打印数量</param>
        /// <returns></returns>
        public bool PrintBarT(string Path, int Qty)
        {
            if (string.IsNullOrEmpty(Path))
            {
                MessageBox.Show("模版路径为空或不存在");
                return false;
            }
            BarTFormat = BarTApp.Formats.Open(Path, false, "");
            BarTFormat.PrintSetup.IdenticalCopiesOfLabel = Qty;
            BarTApp.Visible = false;
            BarTFormat.PrintSetup.NumberSerializedLabels = 1;
            try
            {
                DesignObject btObject = null;
                foreach (DesignObject obj in BarTFormat.Objects)
                {
                    //对象为线条的时候会出错
                    if (obj.Name.Contains("文本") || obj.Name.Contains("条形码"))
                    {
                        if (obj.Value.ToString().Contains("[") && obj.Value.ToString().Contains("]"))
                        {
                            btObject = BarTFormat.Objects.Find(obj.Name);
                            btObject.DoNotPrint = true;
                        }
                    }

                }
                BarTFormat.PrintOut(false, false);//第2个参数是 是否显示打印机属性的。可以设置打印机路径  
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                BarTFormat.Close(BarTender.BtSaveOptions.btDoNotSaveChanges);
            }
            return true;
        }

        public bool PrintBarT2(string lblPath, System.Collections.Hashtable hTable, int PrintQty)
        {
            if (string.IsNullOrEmpty(lblPath))
            {
                MessageBox.Show("模版路径为空或不存在");
                return false;
            }
            if (hTable == null || hTable.Count <= 0)
            {
                MessageBox.Show("没有可打印数据");
                return false;
            }
            BarTFormat = BarTApp.Formats.Open(lblPath, false, "");
            BarTFormat.PrintSetup.IdenticalCopiesOfLabel = PrintQty;
            BarTApp.Visible = false;

            BarTFormat.PrintSetup.NumberSerializedLabels = 1;
            try
            {

                foreach (string key in hTable.Keys)
                {
                    try
                    {
                        BarTFormat.SetNamedSubStringValue(key, (hTable[key]).ToString());
                    }
                    catch (Exception e1)
                    {
                        throw new Exception("key:" + key + "," + e1.Message);
                    }
                }
                //标签上的一些东西不需要打印
                //获取标签变量
                string vars = this.GetVar(lblPath); //获取打印标签上所有的变量值

                //模版上的变量,如果在hTable不存在,就设置为不显示
                vars = vars.Substring(0, vars.Length - 1);
                string[] bb = vars.Split(new char[] { '$' });
                ArrayList list = new ArrayList();
                for (int i = 0; i < bb.Length; i++)
                {
                    string[] cc = bb[i].Split(new char[] { '#' });
                    string 数据源字段 = cc[0].ToString().Replace("{", "").Replace("}", "").Replace("\n", "").Replace("\r", ""); //模版上的数据源名称,数据源是不能重复的,Bartender已经限定
                    list.Add(数据源字段);

                }
                DesignObject btObject = null;
                foreach (DesignObject obj in BarTFormat.Objects)
                {
                    //对象为线条的时候会出错
                    if (obj.Name.Contains("文本") || obj.Name.Contains("条形码"))
                    {

                        if (obj.Value.ToString().Contains("[") && obj.Value.ToString().Contains("]"))
                        {
                            btObject = BarTFormat.Objects.Find(obj.Name);
                            btObject.DoNotPrint = true;
                        }
                    }
                }
                BarTFormat.PrintOut(false, false);//第2个参数是 是否显示打印机属性的。可以设置打印机路径  
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                BarTFormat.Close(BarTender.BtSaveOptions.btDoNotSaveChanges);
            }

            return true;
        }

        public string GetVar(string _模版)
        {
            try
            {
                BarTFormat = BarTApp.Formats.Open(_模版, false, "");
                string var = BarTFormat.NamedSubStrings.GetAll("#", "$");
                return var;
            }
            catch (Exception ex)
            {

                throw ex;
            }

        } 

    }
}

以上创建完成之后我们开始设置模板。首先来具名的打印方式。

新建一个模板。设置具名变量

输入具名。

选择嵌入式数据

为文本或者条形码二维码设置具名

这样我们一个具名模板就做好了,然后我们开始调用程序打印

        private void buttonX2_Click(object sender, EventArgs e)
        {
            BarTender_class lp = BarTender_class.GetInstance();
            Hashtable hs = new Hashtable();//因为我方法体里面是HS的值,可以不采用
            for (int i = 0; i<2;i++)
            {
                hs.Clear();
                hs.Add("Prin_i", i);
                lp.PrintBarT2("C:\\BtModel\\具名.btw", hs, 1);
            }
        }

效果图:循环两次会打印出两个标签,我这里只放一个。

上面这种方式条码少的话还好,如果条码多,就会造成打印机打一次停一次。所以我们下面用数据库的方法打印。一次将所有的信息都传输给模板。

这种方式有很多首先还是先新建一个模板出来。

设置模板的数据库

可以看到这里有很多数据源的选择,我采用的是excel方式。可以选择自己的引用场景去做。

下一步,我们选择我们的excel,这里的excel,我的是先设置一个空的,先把字段给上去,然后数据是从前端导出来之后再填充进去的。

一直下一步到完成

注意这里的字段是我excel里面的字段,excel里面有多少列,这里就会有多少,其他数据库同理。点完成,我们的模板就做好了。

上面说过了,我的excel现在是空表,只有列名,为了是给模板确定字段,后面我的数据会导出来然后就会有数据给我打印。

接下来直接打印,我的模板导出就不细写了,有需求的可以去看看怎么导出excel文件。

        private void buttonX3_Click(object sender, EventArgs e)
        {
            BarTender_class lp = BarTender_class.GetInstance();
            lp.PrintBarT("C:\\BtModel\\数据.btw",1);
        }

超级简单的打印,避免了打印机打一次停一次。对多标签打印效率提高N倍。

这样我们的两个打印方法就完成了。

----------------小尾巴分割----------------------------------------

菜鸟的记录也是进步~如果对你有所帮助,那就点赞一下吧。-----来自没有代码的程序员小萝卜

猜你喜欢

转载自blog.csdn.net/weixin_38801976/article/details/107874490