最近在实现自动调用打印机功能。现在和大家分享一下,要源代码可以联系962589149
之前因为需要,去学习了几种WEB报表的打印方式,发现用Java直接去操作Word、Excel还是不那么方便,下面就简单介绍几种;
1、用浏览器自带的打印功能直接打印;
这种方式是最直接的,方便的,不需要加什么插件jar包,只要前台在一个 div 中模仿着报表的格式去设置界面布局,然后把数据动态的填充进去,再调用JavaScript打印函数,就可以实现界面的局部打印功能。(如果不想让报表div在界面中显示出来可以隐藏之)PS:不过直接在前台界面打印还是会遇到意想不到的情况,不同浏览器的问题,反正我就遇到不同浏览器打印出来的报表排版不一的情况,用的时候需要注意。
eg:
div布局
<div id="printdiv" style="display:none;">
<table id="tableid" class="main" cellspacing="0" cellpadding="0" border="1"
bordercolor="#000000" align="center" width="800px;">
/****** your code ******/
</table>
</div>
JavaScript部分:(自己根据需要选择触发响应的JS函数)
function windowprint() {
var f = document.getElementById("printdiv");
f.style.display = "";
window.print();
f.style.display = "none";
}
function myPrint(obj){
var newWindow=window.open("打印窗口","_blank");
var docStr = obj.innerHTML;
newWindow.document.write(docStr);
newWindow.document.close();
newWindow.print();
newWindow.close();
}
2、使用第三方插件完成报表打印编辑(这里介绍PageOffice 和 Jacob)
先说PageOffice,这是国产货,其强大之处在于其对Word的处理和它的在线编辑能力,最大的不足就是要收费(不过也不知道怎么收,下载的包里有自带的试用码,也不管先用着玩玩)
准备:去官网下载java版本的包(http://www.zhuozhengsoft.com/download.html),解压后需要把PageOffice.cab和pageoffice.jar两个包放到WEB-INF/lib中去还要在你的web.xml中加入以下部分:
<!-- PageOffice Begin -->
<servlet>
<servlet-name>poserver</servlet-name>
<servlet-class>com.zhuozhengsoft.pageoffice.poserver.Server</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>poserver</servlet-name>
<url-pattern>/poserver.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>poserver</servlet-name>
<url-pattern>/pageoffice.cab</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>poserver</servlet-name>
<url-pattern>/popdf.cab</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>poserver</servlet-name>
<url-pattern>/sealsetup.exe</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>adminseal</servlet-name>
<servlet-class>com.zhuozhengsoft.pageoffice.poserver.AdminSeal</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>adminseal</servlet-name>
<url-pattern>/adminseal.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>adminseal</servlet-name>
<url-pattern>/loginseal.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>adminseal</servlet-name>
<url-pattern>/sealimage.do</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>mht</extension>
<mime-type>message/rfc822</mime-type>
</mime-mapping>
<context-param>
<param-name>adminseal-password</param-name>
<param-value>123456</param-value>
</context-param>
<!--<context-param>
<param-name>posealdb-driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>posealdb-url</param-name>
<param-value>jdbc:mysql://localhost:3306/sample</param-value>
</context-param>
<context-param>
<param-name>posealdb-username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>posealdb-password</param-name>
<param-value>admin</param-value>
</context-param>-->
<!-- PageOffice End -->
然后就可以直接用了
eg:直接贴一个Struts2下使用的Demo好了
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.*;
import com.opensymphony.xwork2.ActionSupport;
import com.zhuozhengsoft.pageoffice.*;
publicclass WordDemo extends ActionSupport implements ServletRequestAware, ServletResponseAware{
privatestaticfinallong serialVersionUID = -758686623642845302L;
private HttpServletRequest request;
private HttpServletResponse response;
private String message = "";
publicvoid setServletRequest(HttpServletRequest request) {
this.request = request;
}
publicvoid setServletResponse(HttpServletResponse response) {
this.response = response;
}
public String getMessage(){
return message;
}
public String openword() throws Exception {
PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(ServletActionContext.getRequest());
poCtrl1.setServerPage("poserver.do"); //此行必须
// 加载控件,可以显示在在线编辑栏中
poCtrl1.addCustomToolButton("保存", "SaveDocument()", 1);
poCtrl1.addCustomToolButton("-", "", 0);
poCtrl1.addCustomToolButton("打印", "ShowPrintDlg()", 6);
poCtrl1.addCustomToolButton("-", "", 0);
poCtrl1.addCustomToolButton("全屏切换", "SetFullScreen()", 4);
poCtrl1.addCustomToolButton("-", "", 0);
poCtrl1.addCustomToolButton("加盖印章", "AddSeal()", 5);
poCtrl1.addCustomToolButton("手写签批", "AddHandSign()", 5);
poCtrl1.addCustomToolButton("验证印章", "VerifySeal()", 5);
poCtrl1.setSaveFilePage("saveword.action");
// 打开WebRoot/doc/test.doc模版
poCtrl1.webOpen("doc/test.doc", OpenModeType.docNormalEdit, "张三");
poCtrl1.setTagId("PageOfficeCtrl1"); //此行必须
return "openword_"+SUCCESS;
}
public String saveword() throws Exception {
FileSaver fs = new FileSaver(request, response);
request.setAttribute("FileSaver", fs);
String fileName = "\\maker" + fs.getFileExtName();
fs.saveToFile(request.getSession().getServletContext().getRealPath("doc/")+ fileName);//fs.getFileName()
fs.showPage(150, 150);
message = "保存文件至服务器成功!";
return "saveword_"+SUCCESS;
}
}
还可以在模版中设置书签指定动态替换,不过需要注意一点的是在返回的JSP界面中<body>中需要加入
<po:PageOfficeCtrl id="PageOfficeCtrl1" /> |
关于具体的,可以参考他的文档,是中文的文档,而且官网还可以下载很多Demo参考,没什么可以说的了,PS:不过就是感觉它在网页中直接打开word速度有点慢,不过这可能是微软问题。。
B:jacob
简单的看了一下,又是要加jar包,还要把它那dll文件放到你的系统路径下,感觉好烦的样子,具体怎么做网上也能找到,不再赘述。
eg:(贴一个小例子)
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
publicclass JacobTest {
publicstaticvoid main(String[] args) {
//启动word,生成一个ActivexComponent对象
ActiveXComponent app = new ActiveXComponent("Word.Application");
//要转换的word文件
String inFile = "D:\\demo.doc";
//要报存的目标文件
String tpFile ="D:\\demo1.doc";
boolean flag = false;
Dispatch xlo = app.getObject();
String oldText="1234";
String newText="test";
boolean visible=false;
String bookMarkKey1="LB_KJGG";
String bookMarkKey2="PO_Sex";
try {
//设置word不可见
app.setProperty("Visible", new Variant(visible));
//log.info("设置word不可见成功!");
System.out.println("设置word不可见成功!");
Dispatch docs = app.getProperty("Documents").toDispatch();
Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{inFile, new Variant(false), new Variant(true)}, newint[1]).toDispatch(); //打开word文件
//在word2003的vba文档中application有UserName属性。
String userName=app.getPropertyAsString("UserName");
System.out.println("用户名:"+userName);
Dispatch selection=app.getProperty("Selection").toDispatch();
//得到一个组件
System.out.println("Selection");
Dispatch find = app.call(selection, "Find").toDispatch();
//查找什么文本
Dispatch.put(find, "Text", oldText);
//替换文本
Dispatch.call(find,"ClearFormatting");
Dispatch.put(find, "Text", oldText);
Dispatch.call(find, "Execute");
Dispatch.put(selection, "Text", newText);
// Dispatch.call(app, "SaveAs", inFile);
System.out.println("replace");
//把指定的值设置到指定的标签中去
Dispatch activeDocument=app.getProperty("ActiveDocument").toDispatch();
System.out.println("activedocument");
Dispatch bookMarks = app.call(activeDocument, "Bookmarks").toDispatch();
System.out.println("bookmarks");
boolean bookMarkExist1=Dispatch.call(bookMarks,"Exists",bookMarkKey1).toBoolean();
boolean bookMarkExist2=Dispatch.call(bookMarks,"Exists",bookMarkKey2).toBoolean();
if(bookMarkExist1==true){
System.out.println("exists bookmark!");
Dispatch rangeItem = Dispatch.call(bookMarks, "Item",bookMarkKey1).toDispatch();
System.out.println("range item!");
Dispatch range = Dispatch.call(rangeItem, "Range").toDispatch();
System.out.println("range !");
//取标签的值
String bookMarkValue=Dispatch.get(range,"Text").toString();
bookMarkValue="hello";
if(bookMarkValue!=null){
Dispatch.put(range, "Text", new Variant(bookMarkValue));
}
}else{
System.out.println("not exists bookmark!");
}
//保存文件
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {tpFile, new Variant(0)} , newint[1]);
//作为word格式保存到目标文件
Variant f = new Variant(false);
Dispatch.call(doc, "Close", f);
flag = true;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
app.invoke("Quit", new Variant[] {});
}
}
}
3、还有一个技术,POI,其实第一个就学的这个。对Excel的处理还行,对word的处理,读取还过的去,但是写入,尤其是写入图片,不知道能么办,而且用起来好麻烦。(真是想不通都搞了10来年的技术了,还这样。。)
eg1:(向word中插入一段文本)
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hwpf.model.io.HWPFFileSystem;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/*
* 可以向word中插入文本
* */
publicclass TestWrite4 {
publicstaticvoid main(String[] args) throws Exception {
HWPFFileSystem files = new HWPFFileSystem();
try
{
String str =
"This is our first doc file Jojiiiiiiiiiiii….We Got IT..But not sure !!";
str += "rn这是我的第一个doc例子!";
byte b[] = str.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(b);
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
DocumentEntry de = directory.createDocument("WordDocument", bais);
FileOutputStream ostream = new FileOutputStream("d:\\testCreate.doc");
fs.writeFilesystem(ostream);
bais.close();
ostream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
相关推荐
以下是几种常用的报表打印技术方案。 ##### 6.1.1 JavaScript + CSS 打印技术 **JavaScript** 和 **CSS** 结合可以非常有效地实现在Web页面上的打印功能。这种方式主要是通过JavaScript脚本来调用浏览器自身的打印...
水晶报表在Java Web中的实现是将复杂的业务数据转化为可视化、易于理解的报表的过程。这个实现主要涉及了几个关键技术和组件,包括Crystal Reports、Java、JSP(Java Server Pages)以及Tomcat服务器。以下是对这些...
Java Web开发学生管理系统是一个基于Java技术的Web应用程序,主要用于高校或教育机构管理学生信息、课程安排、成绩记录等日常事务。这个系统的核心目标是提高管理效率,减少人为错误,并为决策提供数据支持。 首先...
基于Java Web的人事管理系统是一种常见且实用的项目,通常用于教学和实践,帮助开发者学习如何在实际环境中运用Java Web技术。这个系统适用于课程设计,提供了一个基础的功能框架,可以进一步扩展和完善。 首先,让...
在Java环境中,水晶报表通过Java API与应用程序集成,为用户提供了一种直观且强大的报表设计和展示方式。 首先,了解Java水晶报表的基本概念至关重要。水晶报表主要由以下几个部分组成: 1. 报表设计:在水晶报表...
Java Web 办公自动化系统是一种基于Java技术的、用于企业内部管理的信息化平台。它集成了多种办公功能,如文档管理、任务分配、工作流审批、信息公告等,旨在提升工作效率,降低管理成本。本系统支持多种数据库环境...
初学者应从理解Java Web基础开始,学习Servlet和JSP的使用,然后掌握一种或几种图表库,如JFreeChart或JavaScript的Chart.js。随着对前端技术的深入,可以研究如何使用AJAX和WebSocket实现动态更新。 总结,Java ...
"基于Java_XML的自定义Web报表模型研究"是一个深入探讨如何利用Java技术和XML语言来构建灵活、可扩展的Web报表系统的研究主题。这篇研究可能涵盖以下几个关键知识点: 1. **Java技术基础**:Java是一种广泛使用的...
这使得报表可以以不同的方式展示给最终用户,例如可以发送到打印机打印,也可以导出到文件供用户下载查看。 DynamicReports的灵活性和易用性让它成为一个适用于多种场景的报表工具。从简单的报表到复杂的数据可视化...
在Web环境中,水晶报表可以无缝集成到ASP.NET、Java等Web应用框架中,提供交互式报表查看和导出功能,极大地增强了Web应用的数据展示能力。 对于描述中提到的柱状图和饼状图,它们是数据分析和报表中常见的可视化...
Java Web 商城源码是一个基于Java技术的电子商务平台开发框架,专为初学者和二次开发者设计,提供了完整的功能模块和清晰的代码结构,方便学习和扩展。这个源码项目通常包含以下几个关键知识点: 1. **Java Web基础...
【标题】"超市收银管理系统运用Java web开发"揭示了一个基于Java Web技术构建的系统,旨在管理和优化海鲜超市的收银流程。这个系统利用了Java EE(企业版)的多种组件和服务,为超市的运营提供了信息化支持。 ...
Java 实现的报表系统是一种基于编程语言的工具,主要用于数据的整理、展示和分析,尤其适合企业级应用中对大量业务数据的处理。这个“java实现的报表源码”项目,据描述,是一个完整的工程,包含所有必要的文件,...
Java Web绩效考评系统是一种利用Java技术开发的企业级应用,它主要用于评估和管理员工的工作表现。在本项目中,我们看到的“绩效考评系统—java web.rar”是一个包含源代码和数据库配置的压缩文件,用于搭建一个完整...
当前面向Web的报表软件主要有以下几种体系结构: 1. **纯Web报表**:以润乾为代表,能够与Web应用无缝集成,实现高效运行。 2. **控件方式**:以数据为代表的报表软件,通常需要在客户端安装特定插件。 3. **独立...
随着信息技术的发展,Web打印成为越来越多企业选择的高效打印方式之一。本文档旨在介绍如何利用Jaspersoft、iReport、Designer 4.5.0等工具实现Web端直接打印的需求,特别适用于.NET项目中希望优化打印流程的情况。...
【Java车位管理系统】是一个基于Java Web技术开发的停车场管理应用程序,它利用了Java的强大功能以及jsp(JavaServer Pages)的动态网页渲染能力,为停车场提供了一套完整的解决方案。该系统通常包括用户界面、后台...
本资源提供了一个基于JSP(Java Server Pages)的自定义报表打印源程序代码,这为开发者提供了极大的灵活性和便利性。JSP是一种动态网页技术,它可以将Java代码嵌入到HTML页面中,使得服务器端能够处理数据并返回...
综上所述,生成可打印报表打印条形码涉及到的技术点包括条形码编码原理、报表生成工具的使用、Web开发中的前后端交互以及打印设置。"WebSite2"压缩包中的代码可能涵盖了这些方面,通过对代码的学习和研究,可以深入...
本实例——"Web报表开发技术-综合实例-JSP+JavaBean超市销量管理系统",旨在介绍如何利用JSP和JavaBean技术构建一个能够处理超市销售数据的Web报表系统。 首先,我们需要理解JSP(JavaServer Pages)和JavaBean的...