1.java动态生成word,该怎么解决
阅读目录
1. 制作 Word 模版,将你需要动态生成的字段用${}替换。
2. 将 Word文档保存为 xml 。
3. 引入项目。
项目中需要用 java 程序生成doc 文件,百度一番,发现FreeMarker 的评价比较高。
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,至于想详细了解 FreeMarker 的请自行百度。
1. 制作 Word 模版,将你需要动态生成的字段用${}替换。如:${name}、${age}
2. 将 Word文档保存为 xml。
3. 引入项目。将 xml 文件更改后缀名 为 .ftl, 然后引用到你的项目中。
4. 需要注意的问题:
a. word 版本不能低于 2003 ,因为 2003 才开始支持 xml。
5. 备注:
a. template.process(),接受一个 Map 和 输入流做为入参,Map 既是你需要动态生成到 doc 里面的数据,字段名必须与你在 .ftl 里面定义的一致;
b. 如果你想利用这段代码,需要有一个 .ftl 文件,并且在你的项目 src 目录下面新建 template 目录;
c.辅助文件"FreeMarker.jar 、实例项目的.ftl "。
2.如何能让Java生成复杂Word文档
客户要求用程序生成标准的word文档,要能打印,而且不能变形,以前用过很多解决方案,都在客户严格要求下牺牲的无比惨烈。
POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。
iText操作Excel还行。对于复杂的大量的word也是噩梦。
直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。
Word从2003开始支持XML格式,用XML还做就很简单了。
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。
看看实际效果
首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:
将编辑好的文档另存为XML
3.java生成word文档的问题
1-apache的POI,此方法对Excel的导出做的很好,目前对Word的导出方面的功能尚未完全。
2-纯JavaScript脚本实现。主要通过客户端调用本机Office组件来实现。
3-在JSP页面引入头文件实现。 纯JavaScript脚本实现细节方面大体是创建一个word组件ActiveXObject('Word.Application'),用js通过表ID取得表内容然后保存到word,要注意的是js实现有很多不好的地方,例如Internet选项需要把ActiveX空间全部启用,安全级别设置为中。
这样的话岂不是每台机器都要配置一下。其次每次生成word文档以后弹出对话框(无法保存此文件,因为它已在别处打开(C:\。
\STARTUP\Powerword.dot)),出现此问题就需要把C:\Documents and Settings\当前用户名\Application Data\Microsoft\Word\STARTUP下的Powerword.dot文件删除,每次遇到此问题就需要删除文件来解决,十分不方便。 JSP页面引入来实现Word保存就方便多了,但是也有不足的地方,首先如果需要引入
public class NewClass {
public static void main(String[] args) {
try {
Document doc = new Document();
//打开word文档,这需要你自己在随便一个盘下建立一个word文档的
doc.open("D:/a.doc");
//得到填充表格所用的数据
List list = returnCLis();
//向表格里插入数据
doc.replaceTable(2,1,1,list);
//关闭word文档
doc.close(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public static List returnCLis(){
List list = new ArrayList();
String[] array4 = new String[]{"","星期一","星期二","星期三","总计"};
String[] array1 = new String[]{"南部","15","17","12","44"};
String[] array2 = new String[]{"中部","15","17","13","45"};
String[] array3 = new String[]{"东部","12","17","12","41"};
list.add(array4);
list.add(array1);
list.add(array2);
list.add(array3);
return list;
}
}
你试试
5.java如何根据word模板生成word文档
先下载jacob_1.10.1.zip。
解压后将jacob.dll放到windows/system32下面或\j2sdk\bin下面。 将jacob.jar加入项目。
/* * Java2word.java * * Created on 2007年8月13日, 上午10:32 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ /* * 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。 * word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……, 以免执行错误的替换。
* 所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件后缀名为:.bmp、.jpg、.gif)。 * 要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,其中:R代表从表格的第R行开始替换,N代表 word模板中的第N张表格;Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代 表一行数据,ArrayList中第一条记录为特殊记录,记录的是表格中要替换的列号,如:要替换第一列、第三列、第五列的数据,则第一条记录为String[3] {“1”,”3”,”5”}。
*/ package com.word.util; /** * * @author kdl */ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class Java2word { private boolean saveOnExit; /** * word文档 */ Dispatch doc = null; /** * word运行程序对象s */ private ActiveXComponent word; /** * 所有word文档 */ private Dispatch documents; /** * 构造函数 */ public Java2word() { if(word==null){ word = new ActiveXComponent("Word.Application"); word.setProperty("Visible",new Variant(false)); } if(documents==null) documents = word.getProperty("Documents").toDispatch(); saveOnExit = false; } /** * 设置参数:退出时是否保存 * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件 */ public void setSaveOnExit(boolean saveOnExit) { this.saveOnExit = saveOnExit; } /** * 得到参数:退出时是否保存 * @return boolean true-退出时保存文件,false-退出时不保存文件 */ public boolean getSaveOnExit() { return saveOnExit; } /** * 打开文件 * @param inputDoc String 要打开的文件,全路径 * @return Dispatch 打开的文件 */ public Dispatch open(String inputDoc) { return Dispatch.call(documents,"Open",inputDoc).toDispatch(); //return Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[]{inputDoc},new int[1]).toDispatch(); } /** * 选定内容 * @return Dispatch 选定的范围或插入点 */ public Dispatch select() { return word.getProperty("Selection").toDispatch(); } /** * 把选定内容或插入点向上移动 * @param selection Dispatch 要移动的内容 * @param count int 移动的距离 */ public void moveUp(Dispatch selection,int count) { for(int i = 0;i < count;i="" ++)="" dispatch.call(selection,"moveup");="" }="" *="" *="" 把选定内容或插入点向下移动="" *="" @param="" selection="" dispatch="" 要移动的内容="" *="" @param="" count="" int="" 移动的距离="" */="" public="" void="" movedown(dispatch="" selection,int="" count)="" {="" for(int="" i="0;i">< count;i="" ++)="" dispatch.call(selection,"movedown");="" }="" *="" *="" 把选定内容或插入点向左移动="" *="" @param="" selection="" dispatch="" 要移动的内容="" *="" @param="" count="" int="" 移动的距离="" */="" public="" void="" moveleft(dispatch="" selection,int="" count)="" {="" for(int="" i="0;i">< count;i="" ++)="" {="" dispatch.call(selection,"moveleft");="" }="" }="" *="" *="" 把选定内容或插入点向右移动="" *="" @param="" selection="" dispatch="" 要移动的内容="" *="" @param="" count="" int="" 移动的距离="" */="" public="" void="" moveright(dispatch="" selection,int="" count)="" {="" for(int="" i="0;i">< count;i="" ++)="" dispatch.call(selection,"moveright");="" }="" *="" *="" 把插入点移动到文件首位置="" *="" @param="" selection="" dispatch="" 插入点="" */="" public="" void="" movestart(dispatch="" selection)="" {="" dispatch.call(selection,"homekey",new="" variant(6));="" }="" *="" *="" 从选定内容或插入点开始查找文本="" *="" @param="" selection="" dispatch="" 选定内容="" *="" @param="" tofindtext="" string="" 要查找的文本="" *="" @return="" boolean="" true-查找到并选中该文本,false-未查找到文本="" */="" public="" boolean="" find(dispatch="" selection,string="" tofindtext)="" {="" 从selection所在位置开始查询="" dispatch="" find="word.call(selection,"Find").toDispatch();" 设置要查找的内容="" dispatch.put(find,"text",tofindtext);="" 向前查找="" dispatch.put(find,"forward","true");="" 设置格式="" dispatch.put(find,"format","true");="" 大小写匹配="" dispatch.put(find,"matchcase","true");="" 全字匹配="" dispatch.put(find,"matchwholeword","true");="" 查找并选中="" return="" dispatch.call(find,"execute").getboolean();="" }="" *="" *="" 把选定内容替换为设定文本="" *="" @param="" selection="" dispatch="" 选定内容="" *="" @param="" newtext="" string="" 替换为文本="" */="" public="" void="">
6.java 代码生成word文件
没定格式的话可以再jsp页面添加这段:
<%
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
java.util.Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyyMMddhhmmss");
String Starttime = df.format(date).toString();
response.setHeader("Content-disposition", "attachment; filename=GroupingInformation_"+ Starttime + ".doc");
%>
如果要定好格式的话,只有自己去看poi比较复杂。(但是用习惯了就没大问题了。)
poi后台:
导出第三句是格式,这个自己去试试。
7.求教用java 生成word!!!
1-apache的POI,此方法对Excel的导出做的很好,目前对Word的导出方面的功能尚未完全。
2-纯JavaScript脚本实现。主要通过客户端调用本机Office组件来实现。
3-在JSP页面引入头文件实现。
纯JavaScript脚本实现细节方面大体是创建一个word组件ActiveXObject('Word.Application'),用js通过表ID取得表内容然后保存到word,要注意的是js实现有很多不好的地方,例如Internet选项需要把ActiveX空间全部启用,安全级别设置为中。这样的话岂不是每台机器都要配置一下。其次每次生成word文档以后弹出对话框(无法保存此文件,因为它已在别处打开(C:\。\STARTUP\Powerword.dot)),出现此问题就需要把C:\Documents and Settings\当前用户名\Application Data\Microsoft\Word\STARTUP下的Powerword.dot文件删除,每次遇到此问题就需要删除文件来解决,十分不方便。
JSP页面引入来实现Word保存就方便多了,但是也有不足的地方,首先如果需要引入
如果需要下载的话就引入
其实如果大家用框架做就方便多了,比如Struts2。在Action里直接写如下代码:
if(out!=null){
String fileName="";
fileName+="评价报告.doc";
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setHeader("Content-disposition","attachment; filename="+new String(fileName.getBytes("GB2312"), "8859_1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
out是jsp页面表单元素,一个button,用于提交表单到相应Action进行Word下载。Action设置jsp页面头文件。这样每次点击button就可以把相应jsp页面的内容保存到Word中并且支持下载,Word中内容并且是可编辑状态。
不足的地方在于由于表内容是动态生成,有的需要先查看在下载Word,就需要另外建立一个新JSP页面进行Word下载,当然首先要在struts.xml里配置好页面转向。
新建立的页面传值同查看页面要保持一样。
8.java生成word文档的问题
Jacob解决Word文档的读写问题收藏 Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。
使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。Jacob下载的地址为:.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class WordOperate { public static void main(String args[]) { ActiveXComponent wordApp = new ActiveXComponent("Word.Application"); // 启动word // Set the visible property as required. Dispatch.put(wordApp, "Visible", new Variant(true));// //设置word可见 Dispatch docs = wordApp.getProperty("Documents").toDispatch(); // String inFile = "d:\\test.doc"; // Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, // new Object[] { inFile, new Variant(false), new Variant(false)},//参数3,false:可写,true:只读 // new int[1]).toDispatch();//打开文档 Dispatch document = Dispatch.call(docs, "Add").toDispatch();// create new document String userName = wordApp.getPropertyAsString("Username");// 显示用户信息 System.out.println("用户名:" + userName); // 文档对齐,字体设置//////////////////////// Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch(); Dispatch align = Dispatch.get(selection, "ParagraphFormat") .toDispatch(); // 行列格式化需要的对象 Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象 // 标题处理//////////////////////// Dispatch.put(align, "Alignment", "1"); // 1:置中 2:靠右 3:靠左 Dispatch.put(font, "Bold", "1"); // 字型租体 Dispatch.put(font, "Color", "1,0,0,0"); // 字型颜色红色 Dispatch.call(selection, "TypeText", "Word文档处理"); // 写入标题内容 Dispatch.call(selection, "TypeParagraph"); // 空一行段落 Dispatch.put(align, "Alignment", "3"); // 1:置中 2:靠右 3:靠左 Dispatch.put(selection, "Text", " "); Dispatch.call(selection, "MoveDown"); // 光标标往下一行 //表格处理//////////////////////// Dispatch tables = Dispatch.get(document, "Tables").toDispatch(); Dispatch range = Dispatch.get(selection, "Range").toDispatch(); Dispatch table1 = Dispatch.call(tables, "Add", range, new Variant(3), new Variant(2), new Variant(1)).toDispatch(); // 设置行数,列数,表格外框宽度 // 所有表格 Variant tableAmount = Dispatch.get(tables, "count"); System.out.println(tableAmount); // 要填充的表格 Dispatch t1 = Dispatch.call(tables, "Item", new Variant(1)) .toDispatch(); Dispatch t1_row = Dispatch.get(t1, "rows").toDispatch();// 所有行 int t1_rowNum = Dispatch.get(t1_row, "count").getInt(); Dispatch.call(Dispatch.get(t1, "columns").toDispatch(), "AutoFit");// 自动调整 int t1_colNum = Dispatch.get(Dispatch.get(t1, "columns").toDispatch(), "count").getInt(); System.out.println(t1_rowNum + " " + t1_colNum); for (int i = 1; i <= t1_rownum;="" i++)="" {="" for="" (int="" j="1;" j="">=><= t1_colnum;="" j++)="" {="" dispatch="" cell="Dispatch.call(t1," "cell",="" new="" variant(i),="" new="" variant(j)).todispatch();//="" 行,列="" dispatch.call(cell,="" "select");="" dispatch.put(selection,="" "text",="" "cell"="" +="" i="" +="" j);="" 写入word的内容="" dispatch.put(font,="" "bold",="" "0");="" 字型租体(1:租体="" 0:取消租体)="" dispatch.put(font,="" "color",="" "1,1,1,0");="" 字型颜色="" dispatch.put(font,="" "italic",="" "1");="" 斜体="" 1:斜体="" 0:取消斜体="" dispatch.put(font,="" "underline",="" "1");="" 下划线="" dispatch="" range="Dispatch.get(cell," "range").todispatch();="" string="" cellcontent="Dispatch.get(Range," "text").tostring();="" system.out.println((cellcontent.substring(0,="" cellcontent="" .length()="" -="" 1)).trim());="" }="" dispatch.call(selection,="" "movedown");="" 光标往下一行(才不会输入盖过上一输入位置)="" }="" 合并单元格////////////////////////="" dispatch.put(selection,="" "text",="" "="" ");="" dispatch.call(selection,="" "movedown");="" 光标标往下一行="" dispatch="" range2="Dispatch.get(selection," "range").todispatch();="" dispatch="" table2="Dispatch.call(tables," "add",="" range2,="" new="" variant(8),="" new="" variant(4),="" new="">=>
转载请注明出处51数据库 » java完美生成word的解决方案
此号被社byV先森