服务端Word文件模板书签替换、转换文件类型的另类实现
市面上处理文字的服务的办公软件有很多,包括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文件的代码片段,详细代码请在文后下载源码查阅
处理word文件的代码片段,详细代码请在文后下载源码查阅 /** * 将word文件转换为对应格式的文件的字节数组 * @param type 将word文件转换成的文件格式 pdf、html\ofd\txt\xml * @return * @throws IOException */ public byte[] 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; }else if("ofd".equals(type.toLowerCase())) { typePdf= FileConstants.TYPE_OFD; // 这个是不成功的云服务器,应该是版本太低 }else if("txt".equals(type.toLowerCase())) { typePdf = FileConstants.TYPE_TXT; }else if("xml".equals(type.toLowerCase())) { typePdf = FileConstants.FILETYPE_XML; }else if("doc".equals(type.toLowerCase())||"xls".equals(type.toLowerCase())||"ppt".equals(type.toLowerCase())) { typePdf = FileConstants.TYPE_MS; }else if("docx".equals(type.toLowerCase())||"xlsx".equals(type.toLowerCase())||"pptx".equals(type.toLowerCase())) { typePdf = FileConstants.TYPE_MS_EX; } return this.workbooks.getWorkbookAsByteArray(workbook, typePdf); } /** * 替换word模板中的书签 * @param jsonObject 数据内容 { “bookmarkname”:”test“} */ public void replaceBookMark(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“} */ public byte[] exportData2File(JSONArray taskArray,int allrow) { }4、(重点)解决word文件处理组件与我们的项目文件交互问题
本人通过SOCKET即时通讯服务解决数据交互问题
/** * 文件传输Server端<br> * 功能说明: * @Author 空中智囊 * @Date 2016年09月01日 * @version 1.0 */ public class SocketService extends ServerSocket { private static final int SERVER_PORT = 8899; // 服务端端口 private WordUtil wordUtil=null; public SocketService() throws Exception { super(SERVER_PORT); this.wordUtil=new WordUtil(); } /** * 使用线程处理每个客户端传输的文件 * @throws Exception */ public void load() 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 */ public static void main(String[] args) { try { SocketService server = new SocketService(); // 启动服务端 server.load(); } catch (Exception e) { e.printStackTrace(); } } } /** * 处理客户端传输过来的文件线程类 */ public class Task implements Runnable { @Override public void run() { System.out.println("===客户端连接成功====="); System.out.println("源码库