用Java往word的域中插入数据

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

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

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();

}
}


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

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也试过,都不行
...全文
1884 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
hd7790800 2011-12-13
  • 打赏
  • 举报
回复
iText可以的
zhanqitan 2011-03-04
  • 打赏
  • 举报
回复
楼主个完整的实例啊!!
顶你
gaoqs1984 2011-01-27
  • 打赏
  • 举报
回复
我也遇到了,情况是我在word2007下生成doc格式的。相当于,直接把docx的强转成了doc。在word2003下生成,不会出现这种情况
空空空空 2010-04-13
  • 打赏
  • 举报
回复

我现在也遇到同样问题,不知道楼主是怎么解决的?
asi12lanxin 2010-03-19
  • 打赏
  • 举报
回复
楼主的问题解决了吗
我现在也遇到这样的问题。我是通过附件上传上去的word提示错误,无法启动mswrd632
gesanri 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 xuyang840117 的回复:]
我注释的地方不是用java2word  就是jocab做的
但是循环不好用  时间紧迫 没来得及去研究
我相信jocab做循环肯定好用

插入域 jocab中不是有吗 反正 它和java2word的配置都是一样的
那就导入两个jar包都导入进去
一起用呗
[/Quote]
哪有啊?我还真没看到,能告诉我是哪个包吗?我只找到处理书签的,没找到处理域的
xuyang840117 2009-12-24
  • 打赏
  • 举报
回复
我注释的地方不是用java2word 就是jocab做的
但是循环不好用 时间紧迫 没来得及去研究
我相信jocab做循环肯定好用

插入域 jocab中不是有吗 反正 它和java2word的配置都是一样的
那就导入两个jar包都导入进去
一起用呗
wholesale3151 2009-12-23
  • 打赏
  • 举报
回复
ByteArrayInputStream bais = newchinese wholesalersInputStream(b);

POIFSFileSystem fs = new POIFSFileSystem();

FileOutputStream ostream = new FileOutputStream(fileToWrite);

lixinwin2003 2009-12-23
  • 打赏
  • 举报
回复
有点晕
gesanri 2009-12-22
  • 打赏
  • 举报
回复
最后顶一次
gesanri 2009-12-21
  • 打赏
  • 举报
回复
up
牛叔 2009-12-21
  • 打赏
  • 举报
回复
mark
gesanri 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xuyang840117 的回复:]
我才用jacob做的写word模板
不过用jacob基类代码我做循环替换时候有问题
我就在网上找的java2word.jar 做处理
下面我贴代码
你配置时候要注意版本 用1.9的吧 不会出现那么多问题
Java codepublicstaticvoid 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();
}
}
[/Quote]
我下了个java2word,看到了插入书签的方法,但没看到插入域的方法
doc.insertAtBookmark("标题","政府公文");
倒也不是说word模板中一定要用域,也可以用书签,但word中插入书签只能看到个I,我想在word模板中能看到具体的提示(比如这处的“标题”),当然,可以用replace,比如word模板中定义字符串“标题”,完后用replace替换,只是程序中还涉及到插入图片等其它内容,所以还是不行
架构师虎哥 2009-12-18
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20050204/11/3775187.html
貌似也不是正确的,没办法了。
架构师虎哥 2009-12-18
  • 打赏
  • 举报
回复
大体搜了下。
http://topic.csdn.net/t/20050201/08/3767379.html
但是都是用我说的那种方式做的。
我在帮你看下。
gesanri 2009-12-18
  • 打赏
  • 举报
回复
那照你这么说得用c#来实现了,java不能实现么,不会吧
架构师虎哥 2009-12-18
  • 打赏
  • 举报
回复
这个问题我涉及过。

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

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

这样调来调去的蛮麻烦的。但是我们那时候就是这么实现的。
gesanri 2009-12-18
  • 打赏
  • 举报
回复
iText行吗?jacob行吗?希望有做过的来说说,最后举个例子
xuyang840117 2009-12-18
  • 打赏
  • 举报
回复
2007不好用
YBBPS1109 2009-12-18
  • 打赏
  • 举报
回复
Jacob能做,之前都是在2003上实现的,2007没试过。
http://www.blogjava.net/invoked/archive/2009/09/28/296759.html
加载更多回复(9)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