系列文章

【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

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

  1. 整理一周的Python全品类资料包含100本电子书,还有独家实战项目源码公开!

    回复"pythonpdf",立刻领取100本全品类Python电子书 不知怎么的,最近不少关注我的读者都开始私信我怎么学好python?零基础转行是不是合适,还有希望吗?今年30了 ...

  2. 蓝牙连接打印机打印文字图片条形码二维码 用的是Gprinter打印机

    实现了蓝牙打印,正在进一步完善,欢迎留言交流 :) Github链接

  3. 条形码二维码标签编辑打印软件

    KopSoftTool 条形码二维码标签编辑打印软件,C#串口通信SerialPort 官网 http://kopsoft.cn/ github源码 https://github.com/willia ...

  4. ZXing.Net条形码二维码标签编辑打印软件

    KopSoftTool 条形码二维码标签编辑打印软件,C#串口通信SerialPort 官网 http://kopsoft.cn/ github源码 https://github.com/willia ...

  5. JS使用Lodop控件打印表单和二维码

    有关Lodop的查询可看文章:Lodop打印条码二维码设置多宽不一定是多宽 一.了解Lodop 1.1Lodop的定义 Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内 ...

  6. 条码打印软件如何固定二维码的尺寸和位置

    用过条码打印软件的小伙伴会知道,在软件中生成二维码后,可以直接在画布上用鼠标拖动二维码,改变二维码位置,也可以用鼠标拖动二维码四个角方形点修改二维码尺寸,设置是非常灵活. 但是也有的客户用条码打印软件 ...

  7. 微信小程序实现蓝牙打印(图片、二维码、文字)

    小程序连接蓝牙打印机实现打印功能 这真是一块超级难啃的骨头,我也是参考了很多文章才勉强理解,但是如果你啃动了,那你以后也有了拿得出手的资本了 完整DEMO地址可直接下载下来使用 搜索与连接蓝牙,这个我 ...

  8. labview项目源码 数据追溯系统 测试系统 打印系统

    labview项目源码 数据追溯系统 测试系统 打印系统id=658951719359&

  9. 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结【文末附源码】

    微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 文章目录 微信小程序/uni-app 蓝牙打印开发教程和常见问题总结[文末附源码] 1️⃣ 写在前面 2️⃣ 蓝牙连接流程 3 ...

最新文章

  1. Xamarin图表开发基础教程(12)OxyPlot框架支持的金融图表类型
  2. [转]十分钟搞定Vue搭建
  3. 关于大型网站技术演进的思考(二)--存储的瓶颈(2)
  4. Vue简单入门及组件的简单使用
  5. Delphi 的内存操作函数(1): 给字符指针分配内存
  6. java 得到bean的属性_获取javaBean所有属性及类型.doc
  7. 比较新旧两个CMDB库,列出要删除的编号,要更新的编号,要添加的编号。
  8. 数位DP算法概述及习题
  9. 数学分析学习(一):映射与不等式
  10. 天若OCR v5.0 自用免配置增强版
  11. Instagram for Business Instagram商业技巧 Lynda课程中文字幕
  12. 课堂作业:首尾相连求最大子数组
  13. linux sd卡启动盘制作工具,Sd卡启动盘的制作(EXT2)
  14. VB中的二维数组输出的定位
  15. UE4 输入系统详解一、 UE4如何获取win系统输入消息
  16. 表格标题 caption
  17. 信息安全工程师学习笔记《第二章》
  18. 三相桥式全控整流电路simulink仿真_可控硅整流器
  19. s ss ss ss ss ss ss ss ss ss ss ss ss ss s
  20. Git之一次Push的回滚之旅

热门文章

  1. 论epoll的使用 - 高调coding,低调做人 - C++博客
  2. 上传文件太大(处理)
  3. pgAdmin报Connection refused (0x0000274D/10061)错误
  4. 身边35岁程序员如何建立起技术护城河?
  5. esp8266+ws2812+blinker亮度控制
  6. 清泉HAL库开发STM32之EXIT
  7. 用Google浏览器下载网页视频(包括优酷,土豆等网站视频)
  8. 多平台视频PC端下载(持续更新,windows)
  9. ​​​​​​ 如何衡量完善度?
  10. CSS3 元素转圈动画 (元素旋转动画)