【C#】最全单据打印(打印模板、条形码二维码、字体样式、项目源码)

news/2024/11/30 0:50:27/

系列文章

【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/128816638

【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#】最全单据打印源码(打印模板、条形码&二维码、字体样式、logo)
本文链接: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#】《周计划管理关于产前准备模块》解决方案20200203
本文链接:https://blog.csdn.net/youcheng_ge/article/details/122919543

【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


文章目录

  • 系列文章
  • 前言
  • 一、问题描述
  • 二、解决方案
  • 三、软件开发(源码)
    • 3.1 创建xlsm
    • 3.2 设计模板样式
    • 3.3 插入BarCode控件
    • 3.4 调制二维码样式
    • 3.5 添加触发按钮
    • 3.6 编写被调代码(VBA编程)
    • 3.7 测试事件打印效果
    • 3.8 编写调用代码(C#编程)
  • 四、项目展示
    • 4.1 标签打印程序(临时)
    • 4.2 现场打印的标签
  • 五、异常处理
    • 5.1 office怎么没有条码控件?
    • 5.2 office怎么没有【开发工具】选项卡?
    • 5.3 条码控件(条形码、二维码)如何进行数据绑定?
    • 5.4 模板无法调用,总是弹出消息框,如何处理?
    • 5.5 打印内容超出,如何调整纸张?
    • 5.6 打印内容遮挡,如何调整边距?
  • 六、资源链接
    • 6.1 打印模板
    • 6.2 项目源码(临时)


前言

我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。

哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。

本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。


一、问题描述

从事MES、ERP开发的朋友,单据打印是绕不过的模块,不支持单据打印的系统,是没有灵魂的

用友的NC系列、U8系列、金蝶云,均提供一个可视化设计界面,可以添加文本、调整字体样式、公式计算、条码,传参并打印。

现如今,我们人力、技术资源比不上人家专业的软件服务商,但也要实现这类功能,也并非很难。我的想法是完成简易的版本,最低实现以下几点:

①支持打印模板设置,软件服务于业务,业务会变化,原先的单据样式变动是不可避免的。
②支持条形码、二维码,两化(工业化、信息化)融合是大趋势,条码使用非常频繁,现在阿猫阿狗的产品都贴个二维码。
③支持参数传输,说白了就是最基础的功能,打印模板 和 主程序相分离,程序传入数据给打印模板,并打印。
④支持所有打印机,目前市面上打印很多哈,如:标签打印机(斑马、佳能、TSC、格志)、普通打印机(惠普、东芝、得力)、特种打印机(MIMAKI、阿英格、富士施乐)。据我所知,斑马打印机有自己的一套打印设计软件,我们系统开发不能这么搞啊,不能挑设备,要通用化,兼容所有打印机,做到技术上,不被“卡脖子”。

网上查阅了很多资料,要么是第三方的软件,要钞票才给使用;要么是程序中写死了界面样式,调整打印模板还要改代码,这不得把程序员苦死掉;要么是可以简单设计,但是不支持条码、图片插入。

难道就没有个免费,可以实现我的要求的方案吗?如果你也遇到同样的问题,本文将是你的解决方案。

二、解决方案

使用VBA技术,在Excel中设置【打印模板】样式,然后增加按钮事件,程序调用“事件”,实现单据、标签打印。
这样做的好处:
①不用安装第三方插件。你像用友、斑马、网商,需要安装一个打印模板配置插件,而本系统只需要Office的支持,Office全家桶默认计算机都有安装吧,故而你就不需要安装第三方插件。
②解决不同型号打印驱动问题。各个型号的打印机,它们驱动是不一样的。从开发角度,要考虑支持情况,很麻烦,但是打印机他们都做了PC调用的驱动,这是一个突破点。
③自带有网格线,拖拽式设计。不要你考虑计算坐标。
④支持条形码、二维码打印。

三、软件开发(源码)

3.1 创建xlsm

xlsm是启用宏的工作簿,本格式文件默认运行 宏脚本。

操作步骤:
1、创建Excel表格
2、另存为,选择文件格式 *.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编程)

篇幅有限,我没办法一一介绍这门开发语言,不懂的问我吧,毕竟这是一门新的开发语言,我提供一下源码:
① 按钮事件代码:


'============================================================================================
'函数内容: 钨条标签打印
'函数版本: 0.0.0.0
'创建人: gyc
'修改时间: 2023-02-03
'============================================================================================
'注意事项
'  1.
'  2.
'============================================================================================Private Sub CommandBTN_WuTiao_Click()'调用打印子函数Call Fun_WuTaioPrintEnd Sub

②被调模块(子函数)

'============================================================================================
'函数内容: 钨条标签打印
'函数版本: 0.0.0.0
'创建人:gyc
'修改时间: 2023-02-03
'============================================================================================
'注意事项
'  1.
'  2.
'============================================================================================
Public Function Fun_WuTaioPrint(Optional ByVal Copy As Long = 1) As BooleanOn Error GoTo Err_Handle'调用系统参数初始化函数Call SystemInitIf PrinterName = "" Then PrinterName = ShtPara.Cells(4, 2)'设置打印区域,B2到E8单元格区域SheetWuTiao.PageSetup.PrintArea = "B2:E8"'指定打印机名称SheetWuTiao.PrintOut Copies:=Copy, ActivePrinter:=PrinterNameFun_WuTaioPrint = TrueExit Function'错误处理
Err_Handle:Fun_WuTaioPrint = FalseEnd Function

