`
alang
  • 浏览: 136925 次
  • 性别: Icon_minigender_1
  • 来自: 地球
文章分类
社区版块
存档分类
最新评论

Java 读写 Word doc 文件的方法(POI代码示例)

阅读更多

都说懒人推动社会进步。
我的出发点是,想做个自动生成工作日志的工具。思路是读取google日历中我每日的工作记录,填充生成公司规定格式的word文件,然后再调用邮件函数发送邮件到领导的信箱里面去。

这其中一环就是Java读写doc文件。网上找了不少资料,初步选用了Apache POI,可以读写整个Office系列的各种文档,并且不依赖Office的任何库,纯JAVA代码。直接读写doc的二进制文件,我最喜欢了。相对的有个Java com 桥的方法,用Java来操作com对象,后台运行隐藏的word程序,甚为不喜。

POI API Documentation 的文档写的太差了,没有例子,Apache 的 POI 项目主页也没有代码,直接说想看代码,请去svn下载代码,阅读他的单元测试用例,TestCase。
最后磕磕绊绊写了下面的一个测试的例子。基本可以看清这个POI的hwpf库,读写word doc 文件的方法。代码、注释都是原创,高手飘过去就行了。
import java.io.*;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Section;

public class Main {

  public static void main(String[] args) {
    try {
        //新建 HWPFDocument 对象,读入doc文件
        HWPFDocument doc = new HWPFDocument(new FileInputStream("c:\\test.doc"));
        //得到整个doc文档的Range,可以理解为文档对象
        Range r = doc.getRange();

        System.out.println("Example you supplied:");
        System.out.println("---------------------");

        String text = new String("");
        //得到整个文档里面的所有纯文字,包含回车换行。一段是一行
        text = r.text();
        //System.out.println(text);

        //得到整个文档的分节数。一般只有一节,排版很漂亮的word文档一般分为多节
        System.out.println("numSections: " + r.numSections());
        //得到倒数第一节的Section对象
        Section section = r.getSection(r.numSections() - 1);
        //得到该节里面的段落数
        System.out.println(section.numParagraphs());
        System.out.println("numParagraphs: " + section.numParagraphs());

        String searchText = "${Ryan}";
        String replacementText = "Apache Software Foundation";

        //循环得到每一段落的文字。这个跟Range.text()是不同的。
        for (int np = 0; np < section.numParagraphs(); np++) {
          Paragraph para = section.getParagraph(np);
          //得到该段落的文字
          text = para.text();
          //System.out.println(Integer.toString(np) + ":" + text);
          int offset = text.indexOf(searchText);
          if (offset >= 0) {
              System.out.println(Integer.toString(np) + ":" + para.text());
              //如果找到了,就进行文字的替换。replaceText只能针对段落
              para.replaceText(searchText, replacementText);
              break;
            }
        }
        
        //写入到新的doc文件
        OutputStream outdoc = new FileOutputStream("c:\\test2.doc");
        doc.write(outdoc);
        
        outdoc.flush();
        outdoc.close();

    } catch (Throwable t) {
        t.printStackTrace();
      }
    }
}
 

编译运行很顺利,但是悲剧的是,最后调用write方法写入的doc文件打不开了,报格式错误,用Notepad++打开这个doc文件对比原来的,发现文字确实替换成功了,但是文件的尾巴上少了一部分内容,二进制和assic混合的,格式看来是被破坏了。

忙活了半天,最后发现杯具了。应该是兼容性的问题。改天去他们的邮件列表问问。或者路过的看官知道的,指导一下我。

我在写这个文章的时候,又想到一个绝妙的注意。何必绕道这么远呢?
实施工作日志内容来源于google calendar,如果能够利用google app doc 自己本身的宏:google script,的功能,读取日历数据,形成doc文件,调用gmail发送到指定的信箱,不是齐活了吗?费不着用Java了。

其实在决定用java之前,想过用VB,这个做肯定不存在问题,VB操作com对象本身是轻车熟路,顶多再找个发邮件的库,实在不行了没人手工发送。方法还是很多的。

科技以懒人为本。

2
4
分享到:
评论
3 楼 aasddsasda 2014-01-20  
感谢博主分享,正在用poi做一个模板替换的功能,如果直接用range的replaceText替换中文会出错,分段落替换就不会有问题了
2 楼 sendreams 2014-01-19  
poi项目经过这么多年的发展,感觉还不是很给力,hwpf和xwpf分别处理doc和docx文档,这对开发者来说需要使用两套api。
1 楼 lord_is_layuping 2013-07-26  
poi真不让人省心

相关推荐

    java POI完整示例,POI将word转HTML,数据库倒出数据到Excel等

    "POI将word转HTML.zip"和"demo1.zip"可能包含具体的Java代码示例,用于演示如何实现Word到HTML的转换以及数据库数据导出到Excel的操作。解压后,开发者可以查看源代码并根据自己的需求进行调整和应用。 总结,Java...

    JAVA读取WORD_EXCEL_POWERPOINT_PDF文件的方法(poi)

    POI 库是一个开放源代码的 Java 库,提供了对 Microsoft Office 文件格式的读写能力。 读取 WORD 文件 在读取 WORD 文件时,需要使用 `org.apache.poi.hwpf` 包下的 `WordExtractor` 类来提取文档内容。下面是一个...

    poi读写word模板/JAVA生成word包

    关于压缩包中的"poi读写word模板包",可能包含了一些示例代码或模板文件,帮助开发者理解如何使用Apache POI进行Word模板的读写。解压后,你可以查看这些文件来学习具体实现,包括如何查找和替换模板中的特定字符串...

    Java读写word文件

    Java读写Word文件是Java开发中的一个重要技能,尤其在处理文档自动化、数据报告生成等场景中。Java2Word库提供了一种有效的方式,使我们能够方便地在Java应用程序中创建和修改Microsoft Word文档,而避免了使用...

    Java利用poi对word插入文字图片

    在Java编程领域,Apache POI库是一个非常实用的工具,它允许开发者读写Microsoft Office格式的文件,如Word、Excel和PowerPoint。本项目“Java利用poi对word插入文字图片”是一个具体的示例,旨在教给你如何使用...

    java运用poi填充word数据并将多个word合并为一个

    在Java编程环境中,Apache POI库是一个非常实用的工具,它允许开发者读写Microsoft Office格式的文件,包括Word文档。本篇文章将详细讲解如何利用Apache POI库在Java中实现Word文档的数据填充以及多文件合并。 1. *...

    javapoi.rar_JAVAPOI_Java导出word_POI_POI WORD_java POI

    Java POI 是一个开源的Java库,用于读写Microsoft Office格式的文件,包括Excel和Word。这个"javapoi.rar"压缩包包含了使用JAVAPOI进行Excel和Word操作的示例代码,帮助开发者将数据库数据导出到这些文档格式中。 ...

    java 利用POI读取Word文件中的内容

    在Java编程语言中,Apache POI是一个非常流行的库,它允许开发者处理Microsoft Office格式的文件,包括Word(.doc和.docx)文档。本篇将详细介绍如何利用Apache POI库来读取Word文件中的内容。 首先,理解Apache ...

    java使用poi根据word模板生成word(图片及文字).zip

    在Java编程领域,Apache POI库是一个非常实用的工具,它允许开发者读写Microsoft Office格式的文件,包括Word(.doc/.docx)、Excel(.xls/.xlsx)和PowerPoint(.ppt/.pptx)。本示例聚焦于使用POI库根据Word模板...

    POI导出Word 页眉 页脚 标题设置

    Apache POI 提供了一套API,允许Java开发者读写Microsoft Office格式的文件。它支持HSSF(Horizontally Stored Spreadsheet Format)用于Excel,XSSF(XML Spreadsheet Format)也支持Excel,而HWPF(Horizontally ...

    Java Poi流 根据Word模板插入相应的文本、表格和图片,生成新的Word报告

    Java POI库是Apache软件基金会开发的一个开源项目,专门用于读写Microsoft Office格式的文件,如Word(.doc和.docx)、Excel(.xls和.xlsx)等。在本主题中,我们将深入探讨如何使用Java POI流处理Word模板,插入...

    poi导入word和图片

    Apache POI 是一个用于读写 Microsoft Office 格式文件(如 .doc、.xls 和 .ppt)的 Java API。本文档将详细介绍如何使用 POI 库来读取 Word 文档(包括 .doc 和 .docx 格式)中的文本内容以及提取其中的图片。 ###...

    android使用POI操作word docx文档

    下面是一个简单的代码示例,展示了如何根据标识替换docx文档中的内容: ```java FileInputStream fis = new FileInputStream("input.docx"); XWPFDocument document = new XWPFDocument(fis); String ...

    poi读写office文件样例程序

    这个"poi读写office文件样例程序"提供了一系列的源代码示例,帮助开发者理解和实现对这些文件的读取和写入操作。下面将详细介绍其中涉及的关键知识点。 1. **Apache POI 框架** Apache POI 是Apache软件基金会的一...

    java工程导出word文件的实例

    `poidemo.rar`可能包含了一个使用Apache POI处理Word文档的示例代码,你可以解压后查看。 `--Java导出WordDemo--(4).rar`和`Java导出Doc--97--2003.txt`可能提供了不同版本Word文档(97-2003格式)的导出示例。早期...

    poi word 打印

    "poiDemo"可能包含基本的读写操作,而"poi2word"可能进一步展示了如何将数据从其他格式(如CSV或数据库)导入到Word文档中,或者将Word文档的内容导出到其他格式。 6. **最佳实践** - 使用try-with-resources语句...

    java多个word文件合并.zip

    在给定的压缩包"java多个word文件合并.zip"中,你应该能找到示例代码和相关资源,帮助你理解和实现这两个方法。根据项目需求,你可以选择适合的方法进行集成。记得在实际操作中,要考虑到错误处理和资源释放,以确保...

    poi完美word转html

    2. 只支持DOC不支持DOCX:代码示例仅适用于旧版的Word文档格式(.doc),对于新版的Word文档格式(.docx),需要使用不同的方法或更高版本的POI库。 六、扩展阅读与资源: 为了更深入地理解和应用Apache POI进行...

    make-word-by-java.rar_JAVA读写WORD_Java Word_Word by Word_java 生成w

    这个“make-word-by-java.rar”压缩包提供的示例代码(如“make word by java.docx”)应该会展示这些概念的实际应用,帮助开发者更好地理解和实践。记得在实际开发中,确保对Apache POI的使用进行充分的测试,以...

    java2word,java操作word

    Java2Word是基于Apache POI库的,Apache POI是一个开源项目,用于读写Microsoft Office格式的文件,包括Word(.doc)文档。通过Java2Word,开发者可以利用Java代码来创建、填充模板、格式化文本、插入图片、表格等...

Global site tag (gtag.js) - Google Analytics