当前位置: 代码迷 >> Java Web开发 >> java动态生成word,该怎么解决
  详细解决方案

java动态生成word,该怎么解决

热度:230   发布时间:2016-04-17 10:42:38.0
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 包
Java code
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);    }}
------解决方案--------------------

jacob速度比较慢必须windows平台的,poi的支持有一定问题 有可能打不开你自己选择一下吧
------解决方案--------------------
用iText这个jar,非常简单

Java code
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();
  相关解决方案