大家好,关于小说网站源码分享txt下载很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
文章最后提供源码下载地址
市面上处理文字的的办公软件有很多,包括WPS、MSOffice、永中OFFICE,当然还有开源的openoffice、liboffice等。我们在项目开发过程中经常会遇到预览word文件,数据库中数据自动填充word模板等需求。现在能够满足以上需求的技术有很多,服务端可通过POI\\aspose等处理,也可通过客户端调用OFFICE组件处理,本人曾经在这方便做了很多测试,最终发现兼容性最好的、接口对JAVA程序员最友好的就属永中OFFICE,因为它基本就是JAVA实现的,使用起来非常方便。
我的测试环境使用的是永中2016版本,它运行要求JRE1.6,且我发现它应该是对JRE进行过重构,按永中SDK要求编写代码通过自ORACAL官网下载的jdk1.6编译后运行是失败的,现在都2021年了,我们的项目绝大多数都JDK1.8以上版本了,那么怎么让SDK兼容我们的项目呢?怎么实现标题中提到的两个需求呢?下面我说说我的处理方法吧:
1、下载永中软件并安装(官网下载即可)
2、安装后打开安装路径可以看到如下图
永中软件安装目录
JRE:即永中软件的运行环境
Yozo_Office.jar:即永中为开发者提供的SDK,可以将jar导入到工程中
3、编写WORD文件处理服务组件
处理word文件的代码片段,详细代码请在文后下载源码查阅\t\n\n/**\n\t*将word文件转换为对应格式的文件的字节数组\n\t*@paramtype将word文件转换成的文件格式pdf、html\\ofd\\txt\\xml\n\t*@return\n\t*@throwsIOException\n\t*/\n\tpublicbyte[]convertFile(Stringtype)throwsIOException{\n\t\tinttypePdf=FileConstants.TYPE_PDF;\n\t\tif(&34;.equals(type.toLowerCase())){//此功能转换后乱码,后期可采用this.workbook.saveAs(&34;);方式存储html后,将字节返回\n\t\t\ttypePdf=FileConstants.FILETYPE_HTML;\n\t\t}elseif(&34;.equals(type.toLowerCase())){\n\t\t\ttypePdf=FileConstants.TYPE_OFD;\t//这个是不成功的,应该是版本太低\n\t\t}elseif(&34;.equals(type.toLowerCase())){\n\t\t\ttypePdf=FileConstants.TYPE_TXT;\n\t\t}elseif(&34;.equals(type.toLowerCase())){\n\t\t\ttypePdf=FileConstants.FILETYPE_XML;\n\t\t}elseif(&34;.equals(type.toLowerCase())||&34;.equals(type.toLowerCase())||&34;.equals(type.toLowerCase())){\n\t\t\ttypePdf=FileConstants.TYPE_MS;\n\t\t}elseif(&34;.equals(type.toLowerCase())||&34;.equals(type.toLowerCase())||&34;.equals(type.toLowerCase())){\n\t\t\ttypePdf=FileConstants.TYPE_MS_EX;\n\t\t}\n\t\t\n\t\treturnthis.workbooks.getWorkbookAsByteArray(workbook,typePdf);\n\t}\n\n/**\n\t*替换word模板中的书签\n\t*@paramjsonObject\t数据内容{“bookmarkname”:”test“}\n\t*/\n\tpublicvoidreplaceBookMark(JSONObjectjsonObject){\n\tBookMarksbookMarks=this.document.getBookMarks();\nBookMark[]allBookmarks=bookMarks.getAllBookmarks();\n\t\tfor(BookMarkbookMark:allBookmarks){\nStringname=bookMark.getName();\nTextRangerange=bookMark.getRange();\n//if(name!=null)name=name.replace(&34;,&34;);\nStringvalue=&34;;\nObjecto=jsonObject.get(name);\nif(o!=null){\nvalue=jsonObject.get(name).toString();\n}\ntry{\nrange.insertText(value);\n}catch(Exceptione){\nrange.insertText(value);\n}\n\t\t}\n\t}\n\n/**\n\t*导出数据成excel文件\n\t*@paramjsonObject\t数据内容{“bookmarkname”:”test“}\n\t*/\npublicbyte[]exportData2File(JSONArraytaskArray,intallrow){\n\n}
4、(重点)解决word文件处理组件与我们的项目文件交互问题
本人通过SOCKET即时通讯服务解决数据交互问题
/**\n*文件传输Server端<br>\n*功能说明:\n*@Author空中智囊\n*@Date2016年09月01日\n*@version1.0\n*/\npublicclassSocketServiceextendsServerSocket{\nprivatestaticfinalintSERVER_PORT=8899;//服务端端口\n\nprivateWordUtilwordUtil=null;\npublicSocketService()throwsException{\nsuper(SERVER_PORT);\nthis.wordUtil=newWordUtil();\n}\n\n/**\n*使用线程处理每个客户端传输的文件\n*@throwsException\n*/\npublicvoidload()throwsException{\nSystem.out.println(&34;+SERVER_PORT);\nwhile(true){\n//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的\nSocketsocket=this.accept();\nsocket.setSoTimeout(1200000);\n/**\n*我们的服务端处理客户端的连接请求是同步进行的,每次接收到来自客户端的连接请求后,\n*都要先跟当前的客户端通信完之后才能再处理下一个连接请求。这在并发比较多的情况下会严重影响程序的性能,\n*为此,我们可以把它改为如下这种异步处理与客户端通信的方式\n*/\n//每接收到一个Socket就建立一个新的线程来处理它\nnewThread(newTask(socket,wordUtil)).start();\n\n}\n}\n/**\n*入口\n*@paramargs\n*/\npublicstaticvoidmain(String[]args){\ntry{\nSocketServiceserver=newSocketService();//启动服务端\nserver.load();\n}catch(Exceptione){\ne.printStackTrace();\n}\n}\n}\n/**\n*处理客户端传输过来的文件线程类\n*/\npublicclassTaskimplementsRunnable{\n@Override\npublicvoidrun(){\nSystem.out.println(&34;);\n\nSystem.out.println(&34;);\nSimpleDateFormatformat=newSimpleDateFormat(&34;);\n/**\n*转换要求的格式\n*/\ntry{\n\n/********************************读取文件信息********************************/\ndis=newDataInputStream(socket.getInputStream());\n//文件名和长度\nStringfileName=dis.readUTF();//1、文件名字\nlongfileLength=dis.readLong();//2、长度\nStringtoext=dis.readUTF();//3、扩展名\nStringtaskType=dis.readUTF();//4、文件操作类型\nSystem.out.println(&34;+taskType);\nStringvalueObject=dis.readUTF();//5、替换书签的值\nSystem.out.println(format.format(newDate())+&34;);\nByteArrayOutputStreambos=newByteArrayOutputStream((int)fileLength);\nbyte[]bytes=newbyte[1024];\nintlength=0;\nwhile((length=dis.read(bytes,0,bytes.length))!=-1){\nbos.write(bytes,0,length);\n}\nbyte[]filebytes=bos.toByteArray();\nSystem.out.println(&34;+fileLength+&34;+filebytes.length);\n\n/********************************读取文件信息结束********************************/\n\ndos=newDataOutputStream(socket.getOutputStream());\n\n/********************************校验文件信息********************************/\nbooleanprocess=true;\nif(fileLength>0){\n}else{\ndos.writeUTF(&34;);\ndos.flush();\n\ndos.writeUTF(&34;);\ndos.flush();\nprocess=false;\n}\nif(filebytes.length!=fileLength){\ndos.writeUTF(&34;);\ndos.flush();\n\ndos.writeUTF(&34;);\ndos.flush();\nprocess=false;\n}\n/********************************校验文件信息结束********************************/\n\n/********************************处理文件********************************/\nif(process){\nbyte[]fileBytes=null;\n\nthis.wordUtil.openFile(filebytes,fileName);//打开院文件\n//workbook=workbooks.createWorkbookFromByteArray(filebytes,fileName);\nStringlowerExt=toext.toLowerCase();\nif(&34;.equals(taskType)){\nSystem.out.println(&34;+fileName+&34;+lowerExt);\nfileBytes=this.wordUtil.convertFile(lowerExt);\nSystem.out.println(format.format(newDate())+&34;+toext+&34;);\n}elseif(&34;.equals(taskType)){\nSystem.out.println(&34;+fileName+&34;);\nJSONObjectjsonObject=JSONObject.fromObject(valueObject);\nthis.wordUtil.replaceBookMark(jsonObject);\nfileBytes=this.wordUtil.convertFile(lowerExt);\nSystem.out.println(&34;);\n}elseif(&34;.equals(taskType)){//处理业务数据导出任务数据\n\tSystem.out.println(&34;+valueObject);\n\tServiceUtilserviceUtil=newServiceUtil(this.wordUtil);\n\tJSONObjectjsonObject=JSONObject.fromObject(valueObject);\n\tfileBytes=serviceUtil.exportData2File(jsonObject.getJSONArray(&34;),jsonObject.getInt(&34;));\n\tSystem.out.println(&34;);\n}\n\n\n/********************************处理文件结束********************************/\nif(fileBytes==null){\ndos.writeUTF(&34;);\ndos.flush();\ndos.writeUTF(&34;);\ndos.flush();\nprocess=false;\n}\n\n\n/********************************返回处理过的文件********************************/\nif(process){\ndos.writeUTF(&34;);//文件处理完成,将信息返回到客户端\ndos.flush();\nintfileBytelength=fileBytes.length;//转换后的文件长度\nSystem.out.println(format.format(newDate())+&34;+getFormatFileSize(fileBytelength)+&34;);\ndos.writeLong(fileBytelength);\ndos.flush();\ndos.write(fileBytes,0,fileBytelength);//将文件一起写入到输出流发送\ndos.flush();\nSystem.out.println(format.format(newDate())+&34;);\n}\n/********************************返回处理过的文件完成********************************/\n\n}\n}catch(Exceptione){\nStringerror=e.toString();\nSystem.out.println(&34;+error);\nStackTraceElement[]stackTrace=e.getStackTrace();\nfor(StackTraceElements:stackTrace){\nintlineNumber=s.getLineNumber();\nStringmethodName=s.getMethodName();\nStringclassName=s.getClassName();\nStringfilename=s.getFileName();\nSystem.out.print(&34;+filename+&34;+className+&34;+methodName+&34;+lineNumber);\nSystem.out.println(&34;);\n}\ntry{\ndos.writeUTF(&34;);\ndos.flush();\ndos.writeUTF(&34;+e.toString());\ndos.flush();\n}catch(Exceptionex){\nStringexrror=ex.toString();\nSystem.out.println(&34;+exrror);\n}\n\n}finally{\nSystem.out.println(&34;);\ntry{\nif(wordUtil!=null)wordUtil.close();\nsocket.close();\n}catch(Exceptione){\nStringerror=e.toString();\nSystem.out.println(error);\ne.printStackTrace();\n}\nSystem.out.println(&34;);\n}\n}\n\n\n/**\n*文件传输Clinet端<br>\n*功能说明:\n*@Author空中智囊\n*@Date2016年09月01日\n*@version1.0\n*/\npublicclassSocketClientextendsSocket{\npublicstaticfinalLoggerLOGGER=LoggerFactory.getLogger(SocketClient.class);\n\nprivatestaticfinalStringSERVER_IP=&34;;//word文件组件处理服务IP地址\nprivatestaticfinalintSERVER_PORT=8899;\t//word文件组件处理服务端口\nprivateintsoTimeout=60000;\t//服务链接超时时间60s\nprivateSocketclient=this;\nprivateFileInputStreamfis;\nprivateDataOutputStreamdos;\nprivateDataInputStreamdis;\nprivateFileOutputStreamfos;\n\npublicSocketClient(Stringlistenip,intlistenport)throwsException{\nsuper(listenip,listenport);\nthis.setSoTimeout(this.soTimeout);\nLOGGER.info(&34;+this.client.getLocalPort()+&34;);\n}\n\npublicSocketClient()throwsException{\nsuper(SERVER_IP,SERVER_PORT);\nthis.setSoTimeout(this.soTimeout);\nLOGGER.info(&34;+this.client.getLocalPort()+&34;);\n}\n\npublicSocketClient(Stringlistenip,intlistenport,intsoTimeout)throwsException{\nsuper(listenip,listenport);\nthis.setSoTimeout(soTimeout);\nLOGGER.info(&34;+this.client.getLocalPort()+&34;);\n}\n\n/**\n*处理word文件\n*@paramsrcRealPath模板word文件路径绝对地址\n*@paramdescRealPath处理后的文件存放地址绝对路径\n*@paramtaskType处理文件的类型convertFile/replaceBookMark/exportTask\n*@paramjsonObject传给服务端的数据对象,这个参数可根据服务端需求进行调整\n*@return处理结果\n*/\npublicJSONObjectprocessOffice(StringsrcRealPath,StringdescRealPath,StringtaskType,JSONObjectjsonObject){\nJSONObjectrtnObject=newJSONObject();\nStringcode=&34;;\nStringmessage=&34;;\n\ntry{\nFilefile=newFile(srcRealPath);\nif(!file.exists()||!file.canWrite()){\ncode=&34;;\nmessage=&34;;\nrtnObject.element(&34;,code);\nrtnObject.element(&34;,message);\nJSONObjectvar41=rtnObject;\nreturnvar41;\n}\n\nLOGGER.info(srcRealPath+&34;+descRealPath);\nif(file.exists()&&file.canWrite()){\nStringfilename=file.getName();\nthis.fis=newFileInputStream(file);\nthis.dos=newDataOutputStream(this.client.getOutputStream());\nthis.dos.writeUTF(filename);//文件名字\nthis.dos.flush();\nthis.dos.writeLong(file.length());//文件长度\nthis.dos.flush();\nStringext=descRealPath.substring(descRealPath.lastIndexOf(&34;)+1,descRealPath.length());\nthis.dos.writeUTF(ext);//源文件后缀名字\nthis.dos.flush();\nthis.dos.writeUTF(taskType);//任务类型\nthis.dos.flush();\nif(YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE.equals(taskType)){\nthis.dos.writeUTF(jsonObject.toString());\nthis.dos.flush();\n}\n\nLOGGER.info(&34;+srcRealPath+&34;);\nbyte[]bytes=newbyte[1024];\nlongprogress=0L;\n\nintlength;\nwhile((length=this.fis.read(bytes,0,bytes.length))!=-1){\nthis.dos.write(bytes,0,length);\nthis.dos.flush();\nprogress+=(long)length;\nLOGGER.info(&34;+100L*progress/file.length()+&34;);\n}\n\nLOGGER.info(&34;+file.length()/1048576L+&34;);\nthis.client.shutdownOutput();\nLOGGER.info(&34;+ext+&34;);\nInputStreaminputStream=this.client.getInputStream();\nthis.dis=newDataInputStream(inputStream);\nStringresult=this.dis.readUTF();\nif(&34;.equals(result)){\nStringreason=this.dis.readUTF();\nLOGGER.info(reason);\ncode=&34;;\nmessage=reason;\n}elseif(&34;.equals(result)){\nlongl=this.dis.readLong();\nLOGGER.info(&34;+ext+&34;+l/1048576L+&34;);\nLOGGER.info(&34;+ext+&34;);\nFilenewFile=newFile(descRealPath);\nif(newFile.exists()){\nnewFile.delete();\n}\n\nthis.fos=newFileOutputStream(newFile);\nprogress=0L;\nbytes=newbyte[1048576];\n\nwhile((length=this.dis.read(bytes,0,bytes.length))!=-1){\nthis.fos.write(bytes,0,length);\nthis.fos.flush();\n}\n\nLOGGER.info(&34;+ext+&34;);\nthis.dis.close();\n}else{\ncode=&34;;\nmessage=&34;;\n}\n}else{\ncode=&34;;\nmessage=&34;+srcRealPath;\n}\n}catch(Exceptione){\ncode=&34;;\nmessage=&34;+e.toString();\nLOGGER.error(&34;,e);\n\n}finally{\nif(this.fis!=null){\ntry{\nthis.fis.close();\n}catch(Exceptionvar38){\n;\n}\n}\n\nif(this.fos!=null){\ntry{\nthis.fos.close();\n}catch(Exceptionvar37){\n;\n}\n}\n\ntry{\nthis.client.close();\n}catch(Exceptionvar36){\n;\n}\n\n}\n\nrtnObject.element(&34;,code);\nrtnObject.element(&34;,message);\nreturnrtnObject;\n}\n\npublicstaticvoidmain(String[]args){\ntry{\nSocketClientsocketClient=newSocketClient();\n//将文档转换成pdf文件\nsocketClient.processOffice(&34;,&34;,YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,null);\n\n//将文档转换成pdf文件\nJSONObjectdataObject=newJSONObject();\ndataObject.element(&34;,&34;);\nsocketClient.processOffice(&34;,&34;,YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject);\n}catch(Exceptione){\nLOGGER.error(&34;,e);\n\n}\n\n}\n}\n
5、启动word文件处理组件服务端
组件启动脚本
nohup./ofdServer.sh&
6、调用服务端对word文件处理
publicstaticvoidmain(String[]args){\ntry{\nSocketClientsocketClient=newSocketClient();\n//将文档转换成pdf文件\nsocketClient.processOffice(&34;,&34;,YOZOOfficeUtil.PROCESS_TYPE_CONVERTFILE,null);\n\n//替换模板中的书签值,word中插入书签自行百度\nJSONObjectdataObject=newJSONObject();\ndataObject.element(&34;,&34;);\nsocketClient.processOffice(&34;,&34;,YOZOOfficeUtil.PROCESS_TYPE_REPLACEBOOKMARK,dataObject);\n}catch(Exceptione){\nLOGGER.error(&34;,e);\n\n}\n\n}
7、资源下载
word文件处理组件服务端(开箱即用):
链接:https://pan.baidu.com/s/1_ZgjoX_nuv3a7_SKkJ_D7w提取码:hn2r
服务端资源内容
将文件复制到linux服务器,并解压,执行./ofdServer.sh,输出:服务端启动,监听端口为:8899,即运行成功
word文件处理组件客户端(开箱即用processOffice):
链接:https://pan.baidu.com/s/1mtabGY87RuAGGkwKrBIvfQ提取码:mqxf
客户端资源文件内容
将源文件复制到项目指定包名,运行SocketClient.java中的main方法,可查看运行结果。
最重要的一点:服务器要安装永中OFFICE客户端
关于小说网站源码分享txt下载,的介绍到此结束,希望对大家有所帮助。
