日期:2014-05-20  浏览次数:20876 次

用Java往word的域中插入数据
现在有一个公文的页面,点提交时,要往一个word模板的对应域中插入页面上的相关信息,谁做过这方面的工作,poi能实现吗?没找到相应的程序,如果poi不能,请问用什么可以实现

还有一个问题,先不考虑往域中插入,就随便往word中插入数据都有问题,下面是程序
Java code

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class DOCWriter {   
  
    public static String fileToWrite = "e:\\workspace\\TestPoi2\\test.doc";   
  
    public static void main(String[] args) throws Exception{   
        String content = "测试";   
           
        byte b[] = content.getBytes();   
  
        ByteArrayInputStream bais = new ByteArrayInputStream(b);   
  
        POIFSFileSystem fs = new POIFSFileSystem();   
           
        FileOutputStream ostream = new FileOutputStream(fileToWrite);   
  
        fs.writeFilesystem(ostream);   
  
        bais.close();   
           
        ostream.close();   
  
    }   
}



还有一种方法实现同样功能
Java code

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;

import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class DOCWriter {   
    
  
    public static void main(String[] args) throws Exception{   
        byte[] a=new String("看见了!").getBytes();
        FileOutputStream fos;
           ByteArrayInputStream bs = new ByteArrayInputStream(a);
           POIFSFileSystem fs = new POIFSFileSystem();
          
           DirectoryEntry directory = fs.getRoot();
           DocumentEntry de = directory.createDocument("WordDocument", bs);
           //以上两句代码不能省略,否则输出的是乱码
           fos = new FileOutputStream("e:\\text.doc"); 
           fs.writeFilesystem(fos);
           bs.close();
           fos.flush();
           fos.close();

  
    }   
}


两种方法都试过了,word倒是生成了,但打开时总报错“word无法启动转换器mswrd632”,点几次“确定”才能进去,里面还是乱码,我先以为是office版本低了,后来从2003换成2007问题依旧,别跟我说装wps,也别说“如果你完全安装并默认安装的C盘 那么 C:\Program Files\Common Files\Microsoft Shared\Textconv 目录 应该有这些文件。。。,完后没有就去复制这个之类的”,因为这不是我用,你不能要求客户去装wps或者去复制什么文件,我就想在office2003或2007解决这个问题,另外我也尝试过更换poi的版本,最新的3.6和旧的2.5也试过,都不行


------解决方案--------------------
这个问题我涉及过。

我们的项目中,也是使用一个word作为一个模板,然后在固定的域中进行添加文字。

但是我感觉直接用java操作不知道有没有接口,我们是使用c#做成一个dll。然后可以供java调用一个函数接口。或者你做成一个带有参数的exe,这个方式也是相似的。然后我们通过c#去执行office中自己写的脚本。office的脚本操作域那就是非常简单了。

这样调来调去的蛮麻烦的。但是我们那时候就是这么实现的。
------解决方案--------------------
楼上的方法很适用,别的就麻烦多了
------解决方案--------------------
帮顶~
------解决方案--------------------
帮顶
------解决方案--------------------
忙帮不上,只能帮顶了。
------解决方案--------------------
POI里面那个做WORD接口的兄弟被微软挖过去了,

由于没有人维护,目前POI只支持2003,不支持2007

(至少2009年9月份的时候还是这个情况,当时我去官网看到的消息,不知道现在有没有人接手)

目前只是插入文本还是问题不大的,

只是在设置属性时会有问题,

所以请不要做复杂的操作,出了问题也没有人会解决。
------解决方案--------------------
另外LZ你的操作顺序是不是有错啊

应该先打开文件输入流,然后建立POIFS对象的,怎么把打开文件放到后面去了?

你这样操作没报错么?
------解决方案--------------------
我才用jacob做的写word模板
不过用jacob基类代码我做循环替换时候有问题
我就在网上找的java2word.jar 做处理
下面我贴代码
你配置时候要注意版本 用1.9的吧 不会出现那么多问题
Java code

public static void WriteWord(String fileUrl, String fileName, Object bfo) {

        // ActiveXComponent app = new ActiveXComponent("Word.Application");
        // // 要转换的word文件
        // String inFile = fileUrl + "test.doc";
        // // 要报存的目标文件
        // String tpFile = fileUrl + Date2.getDate() + Date2.getTime()
        // + "test.doc";
        // boolean flag = false;
        // Dispatch xlo = (Dispatch) app.getObject();
        //
        // boolean visible = false;
        // // String bookMarkKey = "LB_KJGG";
        // try {
        // // 设置word不可见
        // app.setProperty("Visible", new Variant(visible));
        // Dispatch docs = app.getProperty("Documents").toDispatch();
        // Dispatch doc = Dispatch.invoke(
        // docs,
        // "Open",
        // Dispatch.Method,
        // new Object[] { inFile, new Variant(false),
        // new Variant(true) }, new int[1]).toDispatch(); // 打开word文件
        //            
        // // java反射
        // Class clazz = bfo.getClass();
        // // Field[] fields = clazz.getDeclaredFields();// 所有属性
        // Field[] fields = clazz.getDeclaredFields();
        // //
        // for (int i = 0; i < fields.length; i++) {
        // Dispatch selection = app.getProperty("Selection").toDispatch();
        // // 得到一个组件
        // Dispatch find = app.call(selection, "Find").toDispatch();
        // // 查找什么文本
        // Dispatch.put(find, "Text", "${" + fields[i].getName() + "}");
        // // 替换文本
        // Dispatch.call(find, "ClearFormatting");
        // Dispatch.put(find, "Text", "${" + fields[i].getName() + "}");
        // Dispatch.call(find, "Execute");
        // // if (null == fields[i]
        // // || "null".equals(fields[i].get(bfo).toString())) {
        // // Dispatch.put(selection, "Text", "");
        // // } else {
        // Dispatch.put(selection, "Text", fields[i].get(bfo).toString());
        // // }
        //
        // }
        //
        // // 保存文件
        // Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {
        // tpFile, new Variant(0) }, new int[1]);
        // // 作为word格式保存到目标文件
        // Variant f = new Variant(false);
        // Dispatch.call(doc, "Close", f);
        // flag = true;
        // } catch (Exception e) {
        // e.printStackTrace();
        // } finally {
        // app.invoke("Quit", new Variant[] {});
        //
        // }
        // 要转换的word文件
        String inFile = fileUrl + "wordModel.doc";
        // 要报存的目标文件
        String tpFile = fileUrl + Date2.getDate() + Date2.getTime()
                + "wordModel.doc";
        Document doc;
        try {
            doc = new Document();
            doc.open(inFile);
            // java反射
            Class clazz = bfo.getClass();
            // Field[] fields = clazz.getDeclaredFields();// 所有属性
            Field[] fields = clazz.getDeclaredFields();
            //
            for (int i = 0; i < fields.length; i++) {
                if (fields[i].get(bfo) == null) {
                    doc.replaceAll("${" + fields[i].getName() + "}", "");
                } else {
                    doc.replaceAll("${" + fields[i].getName() + "}", fields[i]
                            .get(bfo).toString());
                }
            }
            doc.saveAs(tpFile);
            doc.close(false);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        try {
            Object obj = CommonUtil.downloadFileEx(tpFile);
            CommonUtil.downLoadFile(obj, fileName, "application/msword");
            File file = new File(tpFile);
            file.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }