【day22】java导出word文档(包含导出图片)

package com.havenliu.document;
 
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
 
public class Main {
 
	/**
	 * @param args
	 * @throws UnsupportedEncodingException
	 */
	public static void main(String[] args) throws UnsupportedEncodingException {
		// DocumentHandler dh=new DocumentHandler();
		// dh.createDoc();
		// MyTest mt=new MyTest();
		// mt.createDoc();
 
		Map<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put("name", "你好邱林和");
 
		MDoc mdoc = new MDoc();
		mdoc.createDoc(dataMap, "D:/outFile.doc");
		System.out.println("模板生成成功");
	}
 
}
  • Jfinal接口测试
 /**
     * 导出领导人员考核报告word
     */
    @Clear(AppSessionInterceptor.class)
    public void exportLdrykhbgWord(JSONObject jsonParam) {
        JSONObject params = kit.get(jsonParam, "params");
        Khry khry = params.toJavaObject(Khry.class);
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("name", khry.getName());
        dataMap.put("image", MDoc.getImgFileToBase64(khry.getSex()));
        MDoc mdoc = new MDoc();
        try {
            mdoc.createDoc(dataMap, "d:/ldrykhbg-" + new Date().getTime() + ".doc");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println("模板生成成功");
    }
  • 工具类
package com.longway.core.toolbox.utils;

import java.io.*;
import java.util.Map;

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

public class MDoc {

    private Configuration configuration = null;

    public MDoc() {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
    }

    public void createDoc(Map<String, Object> dataMap, String fileName) throws UnsupportedEncodingException {
        // dataMap 要填入模本的数据文件
        // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
        // 这里我们的模板是放在com.havenliu.document.template包下面
        configuration.setClassForTemplateLoading(this.getClass(), "/_template");
        Template t = null;
        try {
            // test.ftl为要装载的模板
//            t = configuration.getTemplate("test_word.ftl");
            t = configuration.getTemplate("img.ftl");
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 输出文档路径及名称
        File outFile = new File(fileName);
        Writer out = null;
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(outFile);
            OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
            // 这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
            // out = new BufferedWriter(new OutputStreamWriter(new
            // FileOutputStream(outFile)));
            out = new BufferedWriter(oWriter);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

        try {
            t.process(dataMap, out);
            out.close();
            fos.close();
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据图片路径获取图片并转换位base64格式字符串
     * imgFile 图片本地存储路径
     */
    public static String getImgFileToBase64(String imgFile) {
        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        InputStream inputStream = null;
        byte[] buffer = null;
        //读取图片字节数组
        try {
            inputStream = new FileInputStream(imgFile);
            int count = 0;
            while (count == 0) {
                count = inputStream.available();
            }
            buffer = new byte[count];
            inputStream.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    // 关闭inputStream流
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        // 对字节数组Base64编码
        return new BASE64Encoder().encode(buffer);
    }
}

在加入了图片占位的地方,会看到一片base64编码后的代码,把base64替换成${image},也就是Map<String, Object>中key,值必须要处理成base64;

代码如:<w:binData w:name=“wordml://自定义.png” xml:space=“preserve”>${image}</w:binData>

注意:“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。

/**
* imgFile 图片本地存储路径
*/
public static String getImgFileToBase64(String imgFile) {
        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        InputStream inputStream = null;
        byte[] buffer = null;
        //读取图片字节数组
        try {
            inputStream = new FileInputStream(imgFile);
            int count = 0;
            while (count == 0) {
                count = inputStream.available();
            }
            buffer = new byte[count];
            inputStream.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    // 关闭inputStream流
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        // 对字节数组Base64编码
        return new BASE64Encoder().encode(buffer);
    }

  • 项目实例
  public static void main(String[] args) throws UnsupportedEncodingException {
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("name", "szm");
        dataMap.put("image", getImgFileToBase64("d://wxm.jpeg"));

        MDoc mdoc = new MDoc();
        mdoc.createDoc(dataMap, "d:/ldrykhbg-" + new Date().getTime() + ".doc");
        System.out.println("模板生成成功");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值