一起谈.NET技术,在MVC2.0使用Lodop为WEB打印提出完美解决方案

  通过好友CallHot介绍Lodopweb打印控件。由于是国人开发的,故这两天认真了研究下,打算在未来的项目中使用。现将学习成果与园友分享。如果存在不足的地方,希望您指出。

  具体的实现步骤如下:

  一、准备工作

   1.MVC2.0 + jQuery1.4.1 开发环境。

  2.Lodop web 打印控件,官方地址:http://mtsoftware.v053.gokao.net/download.html  (注:国人开发,免费软件)。

  3.StringTemplate,C#开源模板引擎。官方地址:http://www.stringtemplate.org。

  本文主要给出WEB下打印步骤实现方案,具体的技术实现细节,请查看官方API。lodop,stringtemplate 官方已给出了详尽的文档说明。

  二、MVC2.0使用StringTemplate构造打印模板

  StringTemplate 文中简称st。网络上有相关文档介绍st效率还不错。本文将st作为报表打印模板。在实际项目开发中将繁杂的报表打印工作内容,部分分配给美工来处理。而开发人员只需提供数据源接口。使用st可以减轻开发人员的工作量。并将报表开发任务分工更细致。给项目带来的好处就不多论了。具体实现如下:

  1.在MVC2.0项目中引用st核心dll:

  2.建立st的模板文件,template.st(st模板专用文件):

  也可以认为st文件就是一个普通的html文件。该部分主要由美工负责处理,比如CSS。

  3.在MVC2.0 controller 内建立提供数据源的 JsonResult:

