最近需要使用Lodop打印控件,所以就研究了一下,期间从网上找了诸多的东西,基本全是对HTML进行打印的,没有找到我想要的,就只好自己动手丰衣足食。

这篇文章主要讲述的是Lodop与数据的结合使用,官网和网上能找到的东西本文不在复述,只是记录在使用过程中自己遇到的问题和相应解决方法,本人笔拙,有不足之处希望大家多提意见;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

开发环境:

  Myeclipse 10.7 + Oracle11g   Windows 10;

主要技术:

  Spring MVC + Mybatis + JQuery;

参考文档:Lodop技术手册6.2.1.5;

Lodop相应程序及技术文档请到官网下载:http://www.lodop.net/index.html

对于Lodop有简单了解之后观看本文效果更佳;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

再次声明:本文针对的是Lodop的模板打印,相关基础问题只提到部分,其余自行去官网或者其他渠道获得;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

需要解决的问题:

  一:新增模板并把Lodop生成的模板存到Oracle数据库;

    1.1:自主添加模板名称;

    1.2:关闭打印设计之后自动返回模板内容代码;

    1.4:对返回的数据进行存储;

  二::对已创建的模板进行修改(包括打印设计和打印设置),动态从Oracle数据库加载;

    2.1:单独修改模板名称;

    2.2:动态加载已有模板属性;

  三:调用已创建模板,并将数据库查询到的数据进行动态加载;

    3.1:参数值传递;

