java自动生成word,java动态生成word解决方案

博客内容讨论了如何在Java环境下动态生成Word文档的问题。作者尝试了多种方法,包括使用jacob、poi和JavaScript,但都遇到了不同的挑战,如浏览器兼容性、效率和平台限制。最终提出了使用模板和变量替换的方法,以及考虑使用iText库来简化生成过程。文章提供了代码示例,并指出模板管理和动态数据填充是关键。
摘要由CSDN通过智能技术生成

java动态生成word

我想弄一个java网站上的可以生成word,上网搜索了几天,找到几个可以java令jsp(html)转换成word的有jacob和poi,

还有JS,还有在jsp上添加头文件,,JS生成是可以符合我的要求,但在用到火狐的时候,这个生成方式就不行了,而且这个生

成方式的缺点比较慢,JSP添加头文件则不大灵活,相当于有一个浏览的页面就必须有一个下载的页面,数据量小的时候还可

以,如果大了也是有它的弊端的,而jacob的资料都是比较复杂,有html转换成word的但例子都是本地html转换成DOC,你没可

能要求客户还下载你页面吧,而poi网上说的都是它比较差,我就没有细细去找POI了,还有一个重点是我网站系在的word是动

态的,就是我需要的时候才生成而不是已经存在于项目或者数据库,因为要下载的word的内容是随时可以更新的,所以word的

生成必须是在用到才产生,而且需要生成word的量是比较大的,希望各位大侠指导指导

------解决方案--------------------

设置特定的模版,按照自己的标准设置变量

在后台管理中,复制一份模板,然后填充新模板中对应的变量

下载更新后模板。

模板格式可以随意调整,只要变量不变。

下载 jacob.jar 包

package com.shengsiyuan;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.util.TreeMap;

import java.util.Map.Entry;

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.Dispatch;

import com.jacob.com.Variant;

public class Word {

public static boolean changeWord(String docPath, Map map) {

ActiveXComponent component=null;

try {

component = new ActiveXComponent(

"Word.Application");

component.setProperty("Visible", new Variant(false)); // 设置word不可见

Dispatch docs = component.getProperty("Documents").toDispatch();

Dispatch doc = Dispatch.invoke(

docs,

"Open",

Dispatch.Method,

new Object[] { docPath, new Variant(false),

new Variant(false) }, new int[1]).toDispatch();

Dispatch selection = component.getProperty("Selection")

.toDispatch();// 获得对Selection组件

Dispatch.call(selection, "HomeKey", new Variant(6));// 移到开头

Dispatch find = Dispatch.call(selection, "Find").toDispatch();// 获得Find组件

Set set = map.entrySet();

Iterator iter = set.iterator();

while (iter.hasNext()) {

Entry entry = (Entry) iter.next();

Dispatch.put(find, "Text", entry.getKey()); // 查找字符串"name"

Dispatch.put(find, "MatchCase", "True"); // 大小写匹配

Dispatch.put(find, "MatchWholeWord", "True"); // 全字符匹配

boolean b = Dispatch.call(find, "Execute").getBoolean(); // 执行查询

// 循环查找, 知道一个就替换一个 并且移动到下一位

while (b) {

Dispatch.put(selection, "Text", entry.getValue());

Dispatch.call(selection, "MoveRight"); // 替换之后移动到下一位 重要 or

// 出现死循环

b = Dispatch.call(find, "Execute").getBoolean(); // 判断是否还存在

// 执行替换替换

}

Dispatch.call(selection, "HomeKey", new Variant(6));// 移到开头

}

Dispatch.call(doc, "Save"); // 保存

Dispatch.call(doc, "Close", new Variant(false));

} catch (Exception e) {

e.printStackTrace();

} finally {

component.invoke("Quit", new Variant[] {});

component.safeRelease();

}

return true;

}

public static void main(String[] args) {

Map map = new TreeMap();

map.put("#(name)", "张三");

map.put("#(age)", "18");

map.put("#(sex)", "man");

changeWord("D:\\a.doc",map);

}

}

word里面内容

姓名:#(name)

年龄:#(age)

性别:#(sex)

------解决方案--------------------

jacob速度比较慢必须windows平台的,poi的支持有一定问题 有可能打不开你自己选择一下吧

------解决方案--------------------

用iText这个jar,非常简单

File docFile = new File(model.getFilePath());

if(docFile.exists()){

docFile.delete();

}

try {

docFile.createNewFile();

BufferedOutputStream writer =new BufferedOutputStream(new FileOutputStream(docFile));

//设置文件头

writer.write(doc.ReportHead().getBytes());

for(int i=0;i<9;i++) writer.write(doc.PeportParagraph(" ").getBytes());

writer.write(doc.PeportParagraph(model.getReportTitle(),36,"BC").getBytes());

//画间距

for(int i=0;i<20;i++) writer.write(doc.PeportParagraph(" ").getBytes());

table.set_width("40,60");

table.set_noborder();

table.add_cell(doc.new ReportCell(doc.PeportChunk("模板创建人:",16),"R"));

table.add_cell(doc.new ReportCell(doc.PeportChunk(model.getCreateUser(),16)));

table.write_cell(writer);

writer.write(doc.NewPage().getBytes());

writer.write(doc.ReportEnd().getBytes());

writer.flush();

writer.close();

照着这个写就OK了,网上搜一下,很多API的。

------解决方案--------------------

Quote=引用:]

这里的模版就和你写的jsp差不多,都是通过标签控制的,如果你没有数据用标签控制一下就是了,有数据就显示没有数据就不现实

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值