该文最后提供更多源标识符浏览门牌号市售处置文本的的办公设备应用软件有许多,包括WPS、MSOffice、夏忠OFFICE,总之还有开放源码的openoffice、liboffice等他们在工程建设项目合作开发过程中时常会碰到手动更新word文档,资料库中数据手动充填word模版等市场需求。
那时能满足用户以内市场需求的技术有许多,服务项目端可透过POI\aspose等处置,也可透过顾客端初始化OFFICE模块处置,生前曾在这方便快捷做了许多试验,最后辨认出相容性最合适的、USB对JAVA合作开发人员最亲善的就属夏忠OFFICE,因为它基本上就是JAVA同时实现的,选用起来十分方便快捷。
我的OWL选用的是夏忠2016版本,它运转明确要求JRE1.6,且我辨认出它如果是对JRE进行过解构,按夏忠SDK明确要求撰写标识符透过自ORACAL官网浏览的jdk1.6校对后运转是失利的,那时都2021年了,他们的工程建设项目大多数都JDK1.8以内版本了,那么是不是让SDK相容他们的工程建设项目呢?是不是同时实现副标题中提及的两个市场需求呢?上面我说说我的处置形式吧:
1、浏览夏忠应用软件并加装(官网浏览方可)2、加装后关上加装方向能看见如下表所示图
夏忠应用软件加装目录JRE:即夏忠应用软件的运转自然环境Yozo_Office.jar: 即夏忠为合作开发人员提供更多的SDK,能将jar复制到工程建设中3、撰写WORD文档处置服务项目模块处置word文档的标识符短片,详尽标识符请在zignan浏览源标识符翻查
/**
* 将word文档切换为相关联文件格式的文档的二进制字符串
* @param type 将word文档切换成的文档文件格式 pdf、html\ofd\txt\xml
* @return
* @throws IOException
*/
publicbyte[] convertFile(String type) throws IOException {
int typePdf = FileConstants.TYPE_PDF;
if("html".equals(type.toLowerCase())) {//此机能切换后错字,中后期可选用 this.workbook.saveAs("D:/2.html"); 形式储存html后,将二进制回到
typePdf= FileConstants.FILETYPE_HTML;
}elseif("ofd".equals(type.toLowerCase())) {
typePdf= FileConstants.TYPE_OFD;
// 这个是不获得成功的,如果是版本太低
}elseif("txt".equals(type.toLowerCase())) {
typePdf = FileConstants.TYPE_TXT;
}
elseif("xml".equals(type.toLowerCase())) {
typePdf = FileConstants.FILETYPE_XML;
}elseif("doc".equals
(type.toLowerCase())||"xls".equals(type.toLowerCase())||"ppt".equals(type.toLowerCase())) {
typePdf = FileConstants.TYPE_MS;
}
elseif("docx".equals(type.toLowerCase())||"xlsx".equals(type.toLowerCase())||"pptx".equals(type.toLowerCase())) {
typePdf = FileConstants.TYPE_MS_EX;
}
returnthis.workbooks.getWorkbookAsByteArray(workbook, typePdf);
}
/**
* 替换word模版中的记事本
* @param jsonObject 数据文本 {“bookmarkname”:”test“}
*/
publicvoidreplaceBookMark(JSONObject jsonObject) {
BookMarks bookMarks = this.document.getBookMarks();
BookMark[] allBookmarks = bookMarks.getAllBookmarks();
for(BookMark bookMark:allBookmarks){
String name = bookMark.getName();
TextRange range = bookMark.getRange();
//if(name!=null)name=name.replace("PO_","");
String value = "";
Object o = jsonObject.
get(name);
if(o!=null){
value=jsonObject.get(name).toString();
}
try {
range.insertText(value);
}catch (Exception e){
range.insertText(
value);
}
}
}
/**
* 导出数据成excel文档
* @param jsonObject 数据文本 {“bookmarkname”:”test“}
*/
publicbyte[] exportData2File(JSONArray taskArray,int allrow) {
}4、(重点)解决word文档处置模块与他们的工程建设项目文档交互问题生前透过SOCKET即时通讯服务项目解决数据交互问题
/**
* 文档传输Server端 * 机能说明:
* @Author 空中智囊
* @Date 2016年09月01日
* @version 1.0
*/publicclassSocketServiceextendsServerSocket{
privatestaticfinalint SERVER_PORT = 8899; // 服务项目端端口private WordUtil wordUtil=
null;
publicSocketService()throws Exception {
super(SERVER_PORT);
this.wordUtil=new
WordUtil();
}
/**
* 选用线程处置每个顾客端传输的文档
* @throws Exception
*/publicvoidload()throws
Exception {
System.out.println("服务项目端启动,监听端口为:"+SERVER_PORT);
while (true) {
// server尝试接收其他Socket的连接请求,server的accept形式是阻塞式的
Socket socket = this.accept();
socket.setSoTimeout(
1200000);
/**
* 他们的服务项目端处置顾客端的连接请求是同步进行的, 每次接收到来自顾客端的连接请求后,
* 都要先跟当前的顾客端通信完之后才能再处置下一个连接请求。
这在并发比较多的情况下会严重影响程序的性能,
* 为此,他们能把它改为如下表所示这种异步处置与顾客端通信的形式
*/// 每接收到一个Socket就建立一个新的线程来处置它
new Thread(new Task(socket,wordUtil)).start();
}
}
/**
* 入口
* @param args
*/
publicstaticvoidmain(String[] args){
try {
SocketService server = new SocketService();
// 启动服务项目端
server.load();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 处置顾客端传输过来的文档线程类
*/publicclassTaskimplementsRunnable{
@Overridepublicvoidrun(){
System.out.println(
"===顾客端连接获得成功=====");
System.out.println("****************************************************************"
);
传奇服务端DateFormat format=new 传奇服务端DateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 切换明确要求的文件格式
*/
try {
/********************************读取文档信息********************************/
dis =
new DataInputStream(socket.getInputStream());
// 文档名和长度
String fileName = dis.readUTF();
//1、文档名字long fileLength = dis.readLong();//2、长度
String toext = dis.readUTF();//3、扩展名
String taskType=dis.readUTF();
//4、文档操作类型
System.out.println("针对文档的操作类型====="+taskType);
String valueObject=dis.readUTF();
//5、替换记事本的值
System.out.println(format.format(new Date())+":开始接收文档");
ByteArrayOutputStream bos =
new ByteArrayOutputStream((int)fileLength);
byte[] bytes = newbyte[1024];
int
length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
bos.write(bytes,
0, length);
}
byte[] filebytes = bos.toByteArray();
System.out.println(
"原始文档大小====="+fileLength+",实际接收文档大小="+filebytes.length);
/********************************读取文档信息结束********************************/
dos = new DataOutputStream(socket.getOutputStream());
/********************************校验文档信息********************************/
boolean process=true;
if(fileLength>0){
}else{
dos.writeUTF("error"
);
dos.flush();
dos.writeUTF("文档没有任何文本,请重新传送");
dos.flush();
process=
false;
}
if(filebytes.length!=fileLength){
dos.writeUTF("error"
);
dos.flush();
dos.writeUTF("接受文档与实际文档大小不符合,请重新传送文档");
dos.flush();
process=
false;
}
/********************************校验文档信息结束********************************/
/********************************处置文档********************************/if(process){
byte
[] fileBytes=null;
this.wordUtil.openFile(filebytes,fileName);//关上院文档
//workbook =workbooks.createWorkbookFromByteArray(filebytes,fileName);
String lowerExt = toext.toLowerCase();
if("convertFile".equals(taskType)){
System.out.println("开始将文档["+fileName+"]切换成===="
+lowerExt);
fileBytes=this.wordUtil.convertFile(lowerExt);
System.out.println(format.format(
new Date())+":切换"+toext+"完成");
}elseif("replaceBookMark".equals(taskType)){
System.out.println(
"开始将文档["+fileName+"]记事本进行替换====");
JSONObject jsonObject = JSONObject.fromObject(valueObject);
this.wordUtil.replaceBookMark(jsonObject);
fileBytes = this.wordUtil.convertFile(lowerExt);
System.out.println(
"===============替换记事本完成============");
}elseif("exportTask".equals(taskType)) {//处置业务数据 导出任务数据
System.out.println("开始导出业务数据===="+valueObject);
ServiceUtil serviceUtil =
new ServiceUtil(this.wordUtil);
JSONObject jsonObject = JSONObject.fromObject(valueObject);
fileBytes = serviceUtil.exportData2File(jsonObject.getJSONArray(
"datalist"), jsonObject.getInt("size"));
System.out.println("===============导出业务数据完成============"
);
}
/********************************处置文档结束********************************/
if(fileBytes==null){
dos.writeUTF("error");
dos.flush();
dos.writeUTF(
"处置文档过程中错误");
dos.flush();
process=false;
}
/********************************回到处置过的文档********************************/if(process){
dos.writeUTF(
"info");//文档处置完成,将信息回到到顾客端
dos.flush();
int fileBytelength = fileBytes.length;
//切换后的文档长度
System.out.println(format.format(new Date())+":======== 服务项目端开始发送文档流,文档大小("
+getFormatFileSize(fileBytelength)+") ========");
dos.writeLong(fileBytelength);
dos.flush();
dos.write(fileBytes,
0, fileBytelength);//将文档一起写入到输出流发送
dos.flush();
System.out.println(format.format(
new Date())+":======== 发送文档流获得成功 ========");
}
/********************************回到处置过的文档完成********************************/
}
} catch (Exception e) {
String error = e.toString();
System.out.println(
"error==================="+error);
StackTraceElement[] stackTrace = e.getStackTrace();
for(StackTraceElement s:stackTrace){
int lineNumber = s.getLineNumber();
String methodName = s.getMethodName();
String className = s.getClassName();
String filename = s.getFileName();
System.out.print(
"err:"+filename+" "+className+" "+methodName+" "+lineNumber);
System.out.println(""
);
}
try {
dos.writeUTF("error");
dos.flush();
dos.writeUTF(
"处置文档过程中错误=="+e.toString());
dos.flush();
}catch (Exception ex){
String exrror =ex.toString();
System.out.println(
"回到数据处置错误信息==================="+exrror);
}
}finally {
System.out.println(
"关闭资源");
try {
if(wordUtil!=null)wordUtil.close();
socket.close();
}
catch (Exception e) {
String error = e.toString();
System.out.println(error);
e.printStackTrace();
}
System.out.println(
"****************************************************************");
}
}
/**
* 文档传输C
* 机能说明:
*
@Author 空中智囊
* @Date 2016年09月01日
* @version 1.0
*/publicclassSocketClientextendsSocket{
public
staticfinal Logger LOGGER = Logge传奇服务端ctory.getLogger(SocketClient.class);
privatestaticfinal String SERVER_IP =
"127.0.0.1"; // word文档模块处置服务项目IP门牌号privatestaticfinalint SERVER_PORT = 8899; // word文档模块处置服务项目端口privateint
soTimeout = 60000; // 服务项目链接超时时间 60sprivate Socket client = this;
private FileInputStream fis;
private DataOutputStream dos;
private DataInputStream dis;
private FileOutputStream fos;
publicSocketClient(String listenip, int listenport)throws Exception {
super(listenip, listenport);
this.setSoTimeout(this.soTimeout);
LOGGER.info("Cliect[port:" + this.client.getLocalPort() +
"] 获得成功连接服务项目端");
}
publicSocketClient()throws Exception {
super(SERVER_IP, SERVER_PORT);
this.setSoTimeout(this.soTimeout);
LOGGER.info("Cliect[port:" + this.client.getLocalPort() +
"] 获得成功连接服务项目端");
}
publicSocketClient(String listenip, int listenport, int soTimeout)throws Exception
{
super(listenip, listenport);
this.setSoTimeout(soTimeout);
LOGGER.info("Cliect[port:"
+ this.client.getLocalPort() + "] 获得成功连接服务项目端");
}
/**
* 处置word文档
* @param srcRealPath 模版word文档方向绝对门牌号
*
@param descRealPath 处置后的文档存放门牌号绝对方向
* @param taskType 处置文档的类型 convertFile/replaceBookMark/exportTask
*
@param jsonObject 传给服务项目端的数据对象,这个参数可根据服务项目端市场需求进行调整
* @return 处置结果
*/public JSONObject processOffice
(String srcRealPath, String descRealPath, String taskType, JSONObject jsonObject){
JSONObject rtnObject =
new JSONObject();
String code = "200";
String message = "";
try {
File file =
new File(srcRealPath);
if (!file.exists() || !file.canWrite()) {
code = "200"
;
message = "文档不存在,或已被占用";
rtnObject.element("code", code);
rtnObject.element(
"message", message);
JSONObject var41 = rtnObject;
return var41;
}
LOGGER.info(srcRealPath +
"===>" + descRealPath);
if (file.exists() && file.canWrite()) {
String filename = file.getName();
this.fis = new FileInputStream(file);
this.dos = new DataOutputStream(this.client.getOutputStream());
this.dos.writeUTF(filename);//文档名字this.dos.flush();
this.dos.writeLong(file.length());
//文档长度this.dos.flush();
String ext = descRealPath.substring(descRealPath.lastIndexOf(
".") + 1, descRealPath.length());
this.dos.writeUTF(ext);//源文档后缀名字this.dos.flush();
this.dos.writeUTF(taskType);//任务类型this.dos.flush();
if (YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE.equals(taskType)) {
this.dos.writeUTF(jsonObject.toString());
this.dos.flush();
}
LOGGER.info(
"======== 开始向服务项目端传送源文档" + srcRealPath + " ========");
byte[] bytes = newbyte[1024];
long progress = 0L;
int length;
while((length = this.fis.read(bytes,
0, bytes.length)) != -1) {
this.dos.write(bytes, 0, length);
this.dos.flush();
progress += (long)length;
LOGGER.info("| " +
100L * progress / file.length() + "% |");
}
LOGGER.info("======== 文档传输获得成功 ("
+ file.length() / 1048576L + ")M========");
this.client.shutdownOutput();
LOGGER.info(
"======== 开始切换" + ext + " ========");
InputStream inputStream = this.client.getInputStream();
this.dis = new DataInputStream(inputStream);
String result = this.dis.readUTF();
if ("error".equals(result)) {
String reason = this.dis.readUTF();
LOGGER.info(reason);
code =
"500";
message = reason;
} elseif ("info".equals(result)) {
long l = this.dis.readLong();
LOGGER.info("======== 切换" + ext + "完成,文档大小(" + l /
1048576L + ")M ========");
LOGGER.info("======== 开始接受" + ext + " ========");
File newFile =
new File(descRealPath);
if (newFile.exists()) {
newFile.delete();
}
this.fos = new FileOutputStream(newFile);
progress = 0L;
bytes =
newbyte[1048576];
while((length = this.dis.read(bytes, 0, bytes.length)) != -1) {
this.fos.write(bytes, 0, length);
this.fos.flush();
}
LOGGER.info(
"======== 接受" + ext + "文档获得成功========");
this.dis.close();
} else {
code =
"500";
message = "链接被强制关闭....";
}
} else {
code =
"404";
message = "文档不存在,或已被占用:" + srcRealPath;
}
} catch (Exception e) {
code =
"500";
message = "顾客端报错:" + e.toString();
LOGGER.error("异常:",e);
} finally
{
if (this.fis != null) {
try {
this.fis.close();
}
catch (Exception var38) {
;
}
}
if (this
.fos != null) {
try {
this.fos.close();
} catch (Exception var37) {
;
}
}
try {
this.client.close();
} catch (Exception var36) {
;
}
}
rtnObject.element(
"code", code);
rtnObject.element("message", message);
return rtnObject;
}
public
staticvoidmain(String[] args){
try {
SocketClient socketClient = new SocketClient();
// 将文档切换成pdf文档
socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,
null);
// 将文档切换成pdf文档
JSONObject dataObject = new JSONObject();
dataObject.element(
"bookmarkname","这个是试验呢日哦那个");
socketClient.processOffice("D:/2.doc","D:/2.pdf",YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject);
}
catch (Exception e) {
LOGGER.error("异常:",e);
}
}
}
5、启动word文档处置模块服务项目端
模块启动脚本nohup ./ofdServer.sh &6、初始化服务项目端对word文档处置publicstaticvoidmain(String[] args) {
try {
SocketClient socketClient =
new SocketClient();
// 将文档切换成pdf文档
socketClient.processOffice("D:/2.doc","D:/2.pdf"
,YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,null);
// 替换模版中的记事本值,word中插入记事本自行百度
JSONObject dataObject =
new JSONObject();
dataObject.element("bookmarkname","这个是试验呢日哦那个");
socketClient.processOffice(
"D:/2.doc","D:/3.doc",YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject);
} catch (Exception e) {
LOGGER.error(
服务项目端资源文本将文档复制到linux服务项目器,并解压,执行 ./ofdServer.sh ,输出:服务项目端启动,监听端口为:8899,即运转获得成功word文档处置模块顾客端(开箱即用processOffice):
链接: https://pan.b
顾客端资源文档文本将源文档复制到工程建设项目指定包名,运转SocketClient.java中的main形式,可查看运转结果。最重要的一点:服务项目器要加装夏忠OFFICE顾客端
|