`
liudaoru
  • 浏览: 1579084 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用java生成word文档[z]

    博客分类:
  • java
阅读更多
From: http://www.xrss.cn/Info/15191.Html
用java生成word文档
java
作者 javasky @ 2006-06-10 14:22:04
这几日, 公司有个项目, 要用java生成word文档, 在网上找来找去也没有找到好的生成word文档的库, 找到apache的POI可以使用, 但是所有的release版中也没有支持word的class. 只能从svn上下载源代码编译. 
后来发现java支持rtf格式的文档, word也支持, 于是乎便使用此产生word文档了. 呵呵.. 
java支持的rtf文档功能不是很强大, 我们可以借助于一些开源的库, 比如: itext就可以很好的支持. itext上有很多例子, 有兴趣的可以上去看一下, 这里就不摘录了. 
但是itext比较大要1.4M, 不是很喜欢. 在sf上找来找去, 发现一个更小的库, 尽管功能不是很强大, 基本的功能都有, 他就是srw(Simple RTF Writer目前它的版本是0.6,好久都没有人维护了). 
srw内置了很多例子,  例如: 我们要写一个简单的rtf, 我们只需要这么写:
public class TestSimpleRtf { 
     
    private static final String FILE_NAME = "out_testsimplertf.rtf"; 
     
    public static void main(String[] args) { 
        try { 
            // RTF Dokument generieren (in Querformat) 
            RTFDocument doc = new RTFDocument(PageSize.DIN_A4_QUER); 
            // Anzeige-Zoom und Ansicht definieren 
            doc.setViewscale(RTFDocument.VIEWSCALE_FULLPAGE);    // Anzeige-Zoom auf "komplette Seite" einstellen 
            doc.setViewkind(RTFDocument.VIEWKIND_PAGELAYOUT);    // ViewMode auf Seitenlayout stellen 
             
            Paragraph absatz = new Paragraph(18, 0, 16, Font.ARIAL, new TextPart("Simple RTF Writer Testdokument")); 
            absatz.setAlignment(Paragraph.ALIGN_CENTER); 
            doc.addParagraph(absatz); 
            File savefile = new File(FILE_NAME); 
            doc.save(savefile); 
            System.out.println("Neues RTF Dokument erstellt: " + savefile.getAbsolutePath()); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        }             
    } 
}
用法很简单, 但是功能很少, 比如没有table的功能, 不能设置打印方向等问题. 不过这个基本上就够用了. 
后来, 我们的项目要求横向打印, 这可难坏了. 没办法, 自己查找word的rtf格式库, 拓展横向打印功能, 目前已经完成...
import com.itseasy.rtf.RTFDocument; 
import com.itseasy.rtf.text.PageSize; 

public class MyRTFDocument extends RTFDocument { 
    public static final int ORIENTATION_PORTRAIT = 0; 
    public static final int ORIENTATION_LANDSCAPE = 1; 
    private int orientation; 
     
    /** 
     *  
     */ 
    public MyRTFDocument() { 
        super(); 
    } 
    /** 
     * @param arg0 
     */ 
    public MyRTFDocument(PageSize arg0) { 
        super(arg0); 
    } 
    /* (non-Javadoc) 
     * @see com.itseasy.rtf.RTFDocument#getDocumentAsString() 
     */ 
    protected String getDocumentAsString() { 
        StringBuffer sb = new StringBuffer(super.getDocumentAsString()); 
        int pos = -1; 
        if (ORIENTATION_LANDSCAPE == orientation) { 
            pos = sb.indexOf("paperw"); 
            if (pos > 0) { 
                sb.insert(pos, "lndscpsxn"); 
            } 
        } 
        pos = 0; 
        while((pos = sb.indexOf("pardplain", pos)) > 0){ 
            pos = sb.indexOf("{", pos); 
            sb.insert(pos, "dbchaf2"); 
        } 
        return sb.toString(); 
    } 
    /** 
     * @return Returns the orientation. 
     */ 
    public int getOrientation() { 
        return orientation; 
    } 
    /** 
     * @param orientation The orientation to set. 
     */ 
    public void setOrientation(int orientation) { 
        this.orientation = orientation; 
    } 
     
} 
在最近的一个项目中需要将一段字符类型的文本存为word,html并要将word的内容保存在数据库中,于是就有了如下的一个工具类,希望能对碰到这样需求的朋友提供点帮助。
       匆匆忙忙的就copy上来了,没有做一些删减,有一些多余的东西,有兴趣的朋友可以自行略去。我的注释相对比较清楚,可以按照自己的需求进行组合。
      在操作word的地方使用了jacob(jacob_1.9),这个工具网上很容易找到,将jacob.dll放置系统Path中,直接放在system32下也可以,jacob.jar放置在classPath中。


代码如下:WordBridge.java

/**
 * WordBridge.java
 */
package com.kela.util; 
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import com.kela.db.PoolingDataSource;

/**
 * 说明: 对word的操作 
 *
 * @author   kela.kf@gmail.com
 */
public class WordBridge {
 
   Log log = LogFactory.getLog("WordBridgt");
 
   private ActiveXComponent MsWordApp = null; 
   private Dispatch document = null; 
    
    /**
     * 打开word
     * @param makeVisible, true显示word, false不显示word
     */
    public void openWord(boolean makeVisible) {
       if (MsWordApp == null) {
         MsWordApp = new ActiveXComponent("Word.Application");
       }
  
       Dispatch.put(MsWordApp, "Visible", new Variant(makeVisible));
    }

    /**
     * 创建新的文档
     *
     */
    public void createNewDocument() {
       Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch();
       document = Dispatch.call(documents, "Add").toDispatch();
    }

    /**
     * 关闭文档 
     */
    public void closeDocument() {
      // 0 = wdDoNotSaveChanges
      // -1 = wdSaveChanges
      // -2 = wdPromptToSaveChanges
      Dispatch.call(document, "Close", new Variant(0));
      document = null;
    }

    /**
     * 关闭word
     *
     */
    public void closeWord() {
       Dispatch.call(MsWordApp, "Quit");
       MsWordApp = null;
       document = null;
    } 
 
    /**
     * 插入文本
     * @param textToInsert 文本内容
     */
    public void insertText(String textToInsert) {
       Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch();
       Dispatch.put(selection, "Text", textToInsert);
    }

    /**
     * 保存文件
     * @param filename
     */
    public void saveFileAs(String filename) {
      Dispatch.call(document, "SaveAs", filename);
    }

    /**
     * 将word转换成html
     * @param htmlFilePath
     */
    public void wordToHtml(String htmlFilePath) {
         Dispatch.invoke(document,"SaveAs", Dispatch.Method, new Object[]{htmlFilePath,new Variant(8)}, new int[1]);
     }

    /**
     * 保存word的同时,保存一个html
     * @param text 需要保存的内容
     * @param wordFilePath word的路径
     * @param htmlFilePath html的路径
     * @throws LTOAException 
     */
    public void wordAsDbOrToHtml(String text, String wordFilePath, String htmlFilePath) throws LTOAException {
  
      try {
         openWord(false);
         createNewDocument();
         insertText(text);
         saveFileAs(wordFilePath);
         wordToHtml(htmlFilePath);
     } catch (Exception ex) {
         log.error("错误 - 对word的操作发生错误");
         log.error("原因 - " + ex.getMessage());
         throw new LTOAException(LTOAException.ERR_UNKNOWN, "对word的操作发生错误("
                    + this.getClass().getName() + ".wordAsDbOrToHtml())", ex);
     } finally {
         closeDocument();
         closeWord();
     }
  
   }

   /**
    * 将word保存至数据库
    * @param wordFilePath
    * @param RecordID
    * @throws LTOAException
    */
    public void wordAsDatabase(String wordFilePath, String RecordID) throws LTOAException {

       Connection conn = null;
       PreparedStatement pstmt = null;
       PoolingDataSource pool = null;
        
       File file = null;
     
       String sql = "";
       try {
           sql = " UPDATE Document_File SET FileBody = ? WHERE RecordID = ? ";
            
           pool = new PoolingDataSource();
           conn = pool.getConnection();
         
           file = new File(wordFilePath);
           InputStream is = new FileInputStream(file);
           byte[] blobByte = new byte[is.available()];
           is.read(blobByte);
           is.close();

          pstmt = conn.prepareStatement(sql);
          pstmt.setBinaryStream(1,(new ByteArrayInputStream(blobByte)), blobByte.length);
          pstmt.setString(2, RecordID); 
          pstmt.executeUpdate();
      
        } catch (Exception ex) {
            log.error("错误 - 表 Document_File 更新数据发生意外错误");
            log.error("原因 - " + ex.getMessage());
            throw new LTOAException(LTOAException.ERR_UNKNOWN,
                   "表Document_File插入数据发生意外错误("
                    + this.getClass().getName() + ".wordAsDatabase())", ex);
         } finally {
             pool.closePrepStmt(pstmt);
             pool.closeConnection(conn);
        }
    }
 
   /**
    * 得到一个唯一的编号
    * @return 编号
    */
   public String getRecordID() {
  
     String sRecordID = "";
  
     java.util.Date dt=new java.util.Date();
        long lg=dt.getTime();
        Long ld=new Long(lg);
        sRecordID =ld.toString();
        
        return sRecordID;
    } 


该文章转载自网络大本营:http://www.xrss.cn/Info/15191.Html
分享到:
评论
2 楼 liudaoru 2010-06-08  
softor 写道
能提供SRW下载不?

dodo@lovehang.com

我也是好久之前找的,自己改改吧:)
1 楼 softor 2010-06-08  
能提供SRW下载不?

dodo@lovehang.com

相关推荐

    Jacob操作word 文档的方法集!(含创建目录),使用的Jacob版本是1.5

    在这个“Jacob操作word文档的方法集”中,我们将探讨如何使用Jacob 1.5版本来创建和操作Word文档,特别是创建目录。 首先,为了使用Jacob,你需要在你的项目中添加Jacob的jar文件。这通常涉及到将库添加到项目的类...

    java-poi教你如何生成office文档.7z

    在这个“java-poi教你如何生成office文档.7z”压缩包中,很可能包含了一系列的教程和示例代码,帮助开发者掌握如何使用Java POI库生成Office文档。 1. **Java POI基本概念** - **HSSF (Horrible Spreadsheet ...

    java html 转word word 转pdf

    总结起来,Java HTML 转 Word 和 Word 转 PDF 涉及到的技术包括HTML解析、Word文档处理、PDF生成,以及使用相关的Java库如Aspose.Words和Aspose.PDF。在实际开发中,需要熟悉这些库的API,并理解不同文档格式之间的...

    word模板替换工具以及使用说明.7z

    标签“java world填充”可能表明这个工具是用Java编程语言开发的,并且具备填充Word文档的功能。Java作为一种跨平台的编程语言,适合开发这样的桌面应用,其丰富的库和强大的处理能力使得处理文本文件变得简单。 ...

    word转pdf最好用的java代码实例,支持水印设置。

    为了将Word文档转换为PDF,我们可以结合使用Apache POI与一个PDF生成库,如iText或 Flying Saucer。在这个特定的实例中,我们可能使用的是Flying Saucer,因为它可以直接将HTML渲染为PDF,而Word文档可以被解析为...

    doxygen生成样例.7z

    【标题】"doxygen生成样例.7z"是一个压缩包文件,其中包含了使用doxygen工具生成的示例文档。这个文件旨在展示如何利用doxygen为C语言代码自动生成高质量的文档,包括HTML、RTF(Rich Text Format)和LaTeX格式。...

    poi-demo.7z

    在这个例子中,我们可能会看到如何使用POI将后台数据动态插入到Word模板中,然后将生成的新Word文档转换为PDF格式。 首先,我们需要理解Apache POI的工作原理。POI库主要处理两种类型的文件:HSSF(Horizontally ...

    Java代码手动生成ppt.txt

    ### Java生成PPT的核心知识点解析 #### 一、概述 在现代办公环境中,演示文档(如PPT)的使用非常广泛。本篇文章将基于提供的Java代码片段,详细解析如何使用Java来手动生成PPT文档,并重点介绍代码中的关键类与...

    《JAVA语言程序设计》期末考试试题及答案(word文档良心出品).doc

    - Java程序开发流程通常包括编写源代码(`.java`文件),编译源代码生成字节码(`.class`文件),最后通过Java虚拟机(JVM)解释运行字节码。 **2. 在 Java 的基本数据类型中,`char` 型采用 Unicode 编码方案,每个 ...

    java_lib.7z

    Java_lib.7z 是一个包含了一系列Java开发中常用的库文件的压缩包,主要针对J2EE平台和SSHE(Spring、Struts、Hibernate、Ejb)项目开发。这些jar包是Maven构建系统所必需的依赖,它们为开发者提供了丰富的功能和API...

    aspose-words-16.4.0-jdk16-1.0.0.7z

    总的来说,"aspose-words-16.4.0-jdk16-1.0.0.7z"这个压缩包包含的Aspose.Words for Java库,为Java开发者提供了一个强大的工具,能够方便地在没有安装Office的情况下处理Word文档,特别是将Word文档转换为PDF格式,...

    操作word 的动态链接库 jacob-1.18-x64.dll 64位动态库.7z

    4. **自动化任务**:对于需要批量处理Word文档的场景,如批量修改模板、生成报告等,Jacob可以实现自动化处理,显著提高工作效率。 5. **宏执行**:Jacob可以执行Word中的宏,这对于运行预先定义好的复杂操作序列...

    Java词频统计算法(使用单词树)

    ### Java词频统计算法(使用单词树) #### 背景与问题 在文本处理领域,词频统计是一项常见的任务。例如,在自然语言处理、搜索引擎优化、文档分类等应用场景中,了解某个词语出现的频率至关重要。传统的词频统计...

    自编的android 贪吃蛇word文档

    2. **游戏状态变量**:在`TanChiShe`类中,定义了一系列变量来存储游戏状态,如蛇的长度`length`,坐标`x`和`y`,食物坐标`objectX`和`objectY`,蛇的移动方向`z`,以及游戏速度`time`。`Thread she`用于表示游戏主...

    Word Operation

    此外,OpenOffice API和Apache POI项目为Java开发者提供了处理Word文档的工具,它们允许开发者在不依赖于Microsoft Office的情况下读写Word文件。这些库不仅支持基本的文本操作,还涵盖了复杂的表格、图表和宏等功能...

    fr.opensagres.poi.xwpf.converter.7z

    总之,"fr.opensagres.poi.xwpf.converter"系列库是Apache POI生态中的重要组成部分,它们使得Java开发者能够方便地处理Word文档,并将其转换为PDF格式,这在需要跨平台、保证文档格式一致性的场景下尤其有用。...

    spire.3.9.7z

    2. **Word处理**:这个库允许开发人员创建新的Word文档,打开并编辑现有文件,以及将Word文档转换为其他格式,如PDF、HTML或文本。它提供了丰富的API,可以设置页面布局、字体样式、段落格式,以及添加图片、表格和...

    org.openxmlformats.schemas.wordprocessingml.x2006

    标题中的"org.openxmlformats.schemas.wordprocessingml.x2006"是一个Java包名,它与Microsoft Office Open XML(OOXML)标准有关,特别是针对Word文档处理的XML模式定义。这个包通常包含用于解析和生成符合...

    包含很多有用jmeter java的JAR包

    4. **xbean.jar**:可能是一个辅助库,与XMLBeans相关,用于处理XML Schema和Java类的生成。 5. **poi-ooxml-4.0.1.jar**:POI的OOXML支持部分,处理XLSX、DOCX等新格式。 6. **poi-scratchpad-4.0.1.jar**:包含...

    java eclipse

    2. **代码格式保留**:从Eclipse复制的代码粘贴到Word或WordPad中,代码格式(字体、缩进、颜色)得以保留,这对于文档编写很有帮助。 **外挂篇** Eclipse的一大特色是可以安装各种插件以扩展其功能。例如: 1. *...

Global site tag (gtag.js) - Google Analytics