系列文章
【C#】编号生成器(定义单号规则、固定字符、流水号、业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787
【C#】日期范围生成器(开始日期、结束日期)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663
【C#】组件化开发,调用dll组件方法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129492112
【C#】单据审批流方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128972545
【C#】条码管理操作手册
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126589496
【C#】IIS平台下,WebAPI发布及异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126539836
【C#】代码模板生成工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126890673
【C#】MySQL数据库导入工具(批量Excel插入)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323
【C#】简单二维码制作和打印工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126884228
【C#】最全单据打印(打印模板、条形码&二维码、字体样式、项目源码)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723
【C#】Windows服务(Service)安装及启停方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053794
【C#】穿透Session隔离,服务调用外部程序(无窗体界面解决)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053033
【C#】任务计划实现,使用Quartz类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123667723
【C#】源码解析正则表达式
本文链接:https://blog.csdn.net/youcheng_ge/article/details/118337074
【C#】软件版本和文件MD5记录(XML操作)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871
【C#】测试网络是否连通
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110137288
【C#】根据名称获取编码(Dictionary获取key方法)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129816701
【C#】数据建模,你是使用DataTable还是List?
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129792726
【C#】GridControl控件和数据集双向绑定
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129423755
【C#】GridControl动态更换DataSource,数据查询异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130305424
【C#】GridControl日期字段显示时分秒
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130718303
【C#】GridControl增加选择列(不用二次点击)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130763713
【C#】数据库检查工具(可跨库访问)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/97172329
【C#】代码解析–打印数据集
本文链接:https://blog.csdn.net/youcheng_ge/article/details/131431829
【C#】代码解析–截取整个方法函数
本文链接:https://blog.csdn.net/youcheng_ge/article/details/109817809
【C#】反射机制,动态加载类文件
本文链接:https://blog.csdn.net/youcheng_ge/article/details/131435110
前言
我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。
哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。
本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。
·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
一、问题描述
从事MES、ERP开发的朋友,单据打印
是绕不过的模块,不支持单据打印的系统,是没有灵魂的
。
用友的NC系列、U8系列、金蝶云,均提供一个可视化设计界面,可以添加文本、调整字体样式、公式计算、条码,传参并打印。
现如今,我们人力、技术资源比不上人家专业的软件服务商,但也要实现这类功能,也并非很难。我的想法是完成简易的版本,最低实现以下几点:
①支持打印模板设置,软件服务于业务,业务会变化,原先的单据样式变动是不可避免的。
②支持条形码、二维码,两化(工业化、信息化)融合是大趋势
,条码使用非常频繁,现在阿猫阿狗的产品都贴个二维码。
③支持参数传输,说白了就是最基础的功能,打印模板 和 主程序相分离,程序传入数据给打印模板,并打印。
④支持所有打印机,目前市面上打印很多哈,如:标签打印机(斑马、佳能、TSC、格志)、普通打印机(惠普、东芝、得力)、特种打印机(MIMAKI、阿英格、富士施乐)。据我所知,斑马打印机有自己的一套打印设计软件,我们系统开发不能这么搞啊,不能挑设备,要通用化,兼容所有打印机,做到技术上,不被“卡脖子”。
网上查阅了很多资料,要么是第三方的软件,要钞票
才给使用;要么是程序中写死了界面样式,调整打印模板还要改代码,这不得把程序员苦死掉;要么是可以简单设计,但是不支持条码、图片插入。
难道就没有个免费,可以实现我的要求的方案吗?如果你也遇到同样的问题,本文将是你的解决方案。
二、解决方案
使用VBA技术,在Excel中设置【打印模板】样式,然后增加按钮事件,程序调用“事件”,实现单据、标签打印。
这样做的好处:
①不用安装第三方插件。你像用友、斑马、网商,需要安装一个打印模板配置插件,而本系统只需要Office的支持,Office全家桶默认计算机都有安装吧,故而你就不需要安装第三方插件。
②解决不同型号打印驱动问题。各个型号的打印机,它们驱动是不一样的。从开发角度,要考虑支持情况,很麻烦,但是打印机他们都做了PC调用的驱动,这是一个突破点。
③自带有网格线,拖拽式设计。不要你考虑计算坐标。
④支持条形码、二维码打印。
三、软件开发(源码)
3.1 创建xlsm
.XLSM是Microsoft Excel中的文件格式扩展名,它表示一个包含宏的Excel工作簿,打开默认启用宏脚本。
操作步骤:
1、打开Microsoft Excel
2、创建Excel工作簿
3、另存为,文件格式选择*.xlsm
即可。
3.2 设计模板样式
根据自己的情况,设计你需要
业务单据
或者商品标签
的样式,只是样式哦,数据内容不用管,这个由程序调用时以参数形式传入
。
如下图,是我设计的“标签”,由于标签纸很小,我尽量设计的很紧凑。
注意:二维码,你拿VX扫是可以正确识别 3A0N000024,博客安全机制,不打码过不了审。
如果你有 实物打印机,这里的名称和打印机名称保持一致,就可以直接自动调用。
3.3 添加二维码
会使用到BarCode控件,BarCode控件为 条形码、一维码、二维码控件、还有小日子专用的什么码,总之有很多,详情可以查阅资料。
操作步骤:【开发工具】–>【插入】–>【其它控件】–>找到【Microsoft BarCode Control 16.0】即可,如下图所示:
3.4 配置二维码属性
默认显示的是
条形码样式
,我们需要设置二维码样式
。
操作步骤:选中控件右键–>【Microsoft BarCode Control 16.0】–>【属性】–>找到【QR Code】。如下图所示,是不是立马发现变成二维码啦?
3.5 添加打印按钮
我们要增加一个按钮,点击时自动触发打印事件。
操作步骤:【开发工具】–>【插入】–>找到【命令按钮】添加即可,如下图所示:注意:本章节步骤不是必要的,也可以不写触发按钮,我只是为了测试打印效果而已。
3.6 编写模板打印代码(VBA编程)
我们刚刚只是把样式设计好了,下面将正式进入编程阶段。
本次编程,会使用到VBA
语言。由于篇幅有限,我没办法一一介绍这门开发语言,不懂的问我吧,我提供一下源码:
① 按钮事件代码:
'============================================================================================
'函数内容: 模具标签打印
'函数版本: 0.0.0.0
'创建人: gyc
'修改时间: 2023-05-04
'============================================================================================
'注意事项
' 1.
' 2.
'============================================================================================
Private Sub CommandBTN_MuJu_Click()
Call Fun_MuJuPrint
End Sub
②被调模块(子函数)
'============================================================================================
'函数内容: 模具标签打印
'函数版本: 0.0.0.0
'创建人:gyc
'修改时间: 2023-05-04
'============================================================================================
'注意事项
' 1.
' 2.
'============================================================================================
Public Function Fun_MuJuPrint(Optional ByVal Copy As Long = 1) As Boolean
On Error GoTo Err_Handle
Call SystemInit
'打印机的名称,可以在win10中设备中找一下。
If PrinterName = "" Then PrinterName = ShtPara.Cells(15, 2)
SheetMuJu.PageSetup.PrintArea = "B2:E9"
SheetMuJu.PrintOut Copies:=Copy, ActivePrinter:=PrinterName
Fun_MuJuPrint = True
Exit Function
'错误处理
Err_Handle:
Fun_MuJuPrint = False
End Function
③系统参数初始化模块
'=====================================================================================================================================
' 系统参数
'=====================================================================================================================================
#If VBA7 Then
Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As LongLong
#Else
Public Declare Function GetTickCount Lib "kernel32" () As Long
#End If
'系统变量
Public IsInitialized As Boolean
'Excel Workbook
Public WbThis As Workbook
'Excel Sheets
Public SheetWuTiao As Worksheet
Public SheetCuSi As Worksheet
Public SheetXiSi As Worksheet
Public SheetChengPing As Worksheet
Public SheetCuSiYang As Worksheet
Public SheetTuiHuoKaiJiYang As Worksheet
Public SheetTuiHuoXiaJiYang As Worksheet
Public SheetTiaoShiYang As Worksheet
Public SheetXiaJiYang As Worksheet
Public SheetDuanKouYang As Worksheet
Public SheetWuTiaoLiXueYang As Worksheet
Public SheetWuTiaoJinXiangYang As Worksheet
Public SheetTuiHuoJingXiangYang As Worksheet
Public SheetMuJu As Worksheet
Public SheetRunHuaYe As Worksheet
Public ShtPara As Worksheet
'============================================================================================
'函数内容: 系统初始化
'函数版本: 0.0.0.0
'创建人:gyc
'修改时间: 2023-02-03
'============================================================================================
'注意事项
' 1.
' 2.
'============================================================================================
Public Function SystemInit()
'Excel变量初始化
Set WbThis = ThisWorkbook
Set SheetWuTiao = WbThis.Sheets("钨条标签")
Set SheetCuSi = WbThis.Sheets("粗丝标签")
Set SheetXiSi = WbThis.Sheets("细丝标签")
Set SheetChengPing = WbThis.Sheets("成品标签")
Set SheetCuSiYang = WbThis.Sheets("粗丝样标签")
Set SheetTuiHuoKaiJiYang = WbThis.Sheets("退火开机样标签")
Set SheetTuiHuoXiaJiYang = WbThis.Sheets("退火下机样标签")
Set SheetTiaoShiYang = WbThis.Sheets("调试样标签")
Set SheetXiaJiYang = WbThis.Sheets("下机样标签")
Set SheetDuanKouYang = WbThis.Sheets("断口样标签")
Set SheetWuTiaoLiXueYang = WbThis.Sheets("钨条力学样标签")
Set SheetWuTiaoJinXiangYang = WbThis.Sheets("钨条金相样标签")
Set SheetTuiHuoJingXiangYang = WbThis.Sheets("退火镜像样标签")
Set SheetMuJu = WbThis.Sheets("模具标签")
Set SheetRunHuaYe = WbThis.Sheets("润滑液标签")
Set ShtPara = WbThis.Sheets("参数设定")
IsInitialized = True
End Function
3.7 指定打印机
VBA只要一个打印机名称,可以指定打印。
新增sheet分页,设置打印名称。
3.8 测试按钮打印效果
以上内容,你如果都完成了,那么恭喜你,你的【打印模板】可以打印看到效果了。
操作步骤:【开发工具】–退出【设计模式】–点击按钮【钨条标签打印】,如果你电脑连接了打印机,就打印出来了。如果没有,可以使用虚拟打印机。如下图:
3.9 C#调用代码(C#)
我是从事C#语言开发,这里采用了C#编程,Java代码,我后期补充。源代码如下:
①内部调用形式:
//钨条打标
Excel.Workbook wb = ExcelHelper.OpenPrintTemple("仓库管理_打印模板.xlsm");//打印模板绝对路径,这里我放在了项目中,包了一层,你们写绝对路径就可以了。
Excel.Worksheet sht = wb.Worksheets["钨条标签"];
List<钨条信息表Model> list_Wutiao = ConvertJson.DeserializeObject<List<钨条信息表Model>>(dataList[0].Value);
//循环打印,12个标签
foreach (钨条信息表Model item in list_Wutiao)
{
sht.Cells[2, 3] = item.钨条编号;
sht.Cells[3, 5] = item.钨条规格;
sht.Cells[4, 5] = item.钨条重量;
sht.Cells[5, 5] = item.钨条供应商编号;
sht.Cells[6, 5] = item.钨条出厂批次号;
sht.Cells[7, 5] = item.钨条打标操作人编号;
sht.Cells[8, 5] = item.钨条打标时间;
string MacroName = "Fun_WuTaioPrint";
ExcelHelper.RunMacro
(
wb.Application,
MacroName,
new object[]
{
1
}
);
BaseHMI.TimeDelay(1000);
}
//关闭打印模板
ExcelHelper.ClosePrintTemple(wb);
②外部调用形式(可以自己制定【打印模板】路径):
private void BTN_Print_Click(object sender, EventArgs e)
{
try
{
if (m_listMain.Count == 0)
{
FrmTips.ShowTipsSuccess(this, "没有数据可以打印!");
return;
}
//Excel操作,读取配置模板文件路径
string strFilePath = AppConfig.GetValue("mode_filepath");
//指定 sheet名
BaseExcel ExcelHelper = new BaseExcel(strFilePath, "钨条标签");
//Workbook实例化
Excel.Workbook wb = ExcelHelper.WB;
//Worksheet实例化
Excel.Worksheet sht = ExcelHelper.WS;
foreach (PrintModel model in m_listMain)
{
//向单元格传入参数
sht.Cells[2, 3] = model.code_no;
sht.Cells[3, 3] = model.supply_no;
sht.Cells[4, 3] = model.date;
string MacroName = "Fun_WuTaioPrint";
ExcelHelper.RunMacro
(
wb.Application,
MacroName,
new object[]
{
1
}
);
BaseHMI.TimeDelay(1000);
DBService.InsertData(model);
}
//关闭打印模板
ExcelHelper.ClosePrintTemple(wb);
BTN_Clean_Click(null, null);
return;
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Server.config 配置文件的内容如下:
关于配置文件的读取操作 请翻阅我的博客:
C#底层库–XML配置参数读写辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129175304
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="supply_no" value="2023-1L-2" />
<add key="batch_num" value="12" />
<add key="mode_filepath" value="E:\条码系统(源码)\条码打印\QRCodeProduce\QRCodeProduce\bin\Debug\钨条标签_打印模板.xlsm" />
<add key="m_DBConnection" value="Data Source=DBPlayer.sqlite3;Version=3;" />
</appSettings>
</configuration>
四、项目展示
4.1 标签打印程序(临时)
4.2 现场打印的标签
有些标签不是本程序打印出来的,大同小异使用的技术一样。
① 二维码标签打印
② 条形码标签打印
③ 成品箱标签(支持图片,公司logo)
五、异常处理
5.1 office怎么没有条码控件?
首先,【Microsoft BarCode Control 16.0】条码控件,属于office的Access自带,如果你的office版本是 家庭普通版,或者没有安装Access是没有的。
处理方式:
① 你可以去网上下载 OfficeSetup.exe,或者 BarCode控件库。
② 卸载掉你的office家庭版,推荐安装office专业版,并且勾选“ Access”。提示:不想卸载旧版,安装 OfficeSetup.exe也可以解决问题,亲测支持win7、win10、win11。
安装完后,你还需要引入如下组件:
操作步骤:【开发工具】–【查看代码】–【工具】–【引用】,直接勾选就OK。
5.2 office怎么没有【开发工具】选项卡?
有些人,office全家桶是完全安装的,但是并没有发现【开发工具】选项卡。这仅仅需要简单设置即可。
操作步骤:【文件】–【选项】–【自定义功能区】–勾选【开发工具】。
5.3 条码控件(条形码、二维码)如何进行数据绑定?
细心的朋友会发现,我们刚拖拽的 条码控件,用“微信扫一扫”是识别不了数据的,这是因为我们还没有给条码绑定数据源。
操作步骤:选中【二维码控件】–右键【属性】–修改【LinkedCell】的值,这时候你可以发现Value参数,有值出来了,并且拿出你的手机“微信扫一扫”是可以正常识别的。
5.4 模板无法调用,总是弹出消息框,如何处理?
这是权限不足导致的。Excel会用到宏,宏病毒曾经给大家留下了阴影,默认系统是
禁用宏
的,所以会出现提示框。
操作步骤:【文件】–【选项】–【信任中心】–【信任中心设置】,ActiveX设置、宏设置 选项卡按图改一下。
5.5 打印内容超出,如何调整纸张?
打印的内容,和你纸张大小不一样,小纸张打印大数据,会出现内容超出,只需按下图修改就OK。
操作步骤:【打印】–【自定义页面大小】–设置【纸张长宽】。将工作表调整为一页。
5.6 打印内容遮挡,如何调整边距?
操作步骤:【打印】–【自定义页边距】–设置【上下左右】为0、水平垂直居中。
六、资源链接
6.1 打印模板
设备信息卡打印模板,这个比较模板简单,你们比较好理解。
链接:https://pan.baidu.com/s/1cEw-QMttf2XHpmaC3UWibg?pwd=dc6x
提取码:dc6x
6.2 项目源码(临时)
bin目录下,找到 DLQRLabel.exe双击可以直接运行。
注意:Geyc.Controls.dll为我的UI控件库,在不断升级中,网络没有资料。
文章来源:https://www.toymoban.com/news/detail-436692.html
链接:https://pan.baidu.com/s/1AP4hP11sw0ehi5MoiBw-xQ?pwd=f7h2
提取码:f7h2文章来源地址https://www.toymoban.com/news/detail-436692.html
到了这里,关于【C#】最全单据打印源码(打印模板、条形码&二维码、字体样式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!