JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...
Java根据word模板生成word文档之后台解析和实现及部分代码(一)
后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换。首先想多说一句就是
jacob会每次生成word报告时都会启动一个office word进程,替换完毕之后
需要关闭掉这个进程,如果有死掉的word进程有可能会影响word的生成。这些具体做火这调试过程中就会发现这个问题的。
还需要说明一点,解析XML有很多种方式,自己挑选自己熟悉的就行了,我采用jdom,当时想的没有这么负责,所以写代码也没有怎么重构,需要重新整理,主要方法我会贴出来。
那么我就从头到尾的说一下,调用生成报告时,后台的整个调用过程是怎么样的,是如何运转的?
首先访问web应用地址:http://192.16.3.22/demo/DocInfo!createDoc.action
这样我提交一个方法
action方法,这个方法首先是在web应用服务器上的,然后进入action中的createDoc方法,同时你需要获取到从方法传过来的相关参数,
比如:sql中定义的那个查询条件,报告类型等参数。
(在去调用生成报告的方法中,可能你还需要加入一些判断,如是否已经生成过报告啊,或者最新报告的版本啊,因为我们都是既保存word报告文档又会在数据库中插入一条记录,方便查询),这样就开始了:
首先是action的createDoc方法:
[java]
view plain
copy
/**
* 通过HttpCient调用报告服务器的方法生成报告 DOC
*/
public
String createDoc()
throws
Exception {
//定义放回成功与否的判断码
String prMsg=""
;
// 获取当前登录的用户
UserVo userVo = CommonUtils.getUserMessage();
//获取模版类型
docType = Struts2Utils.getParameter("docType"
);
//重新创建文档
String creatOrnot = Struts2Utils.getParameter("creatOrnot"
);
//获取组组编号参数
workgroupId = Struts2Utils.getParameter("workgroupId"
);
//获取评估用例实例ID参数
evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId"
);
if
(CommonUtils.isNotNull(docType)){
//获取项目Id
projectId = Struts2Utils.getParameter("projectId"
);
if
(!CommonUtils.isNotNull(projectId)){
if
(CommonUtils.isNotNull(
this
.getIdFromSession(
"PM_PROJECTID"
))){
projectId = this
.getIdFromSession(
"PM_PROJECTID"
).toString();
}else
{
Struts2Utils.getRequest().setAttribute("msg"
,
"请先选择项目!"
);
}
}
if
(CommonUtils.isNotNull(projectId)){
prMsg = infoSystemDescService.downloadFileByUrl(projectId, userVo.getUserId(), workgroupId, evtcaseInstId, docType, creatOrnot);
}
}
return
"docList"
;
}
注:在我贴出来的代码中,能看懂就行了,有些不用管他(可能是其他业务方面的判断),关于最后返回的prMsg---代表各种状态
主要表示成功与否或者是出错的信息。
接着我贴出service层的方法downloadFileByUrl
[java]
view plain
copy
"code"
class
=
"java"
>
"code"
class
=
"java"
>
/**
* 功能:
* 1.(生成报告文档)
* 2.保存指定URL的源文件到指定路径下
* @param projectId
* @param userId
* @param workgroupId
* @param evtcaseInstId
* @param docType
* @param creatOrnot
* @return
* @throws Exception
*/
@SuppressWarnings
(
"deprecation"
)
public
synchronized
String downloadFileByUrl(String projectId,String userId,String workgroupId,String evtcaseInstId,String docType,String creatOrnot)
throws
Exception {
String msg = "1"
;
//"1":默认为创建成功的提示信息 "2":标识创建失败
String srcUrl = ""
;
//报告服务器的执行路径
HttpResponse response = null
;
FileOutputStream out = null
;
HttpClient httpclient = null
;
HttpGet httpget = null
;
long
time1 = System.currentTimeMillis();
//获取保存后的路径
TProjDoc projDoc = projectDocDao.findFileByType(userId, Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
if
(projDoc ==
null
|| (projDoc !=
null
&& CommonUtils.isNotNull(creatOrnot) && creatOrnot.equals(
"1"
))){
//FT_任务编号_[FID]
try
{
//获取报告服务器的执行路径
srcUrl = xmlPathDef.getActionUrl(docType, projectId,userId,workgroupId,evtcaseInstId);
HttpParams httpParams = new
BasicHttpParams();
// 设置最大连接数
ConnManagerParams.setMaxTotalConnections(httpParams, 1
);
// 设置获取连接的最大等待时间
//ConnManagerParams.setTimeout(httpParams, 6000);
// 设置每个路由最大连接数
ConnPerRouteBean connPerRoute = new
ConnPerRouteBean(
1
);
ConnManagerParams.setMaxConnectionsPerRoute(httpParams,connPerRoute);
// 设置连接超时时间
HttpConnectionParams.setConnectionTimeout(httpParams, 6000
);
// 设置读取超时时间
if
(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) && docType.toString().equals(XmlPathDef.FTEST_DOC)){
HttpConnectionParams.setSoTimeout(httpParams, 2400000
);
}else
{
HttpConnectionParams.setSoTimeout(httpParams, 600000
);
}
SchemeRegistry registry = new
SchemeRegistry();
registry.register(new
Scheme(
"http"
, PlainSocketFactory.getSocketFactory(),
80
));
registry.register(new
Scheme(
"https"
, SSLSocketFactory.getSocketFactory(),
443
));
ClientConnectionManager connectionManager = new
ThreadSafeClientConnManager(httpParams, registry);
httpclient = new
DefaultHttpClient(connectionManager, httpParams);
httpget = new
HttpGet(srcUrl);
//执行返回
response = httpclient.execute(httpget);
//如果是本机既当服务器,又当报表服务器,那么就只生成一遍
String ipvalues = xmlPathDef.getRepUrl();
if
(CommonUtils.isNotNull(ipvalues)){
if
(ipvalues.indexOf(
":"
) != -
1
){
ipvalues = ipvalues.substring(0
,ipvalues.lastIndexOf(
":"
));
}
}
HttpEntity entity = response.getEntity();
//获取保存后的路径
projDoc = projectDocDao.findFileByType(userId,Integer.parseInt(docType), Long.parseLong(projectId), workgroupId,evtcaseInstId);
String filePath = ""
;
if
(projDoc !=
null
)
filePath = projDoc.getPath();
if
(CommonUtils.isNotNull(filePath)){
String basepath = XmlPathDef.getBasePath();
String outFilePath = (basepath + filePath).replaceAll("\\\\", "
\\/");
XmlPathDef.isExists(outFilePath);
File wdFile = new
File(outFilePath);
out = new
FileOutputStream(wdFile);
int
l;
byte
[] tmp =
new
byte
[
2048
];
while
((l = instream.read(tmp)) != -
1
) {
out.write(tmp, 0
, l);
}
out.flush();
out.close();
System.out.println("****************************** "
);
System.out.println(""
);
System.out.println("*************** 恭喜! 报告创建成功 结束 ***************"
);
System.out.println(""
);
}else
{
msg = "8"
;
//说明word创建成功,但是数据没有保存成功
response = null
;
}
}else
{
msg = "2"
;
}
} catch
(ClientProtocolException e) {
msg = "7"
;
e.printStackTrace();
} catch
(IOException e) {
msg = "7"
;
logger.error("数据库报告服务器地址配置错误或网络不通!!2.连接是否超时"
+ e.getMessage());
e.printStackTrace();
}finally
{
if
(out!=
null
){
try
{
out.close();
} catch
(IOException e) {
msg = "7"
;
logger.error("数据库报告服务器地址配置错误或网络不通!!2.连接是否超时"
+ e.getMessage());
e.printStackTrace();
}
}
}
}
long
time2 = System.currentTimeMillis();
long
numTime = time2 - time1;
if
(docType.toString().equals(XmlPathDef.SPOTTEST_DOC) && docType.toString().equals(XmlPathDef.FTEST_DOC)){
if
(numTime >=
2401000
){
msg = "9"
;
}
}else
{
if
(numTime >=
601000
){
msg = "9"
;
}
}
System.out.println(""
);
String loggerinfo = "********* 报告类型为 :"
+ docType +
" 执行时间为: "
+ (time2 - time1) /
1000
+
" 秒!***************"
;
System.out.println(loggerinfo);
System.out.println(""
);
System.out.println("*****************************"
);
logger.info(loggerinfo);
return
msg;
}
这个方法还有待优化和调整,现在我主要说明他的作用:
首先
使用了synchronized 关键字
意思说使用同步的方式,让每次只有一个线程运行这个方法(其实如果是大数量的并发,就不能这样写了,自己去摸索吧)。然后在方法体中,使用了一个
httpclient技术,这个主要是调用远程的服务返回对象流,在我这里就是调用另外一个服务器的代码,去生成报告,
然后
将word报告的流返回来就ok,如果不明白httpclient的用法,请上网学一下,具体我就不说了。(下节我会贴出相应的代码
)
最后
通过httpclient的返回流写成word文档就行了(其实里面还有一些判断什么的,比如:最后返回流是否是word流啊,什么的 都需要判断的,我都去掉了,代码太多),返回一个状态码给action就完毕。
JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...相关推荐
- java先删后保存数据库据功能,还在手工生成数据库文档?3个步骤自动完成了解一下...
自动化生成数据库文档,简单的3个步骤即可完成,了解一下. 1 前言 平时工作中,大家应该都会遇到需要导出数据库说明文档(也叫数据字典)的情况,即把各数据表的字段信息整理成一个个的表说明,然后用 exc ...
- js文件 import java类_实现JS脚本导入JAVA类包
本例演示怎样通过JS脚本导入JAVA类包,我们创建JS引擎后,通过eval方法调用 getScript() ,JS脚本中importPackage(java.util)为导入包. package aj ...
- 将mysql 导出word文档_将数据库的内容生成WORD文档
毕业设计需要从库里取纪录生成word文档,我找了半天,主要有这么几种方法: 1.改头,就是象excel似的Response.Buffer = TRUE Response.ContentType = & ...
- python-docx中文开发文档_使用Python语言-docx生成Word文档
本文主要向大家介绍了使用Python语言-docx生成Word文档,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. < 学会来使用python操作数据表和PDF,今天我们尝试 ...
- springboot 中文文档_还在用 Swagger生成接口文档?我推荐你试试它
JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又不得不做的事情,我们都不喜欢写文档,但除非项目前后 ...
- word可以直接导入mysql嘛_如何把word文档导入到数据库中——java POI
本文方法借鉴于https://www.cnblogs.com/ljysy/p/10574197.html 在经过朋友的指导下,在处理文档的方式上有所不同. 我的数据库使用的是SQL server,这篇 ...
- java pem 私钥_将PEM导入Java密钥库
在我的情况下,我有一个pem文件,其中包含两个证书和一个用于相互SSL身份验证的加密私钥.所以我的pem文件看起来像这样: -----BEGIN CERTIFICATE----- ... -----E ...
- jython 导入java包_在jython中导入java类
我用python处理NLP.有一个NLP工具,即Zemberek,用于土耳其语.但它是用java编写的.所以我必须使用jython来导入这些类.我安装了Jython2.7.另外,我安装了eclipse ...
- java用模板生成word(docx)文档(含动态表格)
生成word思路 用WPS或者office编辑好word的样式,然后另存为word xml文档,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Docx. 编 ...
最新文章
- T5,一个探索迁移学习边界的模型
- 中国AI专利申请量超美国,百度居国内首位
- 9大项目实战!tensorflow2.0框架实战(免费资料+干货合集)
- 大专计算机专业内容,大专计算机专业毕业论文参考范例
- linux iscsi 服务端,Linux的iscsi磁盘服务
- ×××S 2008 实用小技巧
- 基于区块链的健康链系统设计与实现(6)结束语
- Flask 教程 第十八章:Heroku上的部署
- css:构建响应式网站
- 利用Java生成静态HMTL页面的方法收集
- input属性disabled和readonly的区别
- 代码chaid_适配者 – 研究和分享IT前沿技术,形成以开源软件、代码分享、技术分享、IT职业发展等经验分享网站。...
- 运维安全加固规范_DBA如何巧用“三十六计”保障数据库安全?
- 力扣-1880(243 周赛) 检查某单词是否等于两单词之和
- 三星android智能手机usb驱动程序,三星手机驱动官方下载
- Workstation服务无法启动导致无法访问文件服务器
- 知识图谱论文梳理【 HyTE:基于超平面的时序知识图谱】
- 12 个动画设计方法,帮助你快速实现炫酷的网页动画效果
- SLG变现强劲,却易遭黑产侵袭,如何破局?SLG游戏安全方案定制做到出奇制胜!
- 离谱!2019年诺奖得主大翻车!被曝54篇论文涉嫌造假,刚撤回4篇PNAS