`

利用freemarker实现word导出

    博客分类:
  • java
阅读更多

刚过完年,公司在年前有个需求需要在后台管理端实现word导出与pdf导出,在年前就开始查看资料怎么去写word导出,大部分都是用itext来实现,这次word导出我是用freemarker来实现,麻烦点可能是在需要将其将其文档改成xml然后在改成ftl文件。如果不懂ftl文件语法请去看freemarker语法。这里就不再说了。程序用的是maven  ,导入freemarkerjar包

 

  <dependency>
		    <groupId>org.freemarker</groupId>
		    <artifactId>freemarker</artifactId>
		    <version>2.3.20</version>
		</dependency>

 因为程序是在公司的程序中没有拆出来就手写下文档构造不截图了

 ftl文件是放在了webapp下的WEB-INF/views/ftl下

图片是存放在webapp下的images中 

这里的路径是为了方便找文件图片为什么没有放在views下是因为有在做pdf时需要用到,那里需要用到这里的链接访问图片.

因为程序是web端的。路径直接获取的绝对路径

访问程序为

@RequestMapping(value="download",method={RequestMethod.GET,RequestMethod.POST})
public void exportWord( HttpServletRequest request, HttpServletResponse response) throws Exception {
		Map<String,Object>  dateMap=new HashMap<String,Object>();
		dateMap.put("title","个人简历");
		dateMap.put("userName","xueyucheng");
		dateMap.put("userSex","man");
		dateMap.put("userAge","17");
		dateMap.put("height","161");
		dateMap.put("address","handan");
		dateMap.put("University","ligong");
		dateMap.put("skill","jineng");
		dateMap.put("content","asdasasd");
		String ftlName="test.ftl";
		String imageName="1.jpg";
		try { //这里是获得数据 然后在客户端中实现下载,当然如果指定位置下载也可以实现下面的那个方法
			ByteArrayOutputStream bos=	WordUtil.createWord(dateMap, ftlName, request,imageName);/**字节*/
			WordUtil.renderWord(response, bos.toByteArray(), "123");
		} catch (Exception e) {
			logger.error("word导出出错......",e);	
		}
		
	 }

 word导出做成工具类了,直接从工具类中调用

 

public class WordUtil {  

/**
	 * 根据模板创建word
	 * @auther fengruiqi
	 * 2017年2月4日  下午10:46:09
	 * @param dataMap  需要展示的数据
	 * @param templateName  word模板的名称 比如:test.ftl
	 * @param imageName 图片的名称
	 * 
	 */
	public static ByteArrayOutputStream createWord(Map dataMap,String templateName,HttpServletRequest request,String imageName)  throws Exception{
		String basePath = request.getSession().getServletContext().getRealPath("/");//绝对路径  
		//创建配置实例 
		Configuration configuration = new Configuration();
		
		//设置编码
		configuration.setDefaultEncoding("UTF-8");
       try {
           
           //ftl模板文件统一放至 资源文件ftl下面 包下面
           configuration.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/views/ftl/"));  
           
           //获取模板 
           Template template = configuration.getTemplate(templateName);
           template.setEncoding("utf-8");
         
           if(imageName!=null && !imageName.equals("")){
        	   /** 图片路径 **/
               String imagePath =basePath+"/images/"+imageName;
               /** 将图片转化为**/
               InputStream in = null;
               byte[] data = null;
               try {
                   in = new FileInputStream(imagePath);
                   data = new byte[in.available()];
                   in.read(data);
                   in.close();
               } catch (Exception e) {
            	   throw new Exception(e);
               }finally {
                   if(in != null){
                       in.close();
                   }
               }
               /** 进行base64位编码 **/
               BASE64Encoder encoder = new BASE64Encoder();
               /** 图片数据       **/
               dataMap.put("image",encoder.encode(data));
           }
          
       /*    //输出文件
           File outFile = new File(filePath+File.separator+fileName);
           
           //如果输出目标文件夹不存在,则创建
           if (!outFile.getParentFile().exists()){
               outFile.getParentFile().mkdirs();
           }*/
           
           //将模板和数据模型合并生成文件 
          // Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
           Writer out = new StringWriter();  
           //生成文件
           template.process(dataMap, out);
           String str = out.toString();  
           ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
           //关闭流
           baos.write(str.getBytes());
           out.flush();
           out.close();
           baos.close();
           return baos;
       } catch (Exception e) {
    	   throw new Exception(e);  
       }
    
   }
	/**
	 * 处理包含多个图片的word问题
	 * @author  fengruiqi
	 * 创建时间 2017年2月6日 下午3:25:59
	 * @param dataMap  要插入的数据
	 * @param templateName  ftl名字
	 * @param request
	 * @param imageName  图片组合昵称
	 * @return
	 * @throws Exception
	 */
	public static ByteArrayOutputStream createWordContinManyPicture(Map dataMap,String templateName,HttpServletRequest request,List<String> imageName)  throws Exception{
		String basePath = request.getSession().getServletContext().getRealPath("/");//绝对路径  
		//创建配置实例 
		Configuration configuration = new Configuration();
		
		//设置编码
		configuration.setDefaultEncoding("UTF-8");
       try {
           
           //ftl模板文件统一放至 资源文件ftl下面 包下面
           configuration.setDirectoryForTemplateLoading(new File(basePath + "/WEB-INF/views/ftl/"));  
           
           //获取模板 
           Template template = configuration.getTemplate(templateName);
           template.setEncoding("utf-8");
           for(String image :imageName){
        	   if(image!=null && !image.equals("")){
            	   /** 图片路径 **/
                   String imagePath =basePath+"/images/"+image;
                   /** 将图片转化为**/
                   InputStream in = null;
                   byte[] data = null;
                   try {
                       in = new FileInputStream(imagePath);
                       data = new byte[in.available()];
                       in.read(data);
                       in.close();
                   } catch (Exception e) {
                	   throw new Exception(e);
                   }finally {
                       if(in != null){
                           in.close();
                       }
                   }
                   /** 进行base64位编码 **/
                   BASE64Encoder encoder = new BASE64Encoder();
                   /** 用图片的名称作为存储图片数据的名称   在页面时应该与改名字对应**/
                   if(image.toLowerCase().contains(".jpg") ){
                	   image=StringUtils.remove(image, ".jpg");
                	   dataMap.put(image,encoder.encode(data));
                   }else if(image.toLowerCase().contains(".png")){
                	   image=StringUtils.remove(image, ".png");
                	   dataMap.put(image,encoder.encode(data));
                   }
                 
               }
           }
          
          
       /*    //输出文件
           File outFile = new File(filePath+File.separator+fileName);
           
           //如果输出目标文件夹不存在,则创建
           if (!outFile.getParentFile().exists()){
               outFile.getParentFile().mkdirs();
           }*/
           
           //将模板和数据模型合并生成文件 
          // Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
           Writer out = new StringWriter();  
           //生成文件
           template.process(dataMap, out);
           String str = out.toString();  
           ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
           //关闭流
           baos.write(str.getBytes());
           out.flush();
           out.close();
           baos.close();
           return baos;
       } catch (Exception e) {
    	   throw new Exception(e);  
       }
	}
	
	
	
	/**
	 * 客户端下载word
	 * @author  fengruiqi
	 * 创建时间 2017年2月5日 上午1:10:38
	 * @param response
	 * @param bytes
	 * @param filename
	 */
    public static void renderWord(HttpServletResponse response, final byte[] bytes, final String filename) {  
      /*  initResponseHeader(response, PDF_TYPE);  */
        setFileDownloadHeader(response, filename);  
        if (null != bytes) {  
            try {  
                response.getOutputStream().write(bytes);  
                response.getOutputStream().flush();  
            } catch (IOException e) {  
                throw new IllegalArgumentException(e);  
            }  
        }  
    }  
    /**
     *  设置让浏览器弹出下载对话框的Header
     * @author  fengruiqi
     * 创建时间 2017年2月4日 下午6:58:44
     * @param response
     * @param fileName
     * @param fileType
     */
    public static void setFileDownloadHeader(HttpServletResponse response, String fileName) {  
        try {  
            // 中文文件名支持  
            String encodedfileName = new String(fileName.getBytes("GBK"), "ISO8859-1");   
            response.setContentType("application/msword");
            response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + "\"");  
        } catch (UnsupportedEncodingException e) {  
        }  
    }  
}

 解释下上面那个带多个图片的word导出与导出一个图片的方法其实可以用一个只不过前面的需要将其改成list

当时是没有考虑到多个图片的问题才这样做。多个图片那里处理用的图片的名字生成的图片内容填充到静态模板中。如果有其他好的方法大家一起交流下。在程序中可以指定位置存储或者用浏览器客户端下载保存,看自己的需求了。或者两个方式都可以采用。注意注释的部分。

word导出的难点可能就是在freemarker那里吧其他文件需求还不清楚。所以就导出功能就先做到这里有不清楚的可以交流qq963633167

 


 

0
0
分享到:
评论

相关推荐

    Java项目中利用Freemarker模板引擎导出--生成Word文档

    在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring Boot 之类的 ————————————— Spring Boot,Freemarker 编辑好格式的Word文档 1份 将Word文档里需要填充的地方...

    java利用FreeMarker导出word

    Java利用FreeMarker导出Word是一项常见的技术需求,尤其在企业级应用中,常常需要将动态数据生成为Word文档,例如报告、合同等。FreeMarker是一个模板引擎,它能将Java对象的数据绑定到模板上,生成HTML、XML或者如...

    使用FreeMarker实现导出word实例

    在本例中,我们将探讨如何利用FreeMarker来实现Word文档的导出。FreeMarker的工作原理是,它将数据模型与模板结合,生成最终的输出文档。在Java应用中,这通常涉及创建一个FreeMarker配置对象,加载模板文件,设置...

    freemarker模板导出word循环图片表格源码和详细教程

    在本教程中,我们将探讨如何利用Freemarker模板来导出Word文档,并实现循环插入图片和表格的功能。这对于需要批量生成定制化报告或者文档的应用场景非常有用。 首先,我们需要了解Freemarker的基本语法。在...

    freemarker 导出word表格

    在本场景中,我们讨论的是如何利用FreeMarker来导出Word表格。这个过程通常涉及到以下步骤: 1. **创建Word模板**: 首先,你需要使用Microsoft Word创建所需的表格和格式。Word允许用户设计丰富的布局,包括...

    Java 用Freemarker导出word文档总结

    在Java中利用FreeMarker导出Word文档,可以极大地提高代码的可维护性和灵活性。 首先,我们需要了解FreeMarker的基础知识。FreeMarker是一个基于模板的视图技术,它将数据模型和视图模板分离,使得开发者可以专注于...

    java利用freemarker生成word.pdf

    Java 利用 Freemarker 生成 Word.pdf,这个标题告诉我们,我们将使用 Java 语言和 Freemarker 库来生成 Word 文档,并将其导出为 PDF 文件。 描述解释 在描述中,我们可以看到,整个过程可以分为三步:首先,我们...

    生成WORD freemarker导出WORD

    总结来说,“生成WORD freemarker导出WORD”项目提供了一种利用FreeMarker模板和Apache POI库生成Word文档的方法,解决了在实际开发中遇到的难题。通过学习和实践这个项目,开发者可以掌握动态生成Word文档的技术,...

    freeMarker导出word两种方式最全代码样例.rar

    FreeMarker 是一个强大的模板引擎,常用于Java应用中生成动态内容,如HTML、XML或Word文档。...通过学习和运行这些样例,你可以更好地理解和掌握FreeMarker导出Word的具体步骤和技巧,从而在自己的项目中灵活运用。

    基于jacob和freeMarker的word导出参考文件

    在提供的压缩包文件中,"基于freeMarker和jacob的word导出参考文件"可能包含了示例模板、Java代码示例以及可能的测试数据,可以帮助你更好地理解和实践这个过程。通过学习和理解这些文件,你可以快速上手并应用到...

    利用freemarker导出word 小例子方便新手学习

    在这个"利用FreeMarker导出Word小例子"中,我们将探讨如何使用FreeMarker来创建Word文档,这对于新手来说是一次很好的学习机会。 1. **FreeMarker基础知识**: - FreeMarker是一个基于模板的生成器,主要用在Web...

    freemarker 导出word

    在Java开发中,FreeMarker被广泛应用于生成Word文档,这使得开发者能够利用模板来快速生成结构化的文档,尤其适用于批量报告或者自定义格式的文档输出。 在"freemarker 导出word"这个场景下,我们可以探讨以下核心...

    freemarker导出word

    本话题主要探讨如何借助Freemarker技术来实现Word文档的导出,并结合生成二维码图片以及批量生成Word文档的方法。 首先,让我们深入理解Freemarker的工作原理。Freemarker是一个基于模板的语言,它与Java代码分离,...

    一个freemarker导出word的通用包

    总之,这个"freemarker导出word的通用包"为Java开发者提供了一个方便的工具,通过FreeMarker模板和Apache POI,可以轻松地将数据导出为Word格式,适用于报表生成、数据导出等多种场景。在实际使用过程中,可以根据...

    freemarker-2.3.30模板word导出.zip

    此“freemarker-2.3.30模板word导出.zip”压缩包提供了使用Freemarker 2.3.30版本将数据导出为Word文档的功能。以下是对这一主题的详细解释: 1. **Freemarker模板语言**: Freemarker是一种基于模板的语言,它...

    POI读取excel,利用Freemarker建立word模板(带图片),生成word文档,再合并成一个word文档(源码)

    Java语言利用POI读取excel文档,利用Freemarker建立word模板(带图片),excel每一行数据生成单个word文档,再利用POI合并成一个word文档(源码); 博客地址:...

    Java实现用Freemarker完美导出word文档(带图片)

    Java实现用Freemarker完美导出word文档(带图片) 以下是Java实现用Freemarker完美导出word文档(带图片)的知识点: 1. Freemarker模板引擎:Freemarker是一个基于Java的模板引擎,能够将数据填充到模板中,从而...

    用Freemarker生成word文档

    通过上述步骤,我们可以利用Freemarker模板引擎结合Java编程语言,轻松地生成带有特定数据填充和图片的Word文档。这种方法极大地提高了文档生成的效率和灵活性,适用于各种需要批量生成标准化文档的场景。同时,这种...

Global site tag (gtag.js) - Google Analytics