java写数据到world文档并导出

发现用freemarker还是挺好用的

第一步、先画好模板

该方法需要先手动创建一个doc模板(图片记得使用占位符),并保存为xml文件。通过动态替换特定标签${}中的内容生成

注意:用我下面写的方法要用world2003,用2007要报错

java写数据到world文档并导出_第1张图片

java写数据到world文档并导出_第2张图片

第二步、上代码(要先引freemarker.jar 包)

/**
* 下载招聘信息
* @param t
*/
@RequestMapping(value = "/downLoadWorld.do")
public String downLoadWorld(ResumeDTO t,HttpServletRequest request) {
DocUtil docUtil=new DocUtil(); //自己创建一个类 
if(t.getUserId()!=null){
ResumeDTO resumeData = readResumeService.readResumebyUserId(t);//查询数据库对象
if(resumeData != null){
Map map = new HashMap();    //保存到map中
        map.put("name", resumeData.getName());    
        map.put("sex", resumeData.getSex()==1?"男":resumeData.getSex()==2?"女":"保密");    
        map.put("createTime", resumeData.getCreateTime()); 
        map.put("id", resumeData.getId());    
        map.put("age", resumeData.getAge());    
        map.put("marital", resumeData.getMaritalStatus()==1?"已婚":"未婚");    
        map.put("education", resumeData.getEducation());    
        map.put("workStatus", resumeData.getWorkStatus());    
        map.put("workYear", resumeData.getWorkYear());    
        map.put("workIntention", resumeData.getWorkIntention()); 
        map.put("ecpectedIndustry", resumeData.getEcpectedIndustry());    
        map.put("ecpectedSalary", resumeData.getEcpectedSalary());    
        map.put("phone", resumeData.getPhone());  
        map.put("email", resumeData.getEmail());    
        map.put("selfEvaluation", resumeData.getSelfEvaluation()); 
        
        String resumeId = resumeData.getResumeId();   //简历ID
        //通过简历id得到工作经历列表
        WorkExperience workexperience = new WorkExperience();
        workexperience.setResumeId(resumeId);
        List listWorkexperience = experienceService.getWorkExperiences(workexperience);
        if(listWorkexperience !=null && listWorkexperience.size()>0){
        map.put("workExperienceList", listWorkexperience); 
        }
        //通过简历id得到教育背景列表
        EducateUndergo educateundergo = new EducateUndergo();
        educateundergo.setResumeId(resumeId);
        List listEducateUndergo = undergoService.getEducateUndergoByresumeId(educateundergo);
        if(listEducateUndergo !=null && listEducateUndergo.size()>0){
        map.put("listEducateUndergo", listEducateUndergo); 

        }

                                 //这个路径是生成world文档的路径

        String srcPath = "F:\\temp\\"+resumeData.getName()+t.getUserId()+"简历.doc"; 
        //模板简历存放路径 (也就是把生成的那个简历模板.xml放到路径F:\temp下)
        docUtil.createDoc(map, "简历模板", srcPath);                   
        
        InputStream fin = null;  
        OutputStream out = null; 
        File file = new File("F:\\temp\\"+resumeData.getName()+t.getUserId()+"简历.doc");
        try {  
            fin  =  new BufferedInputStream(new FileInputStream(file));
            // 清空response  
            //response.reset();  
            String fileName = resumeData.getName() +t.getUserId()+ "简历.doc";  
            response.setCharacterEncoding("utf-8");  
            response.setContentType("application/msword");  
            // 设置浏览器以下载的方式处理该文件名  
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "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 (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {  
            if(fin != null)
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}  
            if(out != null)
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}  
        } 
}else{
//write(false,"102"); //改用户微简历为空
}
}else{
//write(false,"101"); //没有改用户id
}
//write(true,"110");
return null;

}


public class DocUtil {
public Configuration configure=null;    
    public DocUtil(){
        configure=new Configuration();
        configure.setDefaultEncoding("utf-8");
    }
/**
     * 根据Doc模板生成word文件
     * @param dataMap 需要填入模板的数据
     * @param downloadType 文件名称
     * @param savePath 保存路径
     */
    public  void createDoc(Map dataMap,String downloadType,String savePath){
    File outFile= null;
        try {
            //加载需要装填的模板
            Template template=null;
            //设置模板装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载。
            //加载模板文件,放在F\temp下
            configure.setDirectoryForTemplateLoading(new File("F:\\temp"));
            //设置对象包装器
//             configure.setObjectWrapper(new DefaultObjectWrapper());
            //设置异常处理器
            configure.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
            //定义Template对象,注意模板类型名字与downloadType要一致
            template=configure.getTemplate(downloadType+".xml");
            outFile=new File(savePath);
            Writer out=null;
            out=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"),1024);
            template.process(dataMap, out);
            out.flush();
            out.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public 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 (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder=new BASE64Encoder();
        return encoder.encode(data);
    }

}

最后就是打开那个生成的xml文件,你就可以用freemarker语法进行修改了。



你可能感兴趣的:(Spring-MVC)