• Java使用模板导出word文档


    Java使用模板导出word文档

    • 需要导入freemark的jar包
    1. 使用word模板,在需要填值的地方使用字符串代替,是因为word转换为xml文件时查找不到要填入内容的位置。尽量不要在写字符串的时候就加上${},xml文件会让它和字符串分离。
      比如: 姓名| name
    2. 填充完之后,把word文件另存为xml文件,然后使用notepad 等编辑软件打开,打开之后代码很多,也很乱,根本看不懂,其实也不用看懂哈,搜索找到你要替换的位置的字符串,比如name,然后加上 ${} ,变成 ${name} 这样,然后就可以保存了,之后把保存的文件名后缀替换为.ftl。模板就ok了。
    3. 有个注意事项,这里的值一定不可以为空,否则会报错,freemark有判断为空的语句,这里示例一个,根据个人需求,意思是判断name是否为空,trim之后的lenth是否大于0:

      <#if name?default("")?trim?length gt 0>
      <w:t>${name}</w:t>
      </#if>

    4. 如果在本地的话可以直接下载下来,但是想要在通过前端下载的话那就需要先将文件下载到本地,当作临时文件,然后在下载文件。接下来上代码,示例:
    public void downloadCharge(String  name, HttpServletRequest request, HttpServletResponse response) {
         
            Map<String, Object> map = new HashMap<>();
            map.put("name", name);
            Configuration configuration = new Configuration();
            configuration.setDefaultEncoding("utf-8");
            try { //模板存放位置
                InputStream inputStream = this.getClass().getResourceAsStream("/template/report/XXX.ftl");
                Template t = new Template(null, new InputStreamReader(inputStream));
                String filePath = "tempFile/";
                //导出文件名
                String fileName = "XXX.doc";
    	    //文件名和路径不分开写的话createNewFile()会报错
                File outFile = new File(filePath + fileName);
                if (!outFile.getParentFile().exists()) {
                    outFile.getParentFile().mkdirs();
                }
                if (!outFile.exists()) {
                    outFile.createNewFile();
                }
    
                Writer out = null;
                FileOutputStream fos = null;
                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, 1024 * 10);
                t.process(map, out);
                out.close();
                fos.close();
    	     //调用download方法下载临时文件
                download(outFile, request, response);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    

    这里下载的文件名是乱码,个人能力有限,找了很多方法没有解决掉,如果你有好的解决方法可以告诉我,感谢

     /**
         * 下载生成的word文件并删除临时文件
         */
        private void download(File file, HttpServletRequest request, HttpServletResponse response) {
    
            ServletOutputStream out = null;
            FileInputStream inputStream = null;
            try {
                String filename = file.getName();
                String userAgent = request.getHeader("User-Agent");
                // 针对IE或者以IE为内核的浏览器:
                if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                    filename = java.net.URLEncoder.encode(filename, "UTF-8");
                } else {
                    // 非IE浏览器的处理:
                    // filename = URLEncoder.encode(filename, "UTF-8");
                    filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
                }
                response.setHeader("Content-disposition",
                        String.format("attachment; filename="%s"", filename));
                response.setContentType("application/download");
                response.setCharacterEncoding("UTF-8");
                out = response.getOutputStream();
                inputStream = new FileInputStream(file);
                byte[] buffer = new byte[1024 * 10];
                int bytesToRead = -1;
                // 通过循环将读入的Word文件的内容输出到浏览器中
                while ((bytesToRead = inputStream.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesToRead);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != out) out.close();
                    if (null != inputStream) inputStream.close();
                    file.delete();
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }
    

    这样,参照模板的文件就下载下来了
    写的有点乱,请担待,上面制作模板部分百度一大堆,不理解的可以百度哈

  • 相关阅读:
    SqlSession接口和Executor
    MySQL 存储表情字符
    Lisp学习--Windows下面的开发环境搭建
    使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝
    GIT团队合作探讨之一-保持工作同步的概念和实践
    关于IE8下media query兼容的解决方案探讨
    git下的团队合作模型及git基础知识汇集
    互联网环境下服务提供的模式
    web统计数据搜集及分析原理
    网站统计及移动应用数据统计相关术语知识详解
  • 原文地址:https://www.cnblogs.com/mengzhao/p/13744194.html
Copyright © 2020-2023  润新知