freemaker导出word含图片格式

之前有过java里面的poi做出编译excel,而且poi也可以导出word,同事在我们的产品中用了freemake导出word,我很感兴趣,自己做了一个demo,包含了文字和图片,给大家参考。

一、将模板word编译成xml格式


1、这里就是简单的文字和图片,然后点击word里的另存为,保存格式为xml格式;


2、通过notepad++打开后,可以通过在线格式化工具,就可以得到我们经常看到的格式了;


3、然后找到被编译成二进制的图片的二进制码,用${image}代替,


4、二进制码很长,请大家删除干净,保存好后重命名以.ftl为后缀


二、编写代码

1、打开eclipse,将pic.ftl放到一个文件夹(可新建)下面,而且将图片放到image文件(可新建)夹下面


2、我们同时是需要导入一个freemaker的jar包的,这个大家自行百度下载



3、接下里就可以编写代码

package swing;

import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import freemarker.template.Configuration;
import freemarker.template.Template;
import sun.misc.BASE64Encoder;

public class WordAction {
	
	public static void main(String[] args) throws Exception {
		
		Map<String, Object> map = new HashMap<String, Object>(); 
		Configuration configuration = new Configuration(); 
		//存放模板文件的路径
		configuration.setDirectoryForTemplateLoading(new File("src/word")); 
		configuration.setDefaultEncoding("UTF-8");//这里很重要 
		map.put("username", "张三");  
	    map.put("sex", "男");  
	    String path="src/image/zs.png";
	    map.put("image",getImageStr(path)); 
		Template t = null; 
		try { 
		// pic.ftl为要装载的模板 
		t = configuration.getTemplate("pic.ftl"); 
		} catch (IOException e) { 
		e.printStackTrace(); 
		} 
		// 输出文档路径及名称 
		System.out.println("开始导出");
		//最终导出的word的存放位置和命名
		File outFile = new File("D:/outFile.doc"); 
		if (outFile.exists()) {
			outFile.delete();
		}
		Writer out = null; 
		out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream( 
		outFile), "UTF-8"));//这里很重要 

		t.process(map, out); 
		System.out.println("导出结束");
	}
	//将图片编译成二进制码的一个方法
	public static String getImageStr(String path){//图片的存放路径
		BASE64Encoder encoder = new sun.misc.BASE64Encoder(); //这个类需要手动导出 ,之前sun公司留下来的,暂时先用着吧,之后可能会被删除
	       File file = new File(path);          
	        BufferedImage bi = null;   
	        try {   
	            bi = ImageIO.read(file);   
	            ByteArrayOutputStream baos = new ByteArrayOutputStream();   
	            ImageIO.write(bi, "png", baos);   
	            byte[] bytes = baos.toByteArray();   
	               
	            return encoder.encodeBuffer(bytes).trim();   
	        } catch (IOException e) {   
	            System.out.println("指定路径图片不存在,请检查数据!");
	        	e.printStackTrace();
	            
	        } 
		
		return null;
	}
	  
}	
	

点击运行即可,在文件的存放路径下就会出现一个word,点击打开后既可以得到最后需要的word。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值