我采用的调用方法是需要安装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倍。
这样我们的两个打印方法就完成了。
----------------小尾巴分割----------------------------------------
菜鸟的记录也是进步~如果对你有所帮助,那就点赞一下吧。-----来自没有代码的程序员小萝卜