本篇适用于复杂的动态模板打印,即不同业务+对应的数据源(单据设计)才能实现,如果是单个页面的打印,建议使用在页面使用ADD_PRINT_HTM(intTop,intLeft,intWidth,intHeight,strHtml)来实现功能 这个超级简单,strHtml就是用Js获取的打印内容的Html

=====================================================================

公司的任务:用一个打印插件将所有的业务的单据做成打印模板

最终确定使用Lodop  功能的确强大

Lodop和以往的Js插件不一样,如果项目着急上线会get不到他的强大,废话不多说,上干货

首先,我还是建议大家看看官网的在线样例http://www.lodop.net/

文章最后贴了部分代码 新手估计看不动  个人只是笔记记录 有需要可以联系我

【经验所得】

1模板中参数怎么赋值 1.在前端输出模板内容后,用lodop语法重新赋值 2在后端将模板中参数进行替换,在前端直接输出

一开始纠结怎么把模板中的参数进行替换,是在前端进行用代码重新赋值,还是在后端把模板中参数进行替换,最终经过考量使用后端方案,也是我比较建议的,特别适合复杂情况的单据

2模板内容在前端是当作js执行的,而我们一般要读取数据库再放到页面 需要使用js函数 eval()

eval('模板内容');

3表格打印的适合 如果内容过多 如果设置不正确 不会全部打印

模板效果

配置界面设计

文本框动态参数配置

表格动态参数配置

预览效果

部分代码实例

