用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(); } }阅读上一篇:加密算法,涉及到字符串和二进制的转换,请问 下一篇:返回列表