③系统参数初始化模块


'=====================================================================================================================================
' 系统参数
'=====================================================================================================================================#If VBA7 ThenPublic Declare PtrSafe Function GetTickCount Lib "kernel32" () As LongLong
#ElsePublic Declare Function GetTickCount Lib "kernel32" () As Long
#End If'系统变量
Public IsInitialized As Boolean'文件操作对象
Public FSO As New FileSystemObject
Public Fold As Folder
Public Fils As Files
Public Fil As File
Public TS As TextStream'Excel Workbook
Public WbThis As Workbook'Excel Sheets
Public SheetCangKu As Worksheet
Public SheetCangKuHuoWei As Worksheet
Public SheetWuTiao As Worksheet
Public SheetCuSi As Worksheet
Public SheetXiSi As Worksheet
Public SheetChengPing As Worksheet
Public ShtPara As Worksheet'============================================================================================
'函数内容: 系统初始化
'函数版本: 0.0.0.0
'创建人:gyc
'修改时间: 2023-02-03
'============================================================================================
'注意事项
'  1.
'  2.
'============================================================================================
Public Function SystemInit()'Excel变量初始化Set WbThis = ThisWorkbookSet SheetCangKu = WbThis.Sheets("仓库标签")Set SheetCangKuHuoWei = WbThis.Sheets("货位标签")Set SheetWuTiao = WbThis.Sheets("钨条标签")Set SheetCuSi = WbThis.Sheets("粗丝标签")Set SheetXiSi = WbThis.Sheets("细丝标签")Set SheetChengPing = WbThis.Sheets("成品标签")Set ShtPara = WbThis.Sheets("参数设定")IsInitialized = TrueEnd Function

3.7 测试事件打印效果

以上内容,你如果都完成了,那么恭喜你,你的【打印模板】可以打印看到效果了。
操作步骤:【开发工具】–退出【设计模式】–点击按钮【钨条标签打印】,如果你电脑连接了打印机,就打印出来了。如果没有,可以使用虚拟打印机。如下图:

在这里插入图片描述
在这里插入图片描述

3.8 编写调用代码(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://pan.baidu.com/s/1nv1AFIi7U57_x46TnvQh5A?pwd=e9ag
提取码:e9ag


http://www.ppmy.cn/news/554844.html

相关文章

定时器的实现原理

文章目录 1.定时器的作用?2.数据结构要求3.时间轮4.分级时间轮5.业界实现方案参考文献 1.定时器的作用? 定时器的主要用途是执行定时任务。 定时任务在很多场景都需要用到&#xff0c;比如游戏的 Buff 实现&#xff0c;Redis 中的过期任务&#xff0c;Linux 中的定时任务&a…

团体程序设计天梯赛-练习集L2篇③

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

C语言的字符数组和字符串

文章目录 1 字符数组与字符串区别2 字符数组和字符串定义3 字符串长度 1 字符数组与字符串区别 1、C语言中没有字符串这种数据类型&#xff0c;可以通过char的数组来替代&#xff1b; 2、字符串一定是一个char的数组&#xff0c;但char的数组未必是字符串&#xff1b; 3、数字…

【Java 基础篇】Java StringBuffer:线程安全的可变字符串操作

文章目录 导言一、StringBuffer的创建和初始化二、StringBuffer的基本操作三、StringBuffer与String的转换四、StringBuffer的线程安全性总结 导言 在Java中&#xff0c;字符串是不可变的&#xff0c;这意味着每次对字符串进行操作时都会创建一个新的字符串对象。然而&#xf…

EC11编码器调光C语言程序代码 基于STC单片机 还可用于电机调速

EC11编码器调光C语言程序代码 基于STC单片机 还可用于电机调速 编号:565653220266749好运佳星(_)

2021年博客之星

我正在参加年度博客之星评选&#xff0c;请大家帮我投票打分&#xff0c;您的每一分都是对我的支持与鼓励。 https://bbs.csdn.net/topics/603960721

喜讯|星舆科技获得CMMI 3级认证,研发能力获国际认可!

近日&#xff0c;经国际权威认证团队严格审核与评估&#xff0c;星舆科技顺利通过CMMI 3级国际认证。这标志着星舆科技在软件研发能力、实施服务交付以及项目管理水平等方面进一步与国际主流模式接轨&#xff0c;研发能力达到了行业的先进水平。 CMMI&#xff08;Capability Ma…

2022年度博客之星评选

点进来的小伙伴先不要划走~~&#xff0c;花一分钟时间帮忙投个票了&#xff0c;感激&#xff01; 感谢一直以来还在默默地关注着我的各位小伙伴&#xff0c;2022注定是不平凡的一年&#xff0c;无论环境多么恶劣、处境多么艰难&#xff0c;都希望我们能够怀着坚定的信心&#…