前段时间在做html生成word功能,找了好几种方案,有的用jacob,但是这个比较麻烦,又是dll又是jar的,依赖太多了,而且代码量比较多,所有以采用了freemarker来生成word,制作一个模板就可以生成word文档了,生成的图片也不会依赖本地路径。此功能需要freemarker的jar包,这个大家可以自行下载 制作模板,打开word,制作报告的样式,然后另存为xml格式,最好是2003格式的xml,不然会出现不兼容的现象。完成之后修改为ftl格式的文件。下面就开始我们的编码。 //转化word的一个工具类: package com.HtmlToword.util;
import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Map;
import sun.misc.BASE64Encoder;
import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;
public class GenerateWord {
private Configuration configuration = null;
public GenerateWord() { configuration = new Configuration(); configuration.setDefaultEncoding(“utf-8”); configuration.setClassicCompatible(true); }
public void createDoc(String fileName, String outFileName, Map dataMap) { configuration.setClassForTemplateLoading(this.getClass(),”/com/ffds/util/template”); Template t = null; try { t = configuration.getTemplate(“template.ftl”); } catch (IOException e) { e.printStackTrace(); } File outFile = new File(outFileName); Writer out = null; FileOutputStream fos = null; try { fos = new FileOutputStream(outFile); OutputStreamWriter oWriter = new OutputStreamWriter(fos, “utf-8”); out = new BufferedWriter(oWriter); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try { t.process(dataMap, out); out.flush(); out.close(); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
public byte[] getBytesFromFile(File f) { if (f == null) { return null; } try { FileInputStream stream = new FileInputStream(f); ByteArrayOutputStream out = new ByteArrayOutputStream(1000); byte[] b = new byte[1000]; int n; while ((n = stream.read(b)) != -1) out.write(b, 0, n); stream.close(); out.close(); return out.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } //红色部分是处理图片的代码,不然图片不会正常显示 public String getImageStr(String imgFile) { InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); } } 接着就是向模板添加数据了,freemarker获取的是一个HashMap的数据,通过键-值来获取数据的。 代码如下: HashMap<String,Object> dataMap = new HashMap<String,Object>(); dataMap.put(“name”,”owen”); dataMap.put(“age”,”35″); var fileName = “分析报告”; String docFile=this.getHttpRequest().getRealPath(“/”)+”yourFolder\\”+fileName+”.doc”; //调用生成word函数 new GenerateWord().createDoc(“”,docFile,dataMap);
这样就可以生成很复杂的word报表了。
我的xml文件在附件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183267.html原文链接:https://javaforall.cn