zoukankan      html  css  js  c++  java
  • 使用Freemarker创建word文档

    最近做一个项目,本来是直接在网页上查看文本信息,然后给客户直接打印的,但是发现也许是浏览器还是打印机的原因,总之,有个客户打印出来的格式始终与其他的不同,没办法,最后想到了直接将数据库中的信息生成一个Word文档,供客户下载,这样因为事先模板已经设置后,所以客户可以直接打印,也可以根据自己的爱好,调整格式,废话不多说,讲讲项目。

    首先,这个用到了freemarker,先把用到的可能用到的jar包给大家看看:

    opencv-2410.jar  
    freemarker.jar
    sun.misc.BASE64Decoder.jar

      需要这三个jar包的朋友,可以直接@我;

    开始项目步骤:

    1、在新建一个Word文档,将你想好的模板格式设计好

      

     审美观不好,大家多多见谅,这里红色标记的部分是插入的图片,这里就没将图片插进去了。 相信细心的朋友也看见了里面很多我是用${*}来代替的,这个很关键,每一个都代表你动态往里面填充的数据,在后台填充的时候也是根据里面的代码来执行的。

    2、模板生成好了之后,选择另存为,将Word文档保存为后缀名为xml的文本信息,

    选择保存。

    3、保存之后,用记事本打开xml文件,你会发现里面的内容成了这样

    是不是完全看不懂,没关系,仔细看下,你会发现里面很多你编辑的内容都在,比如{*}这种,也可能觉得格式不对,小伙伴别着急,回头你放在eclipse里面,格式化一下,就好看多了;当然,这里的注意,由于收入法以及个人打字习惯的原因,在Word里面编辑的时候会出现${*}分开的时候,这时,你打开xml就发现变成了${* ,隔了好大一部分代码才有一个},这种是执行不了的,所以个人建议是事先在txt文档中写好,复制过去;还有,你插入的图片这里会识别不了,成为乱码,别着急,搜索<pkg:binaryData>,找到首位部分,替换一下,我替换之后成了这样<pkg:binaryData>${papersImg}</pkg:binaryData>,最后选择保存;

    4、下面开始讲解代码编写,导包就不多说了,这里把项目用到的代码给大家粘贴下面,我个人比较懒,代码我也加了注释,方便测试人看,所以也就不给大家细细讲解了,有不懂的可以私下问我;

    package com.inquiry.util;
    
    import java.io.BufferedWriter;  
    import java.io.DataInputStream;
    import java.io.File;  
    import java.io.FileInputStream;
    import java.io.FileOutputStream;  
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;  
    import java.io.Writer;  
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.HashMap;  
    import java.util.Map;
    
    import com.inquiry.vo.WordSetVo;
    
    import Decoder.BASE64Encoder;
    import freemarker.template.Configuration;  
    import freemarker.template.Template;
    
    public   class CreateWord {
        
        /**
         * 将对应的图片放入Word文档中
         * @param imgFile
         * @return
         */
         private static   String getImageStr(String imgFile) {
             InputStream in = null;
             byte[] data = null;
             try {
                 in = new FileInputStream(imgFile);
                 data = new byte[in.available()];
                 in.read(data);
                 in.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
             BASE64Encoder encoder = new BASE64Encoder();
             return encoder.encode(data);
         }
        
        
        /**
         * 
         * @param vo  word数据回填
         * @param status     审核进度
         * @param saveAddress    //文件保存地址
         */
        public static   void setData(WordSetVo vo ,int status, String saveAddress,String path) {
            Map<String, Object> map = new HashMap<String, Object>();
            // 编号
            map.put("formid", vo.getFormNumber());
            // 证件照
            map.put("papersImg", getImageStr(downloadPicture(vo.getPapersImg(),path)));
            // 现场照
            map.put("spotImg", getImageStr(downloadPicture(vo.getSpotImg(),path)));
            // 姓名
            map.put("name", vo.getName());
            // 曾用名
            if (vo.getFormName() != null) {
                map.put("formName", vo.getFormName());
            } else {
                map.put("formName", "");
            }
            // 性别
                map.put("gender", vo.getGender());
            // 民族
            map.put("ethnicGroups", vo.getEthnicGroups());
                    
            // 年龄
            map.put("age", vo.getAge());
            // 学历
            map.put("eduBg",vo.getEduBg());
            // 婚姻状况
            map.put("maritalStatus", vo.getMaritalStatus());
            // 原户籍地
            map.put("originalResidence", vo.getOriginalResidence());
            // 现户籍地
            map.put("nowResidence", vo.getNowResidence());
            // 身份证
            map.put("idcard", vo.getIdcard());
            // 申请证件类别
            map.put("papersType", vo.getPapersType());
    
            // 联系电话
            map.put("phone", vo.getPhone());
            // 紧急联系人
            if (vo.getLinkMan() != null) {
                map.put("linkMan", vo.getLinkMan());
            } else {
                map.put("linkMan", " ");
            }
            // 联系人电话
            if (vo.getLinkPhone() != null) {
                map.put("linkPhone", vo.getLinkPhone());
            } else {
                map.put("linkPhone", " ");
            }
            // 现住址
            if (vo.getAddress()!= null) {
                map.put("address", vo.getAddress());
            } else {
                map.put("address", " ");
            }
            // 工作单位
            if (vo.getWorkUnit()!= null) {
                map.put("workUnit", vo.getWorkUnit());
            } else {
                map.put("workUnit", " ");
            }
            // 任职情况
            if (vo.getPosition() != null) {
                map.put("position", vo.getPosition());
            } else {
                map.put("position", " ");
            }
            // 迁入时间
            if (vo.getImmigrationTime() != null) {
                map.put("immigrationTime", vo.getImmigrationTime());
            } else {
                map.put("immigrationTime", " ");
            }
            // 迁入原因
            if (vo.getImmigrationCause() != null) {
                map.put("immigrationCause", vo.getImmigrationCause());
            } else {
                map.put("immigrationCause", " ");
            }
            // 出境事由
            if (vo.getExitCause() != null) {
                map.put("exitCause",vo.getExitCause());
            } else {
                map.put("exitCause", " ");
            }
            
            if(status==1){
                //县国保大队
                setXgb(map,vo,path);
            }
            else if(status ==2){
                setXgb(map,vo,path);
                //市国保支队
                setXfk(map,vo,path);
            }else if(status == 3){
                setXgb(map,vo,path);
                setXfk(map,vo,path);
                //市反恐支队
                setSgb(map,vo,path);
            }
            
            
            try {
            
                // 生成文件的路径及文件名。
                File outFile = new File(saveAddress);
    
                Writer out = new BufferedWriter(new OutputStreamWriter(
                        new FileOutputStream(outFile), "UTF-8"));
    
                // 使用FileTemplateLoader
                //选择调用的模板
                String tempname = null ;
                
                if(status==1){
                    tempname = "temp1.xml";
                }else if(status==2){
                    tempname = "temp2.xml";
                }else if(status==3){
                    tempname = "temp3.xml";
                }else if(status==0){
                     tempname = "temp0.xml";
                }
                
                Configuration configuration = new Configuration();  
                configuration.setDefaultEncoding("utf-8");  
                configuration.setClassForTemplateLoading( CreateWord.class,"/com/inquiry/xml"); 
                
                Template t = configuration.getTemplate(tempname, "UTF-8");
                
    
                t.process(map, out);
                out.flush();
                out.close();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        /**
         * 回填县国保大队
         * @param map
         * @param vo
         */
        private static    void setXgb(Map<String, Object> map , WordSetVo vo,String path){
            map.put("xgb", vo.getXgb());
            map.put("xgdc", vo.getXgdc());
            map.put("xgsh", vo.getXgsh());
            map.put("xgdate", vo.getXgdate());
            map.put("xggz", getImageStr(downloadPicture(vo.getXggz(),path)));
            map.put("xgremark", vo.getXgremark());
        }
        
        /**
         * 回填市国保支队
         * @param map
         * @param vo
         */
        private static    void setXfk(Map<String, Object> map , WordSetVo vo,String path){
            map.put("xfb", vo.getXfb());
            map.put("xfdc", vo.getXfdc());
            map.put("xfsh", vo.getXfsh());
            map.put("xfdate", vo.getXfdate());
            map.put("xfgz", getImageStr(downloadPicture(vo.getXfgz(),path)));
            map.put("xfremark", vo.getXfremark());
        }
        
        /**
         * 回填市反恐支队
         * @param map
         * @param vo
         */
        private static   void setSgb(Map<String, Object> map , WordSetVo vo,String path){
            map.put("sgb", vo.getSgb());
            map.put("sgdc", vo.getSgdc());
            map.put("sgsh", vo.getSgsh());
            map.put("sgdate", vo.getSgdate());
            map.put("sggz", getImageStr(downloadPicture(vo.getSggz(),path)));
            map.put("sgremark", vo.getSgremark());
        }
        /** 
         * 传入要下载的图片的url列表,将url所对应的图片下载到本地 
         * @param urlList 
         */  
        public static   String downloadPicture(String urlString,String path) {  
            URL url = null;  
              String imgPath = null;
                try {  
                    url = new URL(path+urlString);  
                    
                     // 打开URL连接  
                    URLConnection con = url.openConnection();  
                     // 得到URL的输入流  
                    InputStream input = con.getInputStream();  
                    // 设置数据缓冲  
                    byte[] bs = new byte[1024 * 2];  
                    // 读取到的数据长度  
                    int len;  
                    // 输出的文件流保存图片至本地  
                     imgPath = createFile()+"/"+urlString.split("/")[urlString.split("/").length-1];
                    OutputStream os = new FileOutputStream(imgPath);  
                    while ((len = input.read(bs)) != -1) {  
                    os.write(bs, 0, len);  
                    }  
                    os.close();  
                    input.close(); 
                    return imgPath;
                    
                } catch (Exception e) {  
                    e.printStackTrace();  
                }
               
            return imgPath;  
        }  
        
        /**
         * 在本地创建文件保存位置
         * @return
         */
        public static  String   createFile(){
            //定义下载文件保存位置
            String  address = "C://inquiry";
            File file = new File(address);
            if (!file.exists()) {
                file.mkdir();
            }
            return address;
        }
    }

    最后就只剩下传数据测试咯,注意一下,图片地址必须给正确,不然会报错哦。

  • 相关阅读:
    转:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 解决方案
    Elementui 导航组件和Vuejs路由结合
    python 在线生成文字云
    TensorFlow创建简单的图片分类系统--机器学习
    kettle maven 配置
    Kettle api 二次开发之 日志的保存
    heatmap for arcgisjsapi
    Spring MVC 使用tomcat中配置的数据源
    点坐标旋转方法
    在servlet中使用Spring注入
  • 原文地址:https://www.cnblogs.com/pretttyboy/p/6282141.html
Copyright © 2011-2022 走看看