之前有过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。