freeMarker图片导出word的demo

Posted 黄小鱼ZZZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了freeMarker图片导出word的demo相关的知识,希望对你有一定的参考价值。

最近有一个需求,导出图片到word,在网上查了好多资料,根据别人的进行修改以后写了一个简单的demo。

步骤:

1,使用office新建一个word文档,加入图片,排好版。然后保存为word2003xml,刚开始保存为word xml图片没有解析出来。

2,登录http://tool.oschina.net/codeformat/xml/将xml文档格式化。

3,修改后缀为ftl.

4,新建工程,导入freemarker-2.3.22.jar(也可以是其他版本的),导入模板ftl.

5,新建类:ExportWordUtil,内容如下,

package com.ftl;

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class ExportWordUtil 

	private Configuration configuration = null;

	public ExportWordUtil() 
		configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");
	

	@SuppressWarnings("deprecation")
	public void exPortLog() 
		 // 要填入模本的数据文件
		Map dataMap = new HashMap();
		getData(dataMap);
		//获取模板
		configuration.setClassForTemplateLoading(this.getClass(),
		"/template");
		Template t = null;
		try 
			 // export_log.ftl为要装载的模板 
			t = configuration.getTemplate("export_log.ftl");
			t.setEncoding("utf-8");

		 catch (IOException e) 
			e.printStackTrace();
		
		// 输出文档路径及名称
		File outFile = new File("D:/test.doc");
		Writer out = null;
		
		try 
			out = new BufferedWriter(new OutputStreamWriter(
			new FileOutputStream(outFile), "utf-8"));
		 catch (Exception e1) 
			e1.printStackTrace();
		

		try 
			t.process(dataMap, out);
			out.close();
		 catch (TemplateException e) 
			e.printStackTrace();
		 catch (IOException e) 
			e.printStackTrace();
		
	
	
	/**
	 * 注意dataMap里存放的数据Key值要与模板中的参数相对应 
	 * @param dataMap
	 * 
	 */
	@SuppressWarnings("unchecked")
	private void getData(Map dataMap) 
		 dataMap.put("image", getImageStr());
		 System.out.println(getImageStr());
		 dataMap.put("title", "这是一个测试");  
	
	 public String getImageStr() 
		 String imgFile = "D:/test4.png";
		 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);
//		 	BASE64Encoder encoder = new sun.misc.BASE64Encoder();      
//		    BASE64Decoder decoder = new sun.misc.BASE64Decoder();    
//		   File f = new File("D:/test2.jpg");             
//	        BufferedImage bi;      
//	        try       
//	            bi = ImageIO.read(f);      
//	            ByteArrayOutputStream baos = new ByteArrayOutputStream();      
//	            ImageIO.write(bi, "jpg", baos);      
//	            byte[] bytes = baos.toByteArray();      
//	                  
//	            return encoder.encodeBuffer(bytes).trim();      
//	         catch (IOException e)       
//	            e.printStackTrace();      
//	              
//	        return null;  
	 
	 public void base64StringToImage(String base64String)    
	        try     
	        	BASE64Encoder encoder = new sun.misc.BASE64Encoder();      
			    BASE64Decoder decoder = new sun.misc.BASE64Decoder(); 
	            byte[] bytes1 = decoder.decodeBuffer(base64String);    
	                
	            ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);    
	            BufferedImage bi1 =ImageIO.read(bais);    
	            File w2 = new File("test4.png");//可以是jpg,png,gif格式    
	            ImageIO.write(bi1, "jpg", w2);//不管输出什么格式图片,此处不需改动    
	         catch (IOException e)     
	            e.printStackTrace();    
	            
	        

6,新建测试类,

TestTemplate,内容如下:

package com.ftl;

public class TestTemplate 
	
	public static void main(String[] args) 
		ExportWordUtil ewu = new ExportWordUtil();
		ewu.exPortLog();
		System.out.println("success");
	


运行测试类,可以看到效果。貌似这样做的图片大小是固定的

以上是关于freeMarker图片导出word的demo的主要内容,如果未能解决你的问题,请参考以下文章

FreeMark对导出Word中图片的处理

Java 用Freemarker完美导出word文档(带图片)

freemarker导出word,带表格和多张图片,解决图片重复和变形

使用Freemarker导出Word文档(包含图片)代码实现及总结

java用freemarker导出数据到word(含多图片)

freemarker导出wordword转pdf,带附件图片等比缩放