一、先在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);
}
}