public JsonResult Print()
{
//构造打印数据
List<CustomerTest> list = new List<CustomerTest>();
for (int i = 0; i < 100; i++)
{
list.Add(
new CustomerTest { CustomerName = "candy" + i, CustomerAddress = "思明区" + i, CustomerPhone = "13148484855" + i });
list.Add(
new CustomerTest { CustomerName = "linda" + i, CustomerAddress = "湖里区" + i, CustomerPhone = "13847487545" + i });
list.Add(
new CustomerTest { CustomerName = "ellie" + i, CustomerAddress = "海昌区" + i, CustomerPhone = "1359984665" + i });
}

//StringTemplate 打印模板文件,实际项目中为提高程序效率,应将打印模板文件缓存。
string serverPath = System.Web.HttpContext.Current.Server.MapPath("~");
string path = Path.Combine(serverPath, @"PrintTemplate\");

StringTemplateGroup group
= new StringTemplateGroup("myGroup", path, typeof(TemplateLexer));
StringTemplate st
= group.GetInstanceOf("template");
st.SetAttribute(
"customer", list);

//为打印提供html相关超文本内容。
StringBuilder sb = new StringBuilder();
sb.Append(
@"<html xmlns='http://www.w3.org/1999/xhtml' lang='zh-CN'>");
sb.Append(
"<head>");
sb.Append(
@"<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />");
sb.Append(
@"<meta http-equiv='Content-Language' content='zh-CN' />");
string cssContent = System.IO.File.ReadAllText(Path.Combine(serverPath, @"Content\CSS\CSSForPrint.css"));
sb.Append(
@"<style type='text/css'>");
sb.Append(cssContent);
sb.Append(
@"</style>");
sb.Append(
"</head>");
sb.Append(
"<body>");
sb.Append(st.ToString());
sb.Append(
" ");
sb.Append(
"</body>");
sb.Append(
"</html>");

return Json(new { success = true, data = sb.ToString() }, JsonRequestBehavior.AllowGet);
}

  其中CustomerTest是自定义数据类,已经给出详细的注释了。仔细阅读不难理解。

  4.MVC2.0 view html head 内加入js 代码:

<asp:Content ID="Content3" ContentPlaceHolderID="Head" runat="server">
<script language="javascript" src="CheckActivX.js"></script>
<object id="LODOP" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width="0"
height
="0">
</object>
<script type="text/javascript">

function prn1_preview(data) {
LODOP.PRINT_INIT(
"打印控件功能演示_Lodop功能_打印表格");
//报表标题
LODOP.ADD_PRINT_HTM(50, 300, 330, 300,
"<font color ='black' size ='6'>客户列表</font><font color ='blue' size ='2'>(制表人:张三)</font>");
//报表内容打印。
LODOP.ADD_PRINT_TABLE(100, 150, 760, 900, data);
LODOP.PREVIEW();
};

$(
function () {
$(
"#btnPrint").click(function () {
var url = '<%=Url.Action("Print","Home") %>';
$.ajax({
type:
"POST",
url: url,
cache:
false,
dataType:
'json',
success:
function (result) {
if (result.success) {
prn1_preview(result.data);
}
}
});
});
})
</script>
</asp:Content>

  三、运行截图

  最后一页打印预览:

  打印机横向打印:

  四、注意事项

   本文给出的web打印方案需要读者对MVC2.0 、jQuery 、StringTemplate 有一定的了解。另外本例只是在IE下实现了WEB打印,如果需要Firefox或其他浏览器下支持web打印请联系Lodop作者。

  希望本篇文章可以给您带来帮助,如有不足之处欢迎指出,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派4b搭建个人云_树莓派4B NAS系统搭建

一、硬盘挂载由于之前硬盘(NTFS格式)里有数据不想格式化想直接挂载&#xff0c;就没有格式化成ext4文件格式的。安装ntfs-3gsudo apt-get install ntfs-3g加载内核模块modprobe fuse查看硬盘情况fdis -l将硬盘挂载到/mnt下ntfs-3g /dev/sda1 /mnt实现开机自动挂载vim /etc/fsta…

(转)python调取C/C++的dll生成方法

本文针对Windows平台下&#xff0c;python调取C/C的dll文件。 1.如果使用C语言&#xff0c;代码如下&#xff0c;文件名为test.c。 __declspec(dllexport) int sum(int a,int b) {return (a b); } 如果使用C语言&#xff0c;代码如下&#xff0c;文件名为test_cpp.cpp。在Wind…

生产者-消费者模式

生产者/消费者问题的多种Java实现方式 实质上&#xff0c;很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式&#xff0c;而这是恰恰是在本科操作系统课堂上老师反复讲解&#xff0c;而我们却视而不见不以为然的。在博文《一种面向作业流(工作流)的轻量级可复用…

周末,说下我喜欢的篮球

我应该有很久没有看NBA比赛了&#xff0c;没有其他原因&#xff0c;确实是因为工作太忙了&#xff0c;即使是在带薪上厕所&#xff0c;也没有足够的时间看下NBA比赛。如果说忙是一个比较好的托词&#xff0c;那还有一个原因&#xff0c;我现在更多的喜欢野球圈的新闻。刚毕业那…

数据结构+算法 学习计划与资源

学了很多杂乱的技术&#xff0c;继续成长 渐感吃力&#xff0c;重新学习数据结构 与 算法. 计划&#xff1a; 1.严蔚敏《数据结构》《大话数据结构》&#xff0c;每天一个小例子。 2.采用C 或者C 。尽量用C实现&#xff0c;以辅助理解面向对象编程思想。 3.与同学每天练习、讨论…

没有串口,如何打印单片机调试信息?

输出调试信息是嵌入式开发中必不可少的调试利器&#xff0c;嵌入式开发的一个特点是很多时候没有操作系统&#xff0c;或者没有文件系统&#xff0c;常规的打印log到文件的方法基本不适用。最常用的是通过串口输出uart log&#xff0c;例如51单片机&#xff0c;只要实现串口驱动…

[luogu4571 JSOI2009] 瓶子和燃料 (数论)

传送门 Solution 题目说的很迷&#xff0c;但可以发现两个瓶子互相倒最少是容积的gcd 那么题目就转化为求其中选k个瓶子gcd的最大值&#xff0c;这个可以分解因数&#xff0c;枚举因数得到 Code //By Menteur_Hxy #include <map> #include <cmath> #include <cs…

线程池 调度 java_java调度器和线程池总结

一、推荐使用的调度器和线程池1、调度器//2个线程的调度器private static ScheduledThreadPoolExecutor pool new ScheduledThreadPoolExecutor(2);//5秒钟后每3分钟执行一次pool.scheduleAtFixedRate(new TestTask(), 5, 60 * 3, TimeUnit.SECONDS);;2、线程池//10个线程的线…

JVM GC调优总结 -Xms -Xmx -Xmn -Xss

堆大小设置 JVM 中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的可用虚拟内存限制&#xff1b;系统的可用物理内存限制。32位系统下&#xff0c;一般限制在1.5G~2G&#xff1b;64为操作系统对内存无…

MFC应用程序实例

新建FirstMFC对话框应用程序 此程序是开发一个口令对话框程序&#xff0c;包含了模式对话框与非模式方式调用对话框。 详细见源文件&#xff0c;地址&#xff1a; 共享链接&#xff1a;http://u.163.com/b47tr9n提取码&#xff1a;zxx0o2v2 小时钟程序 主要包含了定时器的启动与…

Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数

1. 前言 很多朋友在调试驱动的时候&#xff0c;都会遇到这样一个场景&#xff1a;修改一个参数&#xff0c;然后调用某个内核中的函数。比如将某个gpio的值拉高/拉低&#xff0c;修改某个寄存器的值等等。如果每一个参数都通过字符设备的ioctl接口&#xff0c;增加对应的cmd&am…

myeclipse运行java项目_myeclipse运行自己从前的或其他人的javaweb项目

1.配置javaweb 连接部署好本地的tomcat服务器方法如下&#xff1a;1.运行Myecipse-->Window-->preference2.MyEclipse-->Servers-->Runtime Environments-->add-->Apache Tomcat v8.03.next->Browser(Tomcat的安装目录)-->finishMyeclipse 设置jdk版本…

MYSQL性能调优及架构设计学习笔记-影响MYSQL性能的相关因素之实例分析

为什么80%的码农都做不了架构师&#xff1f;>>> 需求概述 一个简单的讨论区系统&#xff0c;需要有用户&#xff0c;用户组&#xff0c;组讨论区这三部分基本功能 简要分析 1&#xff09; 须要存放用户数据的表&#xff1b; 2&#xff09; 须要存放分组信息和用户与…

洛谷P2089 烤鸡 题解

题目背景 猪猪hanke得到了一只鸡 题目描述 猪猪Hanke特别喜欢吃烤鸡&#xff08;本是同畜牲&#xff0c;相煎何太急&#xff01;&#xff09;Hanke吃鸡很特别&#xff0c;为什么特别呢&#xff1f;因为他有10种配料&#xff08;芥末、孜然等&#xff09;&#xff0c;每种配料可…

java excel 导入 加校验_POI实现excel各种验证和导入的思路总结

制定标准导入总是与导出相辅相成的&#xff0c;无规矩不成方圆。所谓的标准都是大家一同来维护和遵守的&#xff0c;那么首先就是制定一个模板。这样可以减少验证的工作量。例如时间的规范【yyyy-MM-dd】&#xff0c;获取单元格的时间值用下面的方法java.util.Date date cell.g…

在一个公司10年,会怎么样?

大家好&#xff0c;我是写代码的篮球球痴。最近在知乎上看到一个话题那些在一个公司死磕了5-10年的人最后都怎么样了&#xff1f;"在互联网红利爆发&#xff0c;人心躁动的今天&#xff0c;可以在一个公司磕到5~10年&#xff0c;真的很不容易&#xff0c;我记得前东家要是…

公钥私钥

公钥私钥 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />一&#xff0c;公钥私钥 1&#xff0c;公钥和私钥成对出现 2&#xff0c;公开的密钥叫公钥&#xff0c;只有自己知道的叫私钥 3&#xff0c;用公钥加密的数据只有…

软件测试第三次作业

一、开头 (1)合作者&#xff1a;201631062521&#xff0c;201631062421 (2)代码地址&#xff1a;https://gitee.com/h2503652646/WordCount.git (3)本次作业链接地址&#xff1a;https://edu.cnblogs.com/campus/xnsy/Test/homework/2203 二、正文 (1)互审代码情况 已经实现Wor…

equals()与==的区别

“”比较两个变量本身的值&#xff0c;即两个对象在内存中的首地址。“equals()”比较字符串中所包含的内容是否相同。 比如&#xff1a;String s1,s2,s3 "abc", s4 "abc" ;s1 new String("abc");s2 new String("abc");那么&#x…

Linux驱动开发中与设备树相关的6种debug方法

整理出了6种驱动开发时与设备注册、设备树相关的调试方法&#xff0c;彼此间没有优先级之分&#xff0c;每种方法不一定是最优解&#xff0c;但可以作为一种debug查找问题的手段&#xff0c;快速定位问题原因。例如在芯片验证时&#xff0c;不同时钟频率下系统启动情况摸底时&a…