Java 导出Word文档(含图片)doc格式 (保姆级)

本文介绍了如何利用Maven仓库中的Freemarker库,通过Java代码将XML格式的变量数据转化为FTL模板,最终生成Word文档。步骤包括设置变量,保存为XML,放入项目资源目录,转换文件格式,并提供了关键的Java代码示例,包括配置FreeMarker,处理数据映射,以及文件输出。此外,还涉及了图片的Base64编码转换方法。

1.maven仓库
 

  <!-- freemarker jar -->
      <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>

 

2.实现步骤

(1)使用Word文档把变量填写好(变量格式:${变量名})如图:

(2) 设置好变量另存为xml格式如图:

(3)复制到项目resource包下的 templates包(如果没有这个包,新建一个再复制进去,因为后面代码需要默认识别该包)如图:

(4)然后在项目里面把复制好的xml格式文件转成ftl格式文件(然后开始去检查这个文件之前设置好的变量名是否出现位置错误,如果出现修改过来。)
 

 

(5)开始上Java代码

 

 @Resource
    FreeMarkerConfigurer freeMarkerConfigurer;

    /**
     * 根据id导出word
     * @param request
     * @param response
     * @param dataMap 要存的值 
     * @param url 文件路径 如 "temp2.ftl" 
     * @param fileName 文件名称 "导出word文档"
     * @throws IOException
     */
    public void exportWord(HttpServletRequest request, HttpServletResponse response,Map<String, Object> dataMap,String url,String fileName) throws IOException {
        InputStream fin = null;
        ServletOutputStream out = null;
        File outFile = null;
        try {
            //Configuration 用于读取ftl文件
            Configuration configuration = new Configuration(new Version("2.3.0"));
            configuration.setDefaultEncoding("utf-8");

            /**
             * 以下是两种指定ftl文件所在目录路径的方式,注意这两种方式都是
             * 指定ftl文件所在目录的路径,而不是ftl文件的路径
             */
            Template template;

            //输出文档路径及名称
            outFile = new File(fileName);
            //以utf-8的编码读取ftl文件
            template = freeMarkerConfigurer.getConfiguration().getTemplate(url);

            Writer wout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240);
            template.process(dataMap, wout);
            wout.close();

            fin = new FileInputStream(outFile);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            // 设置浏览器以下载的方式处理该文件名
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName+".doc", "UTF-8"));

            out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            // 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fin != null) {
                fin.close();
            }
            if (out != null) {
                out.close();
            }
            if (outFile != null) {
                outFile.delete();
            }
        }
    }

    /**
     * 图片转换
     * @param imgFile
     * @return
     */
    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);
    }

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值