zoukankan      html  css  js  c++  java
  • [原创]java调用PageOffice生成word

    一、在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jacob、poi、java2word、itext。jacob要求服务器必须是windows操作系统,服务器上还必须安装office软件,果断放弃!poi需要针对doc和docx两种格式写不同的代码,增加了程序的复杂度。java2doc 是对 jacob 的封装,同样放弃!最后选定了用itext来导出word,网上一些资料说itext导出word功能太简单,通过试用之后,封装工具类,使用起来确实挺方便,但是导出的word文档在细节方面很难达到要求,比如:字体、行距、字体间距、首行缩进等。

    二、由于itext导出的word有各种各样的小问题,只能另找其他的解决方案,经过一个朋友推荐,可用PageOffice组件来导出word,其效果能与用户需求的word文档达到完美的一致,而且编程接口简单,调用很方便。总的来说就是制作模板(用PO_开头的书签作为数据占位符),然后编程调用PageOffice接口用真实数据替换模板中的占位符,最后生成word。下面看例子:

    1. 制作模板

      打开word模板插入书签:PO_Dept、PO_Name、PO_Cause、PO_Num、PO_Date,如下图所示

      

    2. 编写代码

      调用PageOffice接口,给word模板填充数据生成word文档:

      

     1     // 声明变量存储从数据库中读取的数据
     2     String  docName = "", docDept = "", docCause = "", docNum = "", docDate = "";
     3     // 数据库数据读取操作(不同的数据库用不同的代码)
     4     ResultSet rs = stmt.executeQuery("select * from leaveRecord where ID = " + id);
     5     if (rs.next()) {
     6         docName = rs.getString("Name");
     7         docDept = rs.getString("Dept");
     8         docCause = rs.getString("Cause");
     9         docNum = rs.getString("Num");
    10         docDate = rs.getString("SubmitTime");
    11     }
    12     rs.close();
    13     //创建PageOffice的WordDocument对象,操作Word文件
    14     WordDocument doc = new WordDocument();
    15     doc.openDataRegion("PO_name").setValue(docName);
    16     doc.openDataRegion("PO_dept").setValue(docDept);
    17     doc.openDataRegion("PO_cause").setValue(docCause);
    18     doc.openDataRegion("PO_num").setValue(docNum);
    19     doc.openDataRegion("PO_date").setValue(docDate);
    20     //创建PageOfficeCtrl对象打开文件
    21     PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
    22     poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必须
    23     //获取数据对象
    24     poCtrl1.setWriter(doc);
    25     // 打开文档
    26     poCtrl1.webOpen("doc/template.doc", OpenModeType.docReadOnly, "Tom");

    3. 生成效果图

      

      

    三、 源码下载

      https://download.csdn.net/download/zi_wu_xian/10399345

  • 相关阅读:
    如何使得事务使用同一个连接对象Connection呢?
    快速使用上咱的ideal的快捷键小技巧
    委托模式的理解:
    克隆、深拷贝与浅拷贝区别
    mysql存储过程与事务
    sql异常处理以及sql异常处理优先级
    Mysql 遇到神奇的“本次本客户端效现象”,数据库并未被改变 + 神奇“卡顿现象”
    网络传输时既有管道流(PipedInputStream 与 PipedOutStream)又有序列化对象、反序列化对象(ObjectOutputStream与 ObjectInputStream),还有在集合中、流中都有的身影的Properties究竟是何方神物?我们该怎么选择呢?
    数据库设计的三大范式
    实体类(VO,DO,DTO,PO)的划分
  • 原文地址:https://www.cnblogs.com/ziwuxian/p/9006733.html
Copyright © 2011-2022 走看看