之前用DEV+VS2019做了一款模板设计软件, 基本实现模板设计,单据/标签打印. 收到大家的回复有两个问题:
1.DEV属于第三方收费控件, 很多朋友说 没有买,用起来不方便.
2.模板设计时,手动输入参数进行调整,比较麻烦.
后面接受大家的意见,在旧版的基础上做了纯.net开发的新版,舍弃了DEV , 同时也做了功能上一些优化。更完善。
支持拖拉控件,类似winform程序开发窗体设计界面。
新版(20240819v1.0)下载地址:下载链接
https://download.csdn.net/download/guo9long/89689575
本章就介绍 新版 使用方法.
一、老规矩,先看下总体效果
标签类预览
二、模板设计
1> 设计模板
新增模板后,会出现一个空白的面板,这就是纸张的大小,可以右边进行选择,或者自定义纸张大小(custom).
点击工具栏位的各种控件,自动添加到模板中. 默认添加到左上角.
支持点中控件,然后拖拉改变位置 和 鼠标移动到边框的8个小圆圈再改变尺寸, 跟winform窗体程序 拖拉控件的操作类似。
同时也支持右边属性栏位 手动设值
[x,y ,高, 宽] 大家应该都能理解是啥。
绑定字段 就是 数据源中的列名或者key(后面会有详细介绍)。
2> 特意说明一下表格控件,与普通控件有不同的地方
新增模板,然后点击表格控件
在右侧属性栏位 有一个字段,可以点开,然后添加列字段,以及设置列的绑定信息等。
以及调整文本字体和对齐方式 等。
3、活动文本字段设置
活动文本中的内置文本中的"%InnerText%" (包含%) 属于被数据源中的绑定字段的数值替换的内容,其他内容会保留到打印界面。
4、设计完成后,保存为本地模板文件,后缀.fmtx , 旧版是fmt
新版和旧版的模板文件 是不兼容的。需要注意下。
三、数据准备
模板准备好了后, 要打印还需要具体的数据,可以自己通过程序开发抓取数据 或者Demo中的程序可以用excel导入数据进行打印.
自己写程序抓数据,需要注意数据的格式,有一定的要求.
目前支持两种数据模式。(代码在下载的demo里面都有。)
1、Dictionary<string, string> -----键值对
#region 构建打印数据
Dictionary<string, string> po = new Dictionary<string, string>();
po.Add("fbillno", "PO20240808001");
po.Add("fsupplier", "中山市供应商有限公司");
po.Add("fnote", "测试单头备注");
po.Add("fdate", DateTime.Now.ToString("yyyy-MM-dd"));
DataTable ens = new DataTable();
ens.Columns.Add("fnumber"); //物料Code
ens.Columns.Add("fname"); //物料名称
ens.Columns.Add("funit");//单位
ens.Columns.Add("fqty"); //数量
ens.Columns.Add("fprice");//单价
ens.Columns.Add("famount"); //金额
ens.Columns.Add("fnote");//行备注
DataRow dr = ens.NewRow();
decimal qtys = 0;
decimal Amount = 0;
for (int r = 1; r < 10; r++)
{
dr = ens.Rows.Add();
dr[0] = "M00" + r;
dr[1] = "吸顶灯" + r;
dr[2] = "PCS";
dr[3] = "200";
dr[4] = "36.00";
dr[5] = "7200.00";
dr[6] = "测试行备注" + r;
qtys += 200;
Amount += 7200;
}
//数据里面自己添加合计行,后续可以看下模板是否支持
dr = ens.Rows.Add();
dr[0] = "总合计:";
dr[3] = qtys;
dr[5] = Amount;
#endregion 构建打印数据
2、List<Model> -----Model需要自己构建
public class PO
{
public string fbillno { get; set; } //单号
public string fsupplier { get; set; } //供应商
public string fdate { get; set; } //日期
public string fnote { get; set; } //备注
}
public class POEntry
{
public string fnumber { get; set; } //物料Code
public string fname { get; set; } //物料名称
public string funit { get; set; } //单位
public string fqty { get; set; } //数量
public string fprice { get; set; } //单价
public string famount { get; set; } //金额
public string fnote { get; set; } //行备注
}
#region 构建打印数据
PO po = new PO()
{
fbillno = "PO20240808001",
fsupplier = "中山市供应商有限公司",
fdate = DateTime.Now.ToString("yyyy-MM-dd"),
fnote = "测试单头备注"
};
List<POEntry> ens = new List<POEntry>();
for (int r = 1; r <= 10; r++)
{
POEntry en = new POEntry()
{
fnumber = "M00" + r,
fname = "吸顶灯" + r,
funit = "PCS",
fqty = "100.00",
fprice = "35.00",
famount = "3500.00",
fnote = "测试行备注" + r
};
ens.Add(en);
}
//数据里面自己添加合计行,后续版本可以完善模板参数控制 合计行,包含页小计,最后页总合计.
POEntry ensum = new POEntry()
{
fnumber = "总合计:",
fname = "",
funit = "",
fqty = "1000.00",
fprice = "",
famount = "35000.00",
fnote = ""
};
ens.Add(ensum);
#endregion 构建打印数据
3、读取模板开始打印,内置了读取模板的方法,直接调用就好了.
#region 读取模板
string fmatName = "采购订单.fmtx";
List<Object> objs = PubStatic.GetFormat(fmatName);
//#endregion 读取模板
//#region 调用打印
PrintService ps = new PrintService();
ps.InitObj<PO, POEntry>(objs, po, ens);
//PrintServiceT<PO, POEntry> ps = new PrintServiceT<PO, POEntry>(false, fmat, po, ens, false, 0, 0);
打印预览
ps.PrintView();
//打印需要打印机名称
//ps.Print("打印机名称");
#endregion
#region 读取模板
string fmatName = "采购订单.fmtx";
List<Object> objs = PubStatic.GetFormat(fmatName);
#endregion 读取模板
#region 调用打印
PrintService ps = new PrintService(objs, po, ens);
//打印预览
ps.PrintView();
//打印需要打印机名称
//ps.Print("打印机名称");
#endregion
demo里面也有生成好的测试程序,
界面上有两个自定义的功能,是可以通过excel构建数据,然后调取模板打印。 方便没有开发工具的朋友,能够做一些简单的标签或者单据的打印了。
以标签打印为例, 直接将demo里面的excel拖到窗体里面,或者点击打开数据菜单浏览文件 ,将准备的数据加载到程序中,注意第一行是数据源的列名,第二行开始才是数据。模板设计时,绑定的字段名要跟这里数据源中的列名相同.
再选择模板之前设计好的模板. 中间有一个下拉选择 打印机,点击打印或者预览就能打印了.
单据类稍微复杂一点, 分为单头和 单身 两个部分
例子中的"fbillno" 作为单据的关联字段。数据源中可以有多个单。默认第一个字段作为关联字段.
excel中用了两个sheet分别装单头和单身数据。sheet1是单头,sheet2是单身。
打印预览如下:
自动根据数据行数以及模板设定的每页行数计算 页数. 暂时合计行需要自己在数据中添加行,后续版本看是否可以打印时自动计算.
四、开发引入
1、引入DLL
文件也包含在demo中。
引入后,将格式设计窗体直接new完 show出来。
using HY.PrintSet;
using HY.PrintSet.Util;
PrintSetForm ff = new PrintSetForm();
ff.Show();
然后就是自己设计模板 以及构建打印数据,比如从其他接口 或者 数据库中获取到数据,调用打印类方法进行打印。
#region 读取模板
string fmatName = "采购订单.fmtx";
List<Object> objs = PubStatic.GetFormat(fmatName);
#endregion 读取模板
#region 调用打印
PrintService ps = new PrintService(objs, po, ens);
//打印预览
ps.PrintView();
新版下载地址:下载链接
https://download.csdn.net/download/guo9long/89689575
这个版本 纯.net开发,不含任何第三方控件。 速度杠杠的。
感兴趣的朋友可以一起研究进步。有问题可以发邮件82963620@qq.com