LODOP = getLodop();var text = $("#<%=txt_TemplateText.ClientID%>").val();
eval(text);if (LODOP.CVERSION) CLODOP.On_Return = function (TaskID, Value) { document.getElementById('<%=txt_TemplateText.ClientID%>').value = Value; };document.getElementById('<%=txt_TemplateText.ClientID%>').value = LODOP.PRINT_DESIGN();//关闭插件编辑框后 代码自动到输入框或者自己想要绑定的地方
StringBuilder sb = new StringBuilder();
var model = sysPrintTemplateBLL.GetModel(Id);if (model == null){var resultObjError = new{code = -1,content = "未找到打印模板"};context.Response.Write(JsonConvert.SerializeObject(resultObjError));context.Response.End();}Regex strRegex = new Regex("LODOP.*\\([\\s\\S]*?\\)");var strRegexValue = strRegex.Matches(model.TemplateText);var itemslist = sysPrintTemplateItemsBLL.GetList(string.Format("IsLock=1 and SysPrintTemplateId='{0}'", Id));List<DataTable> datasource = new List<DataTable>();if (itemslist != null && itemslist.Count > 0){foreach (var item in itemslist){if (string.IsNullOrEmpty(item.BillEntityId)) continue;//根据单据实体 向单据设计接口获取数据string sqlFilter = string.Empty;if (item.ChkUseStrWhere == 1){sqlFilter = item.StrWhere;if (sqlFilter.Contains("{Id}")){sqlFilter = sqlFilter.Replace("{Id}", sqlId);}if (sqlFilter.Contains("{ParentId}")){sqlFilter = sqlFilter.Replace("{ParentId}", sqlId);}}else{sqlFilter = sqlWhere;}var data = BaseData.GetEntityDataSource(item.BillEntityId, sqlFilter, item.OrderByFields);datasource.Add(data);}}else{context.Response.Write(JsonConvert.SerializeObject(new { code = -1, content = "未匹配到数据源设置" }));context.Response.End();}Regex regex = new Regex("\"(.+)\"");//正则 获取双引号中内容Regex tblRegex = new Regex(@"<table.*?>[\s\S]*?</table>");Regex tdRegex = new Regex(@"<td.*?>[\s\S]*?</td>");Regex tdContentRegex = new Regex(@">\S\w*?<");//Lodop 可以直接在LODOP.ADD_PRINT_TEXTA()将值代入,也可以用LODOP.SET_PRINT_STYLEA重新赋值//由于我们是动态生成的模板,我们直接遍历 根据配置参数赋值sb.AppendFormat(string.Format("LODOP.PRINT_INIT(\"{0}\");", model.Name));sb.Append("LODOP.SET_PRINT_MODE(\"PROGRAM_CONTENT_BYVAR\",true);");if (strRegexValue != null && strRegexValue.Count > 0){for (int k = 0; k < strRegexValue.Count; k++){var str = strRegexValue[k].Value;if (string.IsNullOrEmpty(str)) continue;if (str.Contains("LODOP.ADD_PRINT_TEXTA")){#region 处理控件//理论上只能匹配到2个值 LODOP.ADD_PRINT_TEXTA("Obj.Code",12,77,100,20,"001");var matchContent = regex.Match(str);//获取到的是"Obj.Code",12,77,100,20,"001"if (matchContent == null){sb.AppendFormat(string.Format("{0};", str));continue;}var arrayData = matchContent.Value.Split(',');var strStart = arrayData[0].Replace("\"", "");var strReplace = arrayData.LastOrDefault().Replace("\"", "");//注: name[0]标准值应该是 数据标识_字段名称var nameArray = strStart.Split('_');if (nameArray.Length != 2){sb.AppendFormat(string.Format("{0};", str));continue;}//根据values[0]找到数据源var i = 0;object newValue = null;bool IsMatch = false;//是否匹配到数据 如果没有则返回原文foreach (var item in itemslist){if (nameArray[0].Equals(item.DataSourceFlag)){//已匹配大数据源var dt = datasource[i];if (dt == null || dt.Rows.Count < 1) break;//根据反射找到数据值var objectName = nameArray[1];var dr = dt.Rows[0];try{if (dr[objectName] != null){if (objectName.Contains("Date")){newValue = Convert.ToDateTime(dr[objectName]).ToString("yyyy-MM-dd");}else if (objectName.Contains("Amount") || objectName.Contains("Money")){newValue = Convert.ToDecimal(dr[objectName]).ToString("0.####");}else{newValue = dr[objectName];}IsMatch = true;}}catch{}break;}i++;}if (IsMatch){//替换值var newStr = str.Replace(strReplace, newValue.ToString());sb.AppendFormat(string.Format("{0};", newStr));}else{sb.AppendFormat(string.Format("{0};", str));}#endregion}else if (str.Contains("LODOP.ADD_PRINT_TABLE")){#region 处理表格//理论上只能匹配到1个值 LODOP.ADD_PRINT_TABLE(26, 21, 726, 100, "表格内容");var matchContent = regex.Match(str);var tableHtml = matchContent.Value;tableHtml = tableHtml.Replace("\r\n", "");var tableText = tblRegex.Match(tableHtml);if (tableText == null) { sb.AppendFormat(string.Format("{0};", str)); continue; }string newTblText = new Regex(@"<table.*?>").Match(tableText.Value).Value + "{0}</table>";//模板绑定数据在Table 第2Tr中,遍历第2个Tr 匹配数据 生成多个Tr,重新凭借数据Regex trRegex = new Regex(@"<tr.*?>[\s\S]*?</tr>");var trArray = trRegex.Matches(tableText.Value);if (trArray == null || trArray.Count < 2) { sb.AppendFormat(string.Format("{0};", str)); continue; }//无论是否匹配到Td数据 此处做拼接字符串数据StringBuilder newStrTr = new StringBuilder();newStrTr.Append(trArray[0].Value);//处理第二个Trvar tdArray = tdRegex.Matches(trArray[1].Value);if (tdArray == null) { sb.AppendFormat(string.Format("{0};", str)); }//根据第一个td锁定绑定的数据源int index = 0;var firstTd = tdContentRegex.Match(tdArray[0].Value);string firstTdValue = firstTd.Value.Replace(">", "").Replace("<", "");var firstSourceValue = firstTdValue.Split('_');if (firstSourceValue != null || firstSourceValue.Length == 2){var sourceName = firstSourceValue[0];foreach (var item in itemslist){//根据nameArray[0]匹配数据源 if (sourceName.Equals(item.DataSourceFlag)){//已匹配大数据源 此处数据源应该是明细int rowNo = 1;var dt = datasource[index];if (dt == null || dt.Rows.Count < 1) break;//遍历data 遍历第二个Tr下所有Tdforeach (DataRow dr in dt.Rows){newStrTr.Append("<tr>");for (int i = 0; i < tdArray.Count; i++){var tdContent = tdContentRegex.Match(tdArray[i].Value);string tdText = tdContent.Value.Replace(">", "").Replace("<", "");var nameArray = tdText.Split('_');string newValue = string.Empty;var objectName = nameArray[1];try{if (objectName == "RowNumber"){newValue = rowNo.ToString();}else if (objectName.Contains("Date")){newValue = Convert.ToDateTime(dr[objectName]).ToString("yyyy-MM-dd");}else if (objectName.Contains("Amount") || objectName.Contains("Money") || objectName.Contains("Volumes")){newValue = Convert.ToDecimal(dr[objectName]).ToString("0.####");}else{newValue = dr[objectName].ToString();}}catch (Exception ex){newValue = "数据匹配异常";}var newStrTd = tdArray[i].Value.Replace(tdText, newValue);newStrTr.Append(newStrTd);}newStrTr.Append("</tr>");rowNo++;}break;}index++;}}newTblText = string.Format(newTblText, newStrTr.ToString());//替换值var newStr = str.Replace(tableText.Value, newTblText);sb.Append($"{newStr};");#endregion}else if (str.Contains("LODOP.ADD_PRINT_BARCODEA")){#region 处理条码、二维码//LODOP.ADD_PRINT_BARCODEA("data1_test2",394,98,291,60,"128A","123456789012"); var matchContent = regex.Match(str);//获取到的是"Obj.Code",12,77,100,20,"001"if (matchContent == null){sb.AppendFormat(string.Format("{0};", str));continue;}var arrayData = matchContent.Value.Split(',');var strStart = arrayData[0].Replace("\"", "");var strReplace = arrayData.LastOrDefault().Replace("\"", "");//注: name[0]标准值应该是 数据标识_字段名称var nameArray = strStart.Split('_');if (nameArray.Length != 3){sb.AppendFormat(string.Format("{0};", str));continue;}var i = 0;object newValue = null;bool IsMatch = false;//是否匹配到数据 如果没有则返回原文foreach (var item in itemslist){if (nameArray[0].Equals(item.DataSourceFlag)){//已匹配大数据源var dt = datasource[i];if (dt == null || dt.Rows.Count < 1) break;//根据反射找到数据值var objectName = nameArray[1];foreach (DataRow dr in dt.Rows){try{if (dr[objectName] != null){if (objectName.Contains("Date")){newValue = Convert.ToDateTime(dr[objectName]).ToString("yyyy-MM-dd");}else if (objectName.Contains("Amount") || objectName.Contains("Money")){newValue = Convert.ToDecimal(dr[objectName]).ToString("0.####");}else{newValue = dr[objectName];}IsMatch = true;}}catch{}}break;}i++;}if (IsMatch){//替换值var newStr = str.Replace(strReplace, newValue.ToString());sb.AppendFormat(string.Format("{0};", newStr));}else{sb.AppendFormat(string.Format("{0};", str));}#endregion}else{sb.AppendFormat(string.Format("{0};", str));}}}

【推荐】超级好用的打印插件Lodop使用笔记 动态赋值 打印模板解决方案相关推荐

  1. 强大的web打印插件--Lodop

    最近公司有个项目需要实现记录打印功能,在网上找到了一个很好的打印插件Lodop,它是一个专门针对web页面打印的控件,里面封装了很多的JS API,用户只要根据自己特定的需要调用里面相应的接口,就可以 ...

  2. Java集成流行的打印插件lodop

    最近做了一个项目,里面涉及了打印的问题,小编就拿出来给大家分享一下,现在jquery库里面的打印都是使用window.print()进行页面的打印还有一些不知名的插件,这些打印有很多的问题,同时也会加 ...

  3. extjs利用第三方打印插件lodop实现打印功能

    extjs由于是基于JS语言,其打印是可以按照一般的WEB打印方式来进行.笔者在网络上发现第三方打印插件Lodop(详见地址:http://mtsoftware.v053.gokao.net/inde ...

  4. 打印插件LODOP使用介绍

    背景:目前很多项目中均设计到了打印模块,且都需要直接打印,目前公司已购入lodop打印插件,该插件能满足大部分打印相关的功能. 使用方法:http://www.lodop.net/demo.html ...

  5. jave使用打印插件(Lodop)可以打印以及保存excel

    引用 Lodop 插件实现打印以及另存excel 下面展示一些 内联代码片. // 给个jsp,引入插件js <%@ page language="java" content ...

  6. FCPX插件:时尚多彩的动态文本动画模板Creative Titles

    Creative Titles 是一组包含9款时尚多彩的动态文本动画模板的fcpx插件,全彩色控件和更改其他选项的可能性,使用这个色彩缤纷的模板来创建您的有趣时刻.爱情故事.播客等视频,使用任何字体键 ...

  7. 转载:打印插件LODOP Vue中的使用

    官网:http://www.lodop.net/index.html 首先需要官网下载安装软件:进入官网后,在下载中心里面下载: 下载后的产品下载压缩包中文件如下图: 其中CLodop_Setup_f ...

  8. Lopod 前端打印插件基础用法

    Lopod 前端打印插件 一款前端打印插件,可实现各个前端打印功能,并且跨浏览器.官网:[http://www.lodop.net/index.html] (http://www.lodop.net/ ...

  9. 分享一个简单好看的html的表格table(个人简历的html表格),vue table,以及vue打印(简单好用的vue打印插件)

    想写一个很普通的那种像word文档样式的table,发现网上很多都是什么教程,没有合适的,我只想要一个拿来就能用的html的table(非专业前端),没有什么别的依赖,而且样式要很普通的简单的表格.既 ...

  10. vue封装打印插件print.js实现打印组件功能

    代码 插件地址:https://github.com/xyl66/vuePlugs_printjs 1. 打印插件属性方法 定义-print.js // 打印类属性.方法定义 /* eslint-di ...

最新文章

  1. 李航「机器学习」最全综述
  2. 【Git】Git 标签使用 ( 创建并查询标签 | 推送单个标签到远程仓库 | 推送所有标签到远程仓库 | 删除远程仓库的标签 )
  3. 贪心算法--会场安排问题
  4. java 子类强转父类 父类强转子类
  5. 定义装运点(shipping point)
  6. 报销流程不简单,OA平台的私人订制
  7. 判断一个数组中的值是否在另一个数组中
  8. httpclient封装获取响应实体_Httpclient 接口自动化
  9. P2522 HAOI2011 Problem b [莫比乌斯反演,数论分块]
  10. 如何保证代码的高质量?
  11. 全局光照技术解析Global Illumination Explained
  12. 【clickhouse】clickhouse 利用Grafana与系统表监控ClickHouse查询
  13. 计算机主板 方便用户自己安装的是,电脑水冷安装教程步骤解析【图文】
  14. hiberntate教程笔记6
  15. linux ubuntu 11.10 下的android开发环境的搭建!
  16. viewUrl 终结者
  17. 2019-2022广汽埃安AIONS/AIONY/AIONV/AIONLX维修手册电路图技术资料
  18. 基于SpringBoot+JSoup+POI+Swagger2实现校园教务系统成绩课程等信息抓取,并提供接口访问的小项目
  19. BD 之 逻辑题 赛马
  20. 谈谈你对web语义化的理解

热门文章

  1. 计算机群星闪耀时-记计算机界的大牛们
  2. mysql之事务 锁(三)
  3. 【组队学习】【38期】组队学习内容详情!
  4. 芯片后端的APR指什么?
  5. CDH大数据平台搭建之HADOOP分布式集群搭建
  6. Tegra X2 系统上安装 openpose
  7. 气象大数据与预报准确率
  8. 微信开发平台和微信公众平台绑定
  9. matlab分析启动子特征,文献编译 | 相对脑血容量(rCBV)可作为MGMT启动子甲基化阳性GBM的辅助预后指标...
  10. CLC龍链:致力于打造支付生态系统