当前位置:首页 > 数据库

服务端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("服务器租用

分享到:

滇ICP备2023006006号-16