一、先在word中画好需要的表格并定义好参数名:
二、将word文档另存为word 2003xml格式文件。
三、将xml文件后缀名,改为ftl格式,用foxe编辑器打开ftl格式文档,并缩进排版调整格式,替换参数。
循环输出的参数,采用list输出
四、若在文档中需要插入不同的图片,则需要修改文档,src和name不修改将重复显示第一张图片:
五、生成文档所需的java类
package aacmm.module.qm.printfWord; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateExceptionHandler; public class DocUtil {public Configuration configure=null; public DocUtil(){ configure=new Configuration(); configure.setDefaultEncoding("UTF-8"); } /** * 根据Doc模板生成word文件 * @param dataMap 需要填入模板的数据 * @param downloadType 文件名称 * @param wordName 生成word文档名称 * @param res HttpServletResponse * @throws IOException */ public void createDoc(Map<String,Object> dataMap,String downloadType,String wordName,HttpServletResponse res) throws IOException{ Writer out=null; InputStream fin = null; ServletOutputStream servletlout = null; String file= downloadType + (int)(Math.random() * 100000) + ".doc"; File outFile=new File(file); try { //加载需要装填的模板 Template template=null; //设置模板装置方法和路径,FreeMarker支持多种模板装载方法。 configure.setClassForTemplateLoading(this.getClass(), "ftl"); //设置对象包装器 configure.setObjectWrapper(new DefaultObjectWrapper()); //设置异常处理器 configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); //定义Template对象,注意模板类型名字与downloadType要一致 template=configure.getTemplate(downloadType+".ftl","UTF-8"); out= new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"); template.process(dataMap, out); outFile.setReadOnly(); outFile.setWritable(false); // 调用工具类WordGenerator的createDoc方法生成Word文档 fin = new FileInputStream(outFile); res.setCharacterEncoding("utf-8"); res.setContentType("application/msword"); // 设置浏览器以下载的方式处理该文件默认名为resume.doc res.addHeader("Content-Disposition", "attachment;filename=" + new String(wordName.getBytes("gb2312"), "ISO8859-1") + ".doc"); servletlout = res.getOutputStream(); byte[] buffer = new byte[512]; // 缓冲区 int bytesToRead = -1; // 通过循环将读入的Word文件的内容输出到浏览器中 while ((bytesToRead = fin.read(buffer)) != -1) { servletlout.write(buffer, 0, bytesToRead); } out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); }finally { if (servletlout != null) { servletlout.close(); } if (fin != null) { fin.close(); } if (out != null) { out.close(); } if (outFile != null) { outFile.delete(); // 删除临时文件 } } } public String getImageStr(String imgFile) throws IOException{ InputStream in=null; byte[] data=null; try { in=new FileInputStream(imgFile); data=new byte[in.available()]; in.read(data); in.close(); }catch (IOException e) { throw e; }finally{ if (in != null) { in.close(); } } return Base64.encode(data); } }