当前位置: 代码迷 >> J2SE >> 用Java往word的域中插入数据,该怎么解决
  详细解决方案

用Java往word的域中插入数据,该怎么解决

热度:329   发布时间:2016-04-24 02:12:41.0
用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();        }    }
  相关解决方案