相关问题解决思路:

  一:新增模板并保存到数据库:

    1.1:新增模板并自定义模板名称

      在进行模板新增之前先进行模板名称输入,使用LODOP.PRINT_INIT(modelName);   modelName 为自定义变量值进行接收输入的模板名称,然后可以设置一些插件的基本属性

    如:LODOP.SET_PRINT_MODE("PROGRAM_CONTENT_BYVAR",true);//生成程序时,内容参数有变量用变量,无变量用具体值

    然后进行调用 Lodop 打印设计 LODOP.PRINT_DESIGN(); 方法,即可进行新增模板;

    1.2:关闭打印设计之后自动返回模板

      在Lodop 打印设计页面有相应生成程序代码按钮

      

      当我们在打印设计页面有内容时点击这个会弹出一个包含这个模板所有内容代码的框

      

      这里面包含:模板名称、内容具体项、内容项的位置、内容项的属性等内容,Lodop原本的做法是将模板保存在安装目录的一个以模板名称命名的.ini文件中,然后现在要做的就是

      在打印设计关闭的时候将上面代码返回到后台,然后丢进数据库进行保存起来;

      下面先说下数据库结构:printModelName  VARCHAR2(20)--模板名称; printModelContent  CLOB--模板内容 ; printModelContentField  VARCHAR2(500)--模板需传值字段;

      在进行数据库存储的时候,我是将内容代码的第一行LODOP.PRINT_INIT(modelName);与其他内容进行了分割,单独提取出了模板名称,这个是为了方便模板的维护,然后模板其他所有内容全

      部存在printModelContent 字段中,然后又对内容进行提取,得出这个模板中所有需要进行打印的字段,以“,”分割存进printModelContentField 里面(为什么这么做后面会提到),

      然后说下打印设计关闭获得上述代码的方法 (官网案例35):

      

      if (LODOP.CVERSION) {
        CLODOP.On_Return=function(TaskID,Value){

        var code = Value;

        console.log(Value);
        LODOP.PRINT_DESIGN();
      }

      这个Value 就是我们需要的数据,传到后台之后使用.spit();进行两次分割,第一次分割是为了分割出模板名称,所以用的是.spit(";",2); 第二次分割是为了得到模板需要打印的字段名称,

      所以用的是.split(";"); 那么至此我们就得出了上述三个我们需要的字段,然后将他们丢进数据库就行了;

  二::对已创建的模板进行修改

    2.1:维护模板名称

      因为上面我们在数据库对模板名称是单独存储的,所以在需要更改模板名称时直接进行printModelName 字段进行Update 就OK了;

    2.2:修改已创建模板

      首先我们需要先将已经保存的模板加载出来,这里我是依据模板管理表的主键ID来进行调用的,从数据库查出该条记录之后,首先进行加载模板名称,然后将模板剩余内容动态进行拼接到名称

      之后,方法如下

      var aaa = JSON.parse(data);//----对查询出的数据进行JSON转换
      LODOP.PRINT_INIT(aaa[0].printModelName); //----加载模板名称
      var datas = aaa[0].printModelContent;//----剩余模板内容

      //----对剩余模板内容进行动态拼接
      var script = document.createElement('script');

      script.type = 'text/javascript';
      script.appendChild(document.createTextNode(datas));
      document.body.appendChild(script);

      然后调用 打印关闭获得程序代码方法,确保我们在进行修改之后修改的内容可以保存到数据库。至此就是对已有模板的修改;

  三:调用已创建模板,打印测试

    通过以上两步,完成了模板新增、存储、修改,下面就是要进行调用了。

    首先,生成的程序代码是LODOP.ADD_PRINT_TEXTA("userName",213,389,100,20,"userName"); 这样的,经过测试发现LODOP.ADD_PRINT_TEXTA("userName",213,389,100,20,obj.userName);

    这样的可以动态加载,但是这样肯定是不行的,然后从Lodop官网找到了LODOP.SET_PRINT_STYLEA(varItemNameID, strStyleName,varStyleValue);//----varItemNameID,需要替换的项目名称;

    strStyleName,打印风格名称;varStyleValue,需要替换的项目值(与前面项目名称对应),就比如,此时我需要给userName进行赋值,就需要将LODOP.SET_PRINT_STYLEA的属性值写成如下格式:

    LODOP.SET_PRINT_STYLEA(“userName”, “CONTENT”,obj.userName);//----注意双引号, obj为数据库查询出的值;那么我们怎么获取需要替换的项目名称呢,此时上面我在进行模板存储的时候分割出

    的内容项打印字段就派上用场了,此时对printModelContentField 进行分割, 然后使用for循环进行遍历就可以动态的对模板进行赋值,相应语句为:

    var str = aaa[0].printModelContentField.split(",");

    for(var i=0;i<str.length;i++){

      LODOP.SET_PRINT_STYLEA(str[i],"CONTENT",printObj[str[i]]);
    }

    此时,我们在进行调用LODOP.PREVIEW();//打印预览 方法,就可以看到我们取到的数据库的值;

以上,就是在下对于Lodop的一点个人的浅显的理解,如有不足之处请多多指教。

如果需要转载请注明出处。

Lodop 动态加载模板,动态加载数据的更多相关文章

  1. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  2. echarts在.Net中使用实例(二) 使用ajax动态加载数据

    通过上一篇文章可以知道和echarts参考手册可知,series字段就是用来存储我们显示的数据,所以我们只需要用ajax来获取series的值就可以. option 名称 描述 {color}back ...

  3. Android中ListView动态加载数据

    1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...

  4. ios ableviewcell的动态加载数据,模仿喜马拉雅动态数据加载

    iphone(UITableViewCell)动态加载图片http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Intr ...

  5. android左右滑动加载分页以及动态加载数据

    android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: package cn.anycall.ju; import java.util.ArrayList; import java ...

  6. [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...

  7. 微信小程序(五) 利用模板动态加载数据

    利用模板动态加载数据,其实是对上一节静态数据替换成动态数据:

  8. mui 动态加载数据出现的问题处理 (silder轮播组件 indexedList索引列表 下拉刷新不能继续加载数据)

    mui-slider 问题:动态给mui的图片轮播添加图片,轮播不滚动. 解决:最后把滚动轮播图片的mui(".mui-slider").slider({interval: 300 ...

  9. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分:  Source Code 上图中,有一行代码: <tbody ...

随机推荐

  1. 深入了解mysql数据传输编码原理

    一.基本概念(这里引用http://www.laruence.com/2008/01/05/12.html) 1. 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编 ...

  2. 用户管理-linux基础

    用户管理 useradd -u -g -G(附加组) ,-c -d -s -r(创建系统用户)   -M (不创建家目录)    思考:删除user1用户家目录,如何还原.        可以#cp ...

  3. GreenOpenPaint简介

    一.项目概述 类似Windows系统下面的画图程序,但是已经从底层全部重新实现,改造成为"图像处理"类程序的基本运行框架. 由于是demo界面,较为简陋,但是因为框架已经搭建完善, ...

  4. 零基础如何一步一步开始搭建高性能直播平台?现以GitChat·架构来进行说明

    前言 现在直播已经成为移动互联网时代一个新的重要流量入口,从YY.斗鱼到花椒直播,直播已经成为人们分享交流的新方式,应用场景众多,主要分为: 金融类直播:金融直播可应用于实时解盘,在线专家讲座,专家在 ...

  5. 猜数字游戏--基于python

    """题目:练习使用python写一个猜数字的游戏,数字范围0-100,每次猜错,需要给出缩小后的范围,每个人只有10次的猜测机会,猜测机会用完游戏结束!"&q ...

  6. Python 学习系列----第一章:基础知识

    1.1 常量-----不能改变它的值 1.2 数 在Python 中数可以分为整数.浮点数和复数. PS:在Python中不用区分'long int'类型.默认的整数类型可以任意长.(译者注:长度应该 ...

  7. 【C# in depth 第三版】温故而知新(1)

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7192354.html 前言 关于这本书(<深入理解C# 第三版>)的详细情况以及好坏,自行 ...

  8. Linux-kill命令(11)

    kill:指定将信号发送给某个进程,常用来杀掉进程,可以通过ps.top命令来查看进程 在默认情况下: 采用编号为的TERM信号.TERM信号将终止所有不能捕获该信号的进程. 对于那些可以捕获该信号的 ...

  9. 我的hibernate学习记录(二)

    通过上一篇文章我的hibernate学习记录(一)基本上的入门了hibernate,但是,里面还有还多东西是通过迷迷糊糊的记忆,或者说copy直接弄进去的,所以这篇文章就需要对上篇的一些文件.对象进行 ...

  10. Mac上好用的视频播放器有哪些?

    首页发现话题 提问 登录加入知乎 Mac 上好用的视频播放器有哪些? 关注问题写回答 OS X 应用 多媒体播放器(软件) Mac 上好用的视频播放器有哪些? 关注者 2680 被浏览 981770 ...