精华内容
下载资源
问答
  • FreeMarker导出word

    2016-08-01 09:58:04
    FreeMarker导出word
  • freemarker 导出word

    2017-08-10 17:46:02
    freemarker 导出word 的源码
  • freemarker 生成word

    2016-12-12 13:03:25
    freemarker 生成word
  • freemarker导出word

    2019-10-21 15:31:03
    生成二维码图片. 使用word模板批量生成word. 使用freemarker的list遍历数据。
  • Freemarker导出word

    2021-01-12 09:39:07
    Freemarker导出word 1、制作模板 将模板.doc/.docx文件另存为.xml文件,修改.xml为.ftl文件。在idea或其他开发工具中格式化.ftl文件。 2、java后台配置数据Map<key,value>的形式。 3、调整模板,需要填充内容...

    Freemarker导出word

    1、制作模板
    将模板.doc/.docx文件另存为.xml文件,修改.xml为.ftl文件。在idea或其他开发工具中格式化.ftl文件。
    2、java后台配置数据Map<key,value>的形式。
    3、调整模板,需要填充内容的部分用${key}代替(value值将被填充),部分数据课程会被分成多块,需要删除多余的模板节点。

    后台数据

    Configuration configuration = new Configuration(VERSION_2_3_30);
    configuration.setDefaultEncoding("UTF-8");
    //此处指向的是resource文件夹下的路径
    configuration.setClassForTemplateLoading(Test.class, "/");
    try{
    	Template template = configuration.getTmplate("template.ftl");
    	Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(),"UTF-8"));
    	//filename为传递参数
    	String fileName = URLEncoder.encode(filename, "UTF-8");
    	String userAgent = request.getHeader("User-agent");
    	response.reset();
    	response.setContentType("application/msword;charset=UTF-8");
    	response.setHeader("Content-disposition", StringUtils.contains(userAgent, "Firefox) ? ("attachment;filename*=utf-8''"+fileName):("attachment;filename=" + fileName));
    	Map dataMap = new HashMap();
    	dataMap.put("test","test");
    	template.process(dataMap, out);
    	out.flush();
    	out.close();
    }catch (Exception e){
    	e.printStackTrace();
    }
    

    FreeMarker导出表格数据

    表格数据需要根据条件遍历,需要在<w:tr></w:tr>外层包裹<#list></#list>。
    示例:
    <#list data as dd>
    <w:tr>
    <w:r>
    <w:t>${dd.key}</w:t>
    </w:r>
    </w:tr>
    </#list>

    Freemarker导出Echarts图表(echarts图表内容不全的问题解决)

    1、制作存放图片的word模板,后缀改成.ftl;
    2、将pkg:binaryData模板图片</pkg:binaryData>改成pkg:binaryData${echartsImg}</pkg:binaryData>
    3、通过点击页面的导出word按钮,获取word文件。
    4、echarts图表内容不全的问题解决:
    var myEchart = echarts.init(document.getEllementById(‘a’));
    将myEchart定义成全局变量,在点击导出word时传递参数myEchart.getDataURL();
    然后后台解析(String echartsImg = myEchart.getDataURL().split(’,’)[1]😉

    展开全文
  • Java用freemarker导出word例子详见我的博客 Java用freemarker导出word例子详见我的博客
  • Freemarker 导出word

    2020-05-22 17:22:08
    需求: Java 实现 Word 导出功能 准备 Freemarker 的 .ftl 模板文件 ① 先编写好 Word 模板 ② 编写实体类 根据需要导出Word 模板编写对应的实体类。 public class TaskNotice{ private Integer id; ...


    准备 Freemarker 的 .ftl 模板文件

    ① 先编写好 Word 模板

    taskNotice

    ② 编写实体类

    根据需要导出的 Word 模板编写对应的实体类。

    public class TaskNotice{
        private Integer id;
    
        private Integer projectId;
    
        private String number;
    
        private String projectName;
    	
    	//省略.....
    }
    
    ③ 将实体类中的属性填写到对应的位置。

    比如:项目名称后面填写projectName。
    taskNoticeParam

    ④ 另存为 XML 格式,并修改属性。修改完成后将文件尾缀修改为 .ftl

    注意:另存为 Word XML 文档(.xml) 格式,不要存 Word 2003 XML 文档(.xml) 或其它格式的 XML。
    接下来就是在 xml 中找到我们第二步填写的那些参数,并将那些参数用占位符 ${参数} 替换掉。
    保存,修改文件名尾缀为ftl。

    Freemarker 模板设置常见问题
    • 日期问题
      解决方法有很多,介绍一个常用的。
      将参数 ${endTime} 中的变量名后面添加 ?string('你指定的日期格式') ,例:${endTime?string('yyy-MM-dd')}
      Freemarker文档说明: 日期格式处理.

    • 空值问题
      解决方法一:
      将参数 ${user} 中的变量名后面添加一个 !和默认值。例: ${user!"匿名用户"} ,此时如果参数 user 传入为 null 时,将会显示 “匿名用户”。
      解决方法二:
      使用 if 指令。例:<#if user??>${user}</#if> ,此时如果参数 user 传入为 null 时,将什么都不显示。
      Freemarker文档说明: 处理不存在的变量.

    导出 word 带图片(比如加印章)

           步骤如上,同样是先把印章插入到 word 预定位置,然后另存为 xml 文件,然后用占位符 ${参数} 替换掉 xml 中被编码成 base64 字符串的图片,保存,修改文件尾缀为 .ftl 即可。

    插入印章
    编码后的word

    至此,Freemarker模板文件准备完毕。


    java代码实现下载

    pom.xml
        <!-- 引入freeMarker的依赖包. -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
    
    exportTaskNotice方法
    @RestController
    @RequestMapping(value = "/export",produces = "application/json;charset=utf-8")
    public class ExportController{
    	
        @Autowired
        private TaskNoticeService taskNoticeService;
        
        @Autowired
        private ZipUtils zipUtils;
    	
       // 导出任务通知单
       @PostMapping("/exportTaskNotice")
       public String exportTaskNotice(HttpServletResponse response, @RequestParam(value = "id")Integer[] id) {
           try {
               String ftlname = "taskNotice.ftl";
               String filenamePrefix = "福建省台湾县生产任务通知单";
               //HACK
               List<TaskNotice> list = new ArrayList<>();
               for (Integer taskNoticeId : id) {
                   TaskNotice taskNotice;
                   try {
                       taskNotice= taskNoticeService.select(taskNoticeId );
                   } catch (Exception e) {
                       e.printStackTrace();
                       return "操作失败!";
                   }
                   if (taskNotice != null) {
                       list.add(taskNotice);
                   }
               }
               if(list.size() < 1){
                   return "操作失败!";
               }
               exportWordUtil(response, ftlname, filenamePrefix, list);
               return "操作成功!";
           } catch (Exception e) {
               e.printStackTrace();
               return "操作失败!";
           }
       }
    }
    
    exportWordUtil 方法
        /**
         * 提取公共代码 简化代码
         * @param response response
         * @param ftlName ftlName
         * @param filenamePrefix 存储文件名前缀
         * @param list list——根据id查询出的表单数据实体类的集合
         * @param <T> 泛型
         * @throws Exception 异常
         */
        private <T> void exportWordUtil(HttpServletResponse response, String ftlName, String filenamePrefix, List<T> list) throws Exception{
            //Configuration 用于读取ftl文件
            Configuration configuration = new Configuration(new Version("2.3.0"));
            configuration.setDefaultEncoding("utf-8");
            //路径分隔符修改 TODO 这里使用类加载器获取 ftl 文件路径(根据自己实际的文件位置来获取)
            String path = StringUtils.replace(ExportController.class.getClassLoader().getResource("word-model"+File.separator+ftlName).getPath(),"%5c",File.separator);
            path = StringUtils.substring(path,1,path.length()-ftlName.length()-1);
    
            //得到临时文件存放路径
            String tempPath = path+File.separator+"temp";
    
    
            /**
            * 以下是三种指定ftl文件所在目录路径的方式
            * 指定ftl文件所在目录的路径,而不是ftl文件的路径
            */
            //指定路径的第一种方式(适合加载Jar包内的资源)
    //        configuration.setClassForTemplateLoading(this.getClass(), basePackagePath);
    //        configuration.setClassLoaderForTemplateLoading(classLoader, basePackagePath);
    
            //指定路径的第二种方式(适合加载文件路径)
            configuration.setDirectoryForTemplateLoading(new File(path));
    
            //指定路径的第三种方式(基于Servlet Context,指的是基于WebRoot下的template下的framemaker.ftl文件)
    //        configuration.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/word-model");
    
    
            //以utf-8的编码读取ftl文件
            Template template = configuration.getTemplate(ftlName);
    
            if(list.size()==1){//单个直接下载
                String saveName = null;
                //根据不同的实体类型去获取其存储名saveName TODO 根据实际情况修改下列关于saveName的代码
                if(list.get(0) instanceof TaskNotice){
                    saveName = "《"+filenamePrefix+"》"+".doc";
                }
                //if(list.get(0) instanceof QualityTrackingCardVO){
                //    saveName = "《"+filenamePrefix+"-"+((QualityTrackingCardVO) list.get(0)).getName()+"》"+".doc";
                //}
    
                //输出文档路径及名称
                ServletOutputStream outputStream = null;
                BufferedWriter bufferedWriter = null;
                try {
                    //设置输出流
                    response.reset();
                    response.setContentType("application/msword");
                    response.setCharacterEncoding("utf-8");
                    response.addHeader("Content-Disposition" ,"attachment;filename=" + URLEncoder.encode(saveName,"utf-8"));
                    outputStream = response.getOutputStream();
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
                    template.process(list.get(0), bufferedWriter);
                } finally {
                    if(bufferedWriter!=null){
                        bufferedWriter.flush();
                        bufferedWriter.close();
                    }
                    if(outputStream!=null){
                        outputStream.flush();
                        outputStream.close();
                    }
                }
            }else if(list.size() > 1) {//多个压缩后返回zip文件
                //创建临时资源文件夹 和 zip文件全路径
                String tempFolderPath = tempPath + File.separator + "temp-word-folder";
                String tempZipFilePath = tempPath + File.separator + filenamePrefix + "Batch.zip";
                File file = new File(tempFolderPath);
                if(!file.exists()){//创建临时文件夹
                    file.mkdirs();
                }
                //批量生成word
                for (Object entity : list) {
                    String saveName = null;
                    //TODO 这里的saveName可能会重复,到时候问清楚
                    //根据不同的实体类型去获取其存储名 saveName  TODO 根据实际情况修改下列获取 saveName 的代码
                    if(entity instanceof TaskNotice){
                        saveName = "《"+filenamePrefix+"-"+((TaskNotice) entity).getId()+"》"+".doc";
                    }
                    //if(entity instanceof QualityTrackingCardVO){
                    //    saveName = "《"+filenamePrefix+"-"+((QualityTrackingCardVO) entity).getName()+"》"+".doc";
                    //}
    
                    FileOutputStream fileOutputStream = null;
                    BufferedWriter bufferedWriter = null;
                    try {
                        fileOutputStream = new FileOutputStream(tempFolderPath + File.separator + saveName);
                        bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream,"UTF-8"));
                        template.process(entity, bufferedWriter);
                    }finally {
                        if(bufferedWriter != null){
                            bufferedWriter.close();
                        }
                        if(fileOutputStream != null){
                            fileOutputStream.close();
                        }
                    }
                }
                //打包成zip
                zipUtils.createZip(tempFolderPath,tempZipFilePath);
                //返回输出流
                ServletOutputStream outputStream = null;
                FileInputStream fileInputStream = null;
                try {
                    fileInputStream = new FileInputStream(tempZipFilePath);
                    //设置输出流
                    response.reset();
                    response.setContentType("application/x-download");
                    response.setCharacterEncoding("utf-8");
                    response.addHeader("Content-Disposition" ,"attachment;filename=" + URLEncoder.encode(filenamePrefix + "Batch.zip","utf-8"));
                    outputStream = response.getOutputStream();
                    byte[] buffer = new byte[1024];
                    int len = 0;
                    while ((len = fileInputStream.read(buffer)) != -1) {
                        outputStream.write(buffer,0,len);
                    }
                } finally {//关闭流
                    if(outputStream != null){
                        outputStream.flush();
                        outputStream.close();
                    }
                    if(fileInputStream != null){
                        fileInputStream.close();
                    }
                    zipUtils.deleteFile(new File(tempPath));//删除临时文件夹
                }
            }
        }
    
    
    zipUtils 方法

    链接: ZipUtils

    展开全文
  • FreeMarker导出Word

    千次阅读 2018-08-13 14:32:22
    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML...这里介绍如何将生成word保存到本地,以及从浏览器导出word下载。 1.首先下载freemarker包https://freemarker.apache.o...

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件配置文件源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

    这里介绍如何将生成的word保存到本地,以及从浏览器导出word下载。

    1.首先下载freemarker包https://freemarker.apache.org/freemarkerdownload.html >>>>>freemarker.jar,BuildPath到项目中。

    2.新建一个word文档test.doc,将模板内容替换成变量,这里变量要一次性写完如${name}。

    注意:如果变量和符号没有一次性写完,例如先写${},再统一加上变量名,这时当你打开xml的时候"${name}"的“$” “{}” “name”就会分开,导出时会出错。建议先把整个${name} ${sex}...写在txt中再copy进来。

    3.将test.doc另存为xml                                                           

     

    4.用Notepad++打开test.xml,Ctrl+F 搜索$, 检查变量和符号是否正常,变量后面可以都加上?if_exists用于判空。

    5.然后将test.xml的后缀名改成ftl,即test.ftl模板,将模板放到项目中去。

    6.定义一个处理类DocumentHandler,该类包含两个导出方法

    package cn.hpc.ssm.common;
    import java.io.BufferedWriter;  
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    
    import java.io.File;  
      
    import java.io.FileOutputStream;  
      
    import java.io.IOException;  
      
    import java.io.OutputStreamWriter;  
      
    import java.io.Writer;  
      
    import java.util.HashMap;  
      
    import java.util.Map;  
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    
      
       
      
    import freemarker.template.Configuration;  
      
    import freemarker.template.Template;  
      
    import freemarker.template.TemplateException;  
    
    public class DocumentHandler {  
      
    	//Configuration存储一些全局常量和常用设置
       private Configuration configuration = null;  
      
       //构造函数生成实例并设置编码
       public DocumentHandler() {
          configuration = new Configuration();  
          configuration.setDefaultEncoding("utf-8");  
       }
      
       
      /**
       * 导出word文档,导出到本地
       * @param tempName,要使用的模板
       * @param docName,导出文档名称
       * @param dataMap,模板中变量数据
       * @param outFile,输出文档路径
       */
       public boolean exportDoc(String tempName,Map<?, ?> dataMap,File outFile) {  
    	   boolean status = false;
      
          // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,  
          configuration.setClassForTemplateLoading(this.getClass(), "/cn/hpc/ssm/template");  
      
          Template t = null;  
      
          try{  
             // tempName.ftl为要装载的模板  
             t = configuration.getTemplate(tempName+".ftl");  
             t.setEncoding("utf-8");  
          } catch (IOException e) {
             e.printStackTrace();  
          }
      
          Writer out = null;  
          try{  
             out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
             status = true;
          }catch(Exception e1) {  
             e1.printStackTrace();  
          }  
      
          try{  
             t.process(dataMap, out);  
             out.close();  
          }catch(TemplateException e){  
             e.printStackTrace();  
          } catch (IOException e) {  
             e.printStackTrace();  
          }  
      
          return status;
       }  
      
       /**
        * 导出word文档,响应到请求端
        * @param tempName,要使用的模板
        * @param docName,导出文档名称
        * @param dataMap,模板中变量数据
        * @param resp,HttpServletResponse
        */
    	public boolean exportDoc(String tempName, String docName, Map<?, ?> dataMap, HttpServletResponse resp) {
    		boolean status = false;
    		ServletOutputStream sos = null;
    		InputStream fin = null;
    		if (resp != null) {
    			resp.reset();
    		}
    
    		// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载。参数2为模板路径
    		configuration.setClassForTemplateLoading(this.getClass(), "/cn/hpc/ssm/template");
    
    		Template t = null;
    
    		try {
    			// tempName.ftl为要装载的模板
    			t = configuration.getTemplate(tempName + ".ftl");
    			t.setEncoding("utf-8");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		// 输出文档路径及名称 ,以临时文件的形式导出服务器,再进行下载
    		String name = "temp" + (int) (Math.random() * 100000) + ".doc";
    		File outFile = new File(name);
    
    		Writer out = null;
    		try {
    			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
    			status = true;
    		} catch (Exception e1) {
    			e1.printStackTrace();
    		}
    
    		try {
    			t.process(dataMap, out);
    			out.close();
    		} catch (TemplateException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		try {
    			fin = new FileInputStream(outFile);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    		// 文档下载
    		resp.setCharacterEncoding("utf-8");
    		resp.setContentType("application/msword");
    		try {
    			docName = new String(docName.getBytes("UTF-8"), "ISO-8859-1");
    		} catch (UnsupportedEncodingException e1) {
    			e1.printStackTrace();
    		}
    		resp.setHeader("Content-disposition", "attachment;filename=" + docName + ".doc");
    		try {
    			sos = resp.getOutputStream();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		byte[] buffer = new byte[512]; // 缓冲区
    		int bytesToRead = -1;
    		// 通过循环将读入的Word文件的内容输出到浏览器中
    		try {
    			while ((bytesToRead = fin.read(buffer)) != -1) {
    				sos.write(buffer, 0, bytesToRead);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			if (fin != null)
    				try {
    					fin.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			if (sos != null)
    				try {
    					sos.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			if (outFile != null)
    				outFile.delete(); // 删除临时文件
    		}
    
    		return status;
    	}
       
    }
    

    代码中的“/cn/hpc/ssm/template”是存放模板的包路径

    7.添加Junit测试方法,右键 Run As >>> Junit Test

        //导出到本地    
        @Test
    	public void exportWordTest1(){
    		
    		File file =new File("d:\\test.doc");
    		if(!file.exists())
    			try {
    				file.createNewFile();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		Map<String, Object> map =new HashMap<>();
    		//这里的键要对应模板中的变量
    		map.put("name", "李相赫");
    		map.put("sex", "男");
    		map.put("native", "广东");
    		map.put("birthday", "2018-8-13");
    		map.put("ecducation", "本科");
    		map.put("political", "党员");
    		map.put("university", "广东科学技术职业学院");
    		map.put("major", "物联网应用技术");
    		map.put("email", "lixianghe@163.com");
    		map.put("phone", "18825455689");
    		map.put("qq", "1044558545");
    		System.out.println(map.toString());
    		
    //		test t =new test();
    //		t.setBirthday("2018-8-13");
    //		t.setEducation("本科");
    //		t.setEmail("lixianghe@163.com");
    //		t.setNative("广东1");
    //		t.setMajor("物联网应用技术");
    //		t.setName("李相赫");
    //		t.setPhone("18825455689");
    //		t.setPolitical("党员");
    //		t.setQq("1044558545");
    //		t.setSex("男");
    //		t.setUniversity("广东科学技术职业学院");
    //		Map<String, Object> maps =Utils.object2Map(t);
    //		System.out.println(maps.toString());
    		
    		boolean b =new DocumentHandler().exportDoc("test", map, file);
    		System.out.println(b);
    	}

    运行结果,D盘目录多了test.doc,打开

    9.测试浏览器端请求的方法,添加一个springmvc的接口方法

    @RequestMapping(value="/exportWord.action")
    	public void exportWordTest(HttpServletRequest req, HttpServletResponse resp){
    		System.out.println("使用freemark导出Word");
    		Map<String, Object> map =new HashMap<>();
    		map.put("name", "李相赫");
    		map.put("sex", "男");
    		map.put("native", "广东");
    		map.put("birthday", "2018-8-13");
    		map.put("ecducation", "本科");
    		map.put("political", "党员");
    		map.put("university", "广东科学技术职业学院");
    		map.put("major", "物联网应用技术");
    		map.put("email", "lixianghe@163.com");
    		map.put("phone", "18825455689");
    		map.put("qq", "1044558545");
    		boolean b =new DocumentHandler().exportDoc("test", "个人信息", map, resp);
    		System.out.println(b);
    	}

     10.浏览器发出请求

     下载到桌面打开可以看到相同的内容

    2019年9月27日09:33:19 新增

    注意事项:在word另存为xml时,要保存为word2003.xml文档,这样的模板可以兼容wps与office

     tips.

    在编辑xml文件时,可以使用在线代码格式化工具,格式化完的代码更容易看清楚结构,减少出错几率

     

    展开全文
  • freemarker导出word

    2017-06-29 14:06:32
    freemarker导出word(网上看到的)
  • 本篇文章主要介绍了Java用freemarker导出word实用示例,使用freemarker的模板来实现功能,有需要的可以了解一下。
  • 生成WORD freemarker导出WORD

    热门讨论 2011-12-12 21:11:14
    网上找了很多有关生成WORD的例子都不能直接使用,所以自己就综合弄了一下现把项目传上来方便大家下载学习。切记项目是UTF-8编码的用的编码格式会乱码哦。。。
  • freemarker生成word

    2019-08-09 01:00:37
    NULL 博文链接:https://tablemiao.iteye.com/blog/2173187
  • Java用freemarker导出word文档
  • FreeMarker生成word

    2014-12-01 23:13:00
    FreeMarker生成word数据填充是通过,Map填充。 Map dataMap = new HashMap<String, Object>(); List<User> list=new List<User>(); dataMap.put("title", "测试"); dataMap.put("listUser",...

    FreeMarker生成word数据填充是通过,Map填充。

    Map dataMap = new HashMap<String, Object>();

    List<User> list=new List<User>();

    dataMap.put("title", "测试");

    dataMap.put("listUser",list);

    步骤1:

       编辑word模块,模板配置好后。另存为word 2003 XML格式,并选择“仅保存数据”。

     

     

    步骤2:

       将生成好的xml打开,里面的内容复制到新建的ftl文件,将ftl文件放到项目中作为模板

    步骤3:

    打开ftl文件,替换要填充的数据  如要提货 “Fan” 打开后输入  ${userName},”userName“是Map里面的key的名字,freemarker数据填充是通过Map的

     

    步骤4:
     
    JAVA代码:
     
    package cn.uway.lte.util;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.lang.StringUtils;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    
    /**
     * 导出WORD工具类
     * 
     * @author 
     *     @时间        2014-10-9
     */
    public class DocumentUtil extends CommonUtil
    {
        /**
         * 配置信息对象
         */
        private Configuration configuration = null;
        
        public DocumentUtil() {
            configuration = new Configuration();
            configuration.setDefaultEncoding("utf-8");
        }
    
        /**
         * 生成word并下载
         * @param sc 
         * @param dataMap 模板数据
         * @param request 请求
         * @param response 响应输出下载流
         */
        @SuppressWarnings("rawtypes")
        public void createDoc(ServletContext sc,Map dataMap,HttpServletRequest request,HttpServletResponse response) {
            // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
            configuration.setServletContextForTemplateLoading(sc,"WEB-INF/template");
            Template t = null;
            try {
                // test.ftl为要装载的模板
                t = configuration.getTemplate("evaluateTemplate.ftl");
                t.setEncoding("utf-8");
            } catch (IOException e) {
                logger.error("生成模板出错,错误信息:",e);
            }
    
            String strPath=returnSaveDir(request);
            String fileSaveName = StringUtils.join(new String[] {
                    java.util.UUID.randomUUID().toString(), ".doc"});
            String lastFileName=strPath+fileSaveName;
            // 输出文档路径及名称
            File outFile = new File(lastFileName);
            Writer out = null;
            
            try {
                out = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(outFile), "utf-8"));
            } catch (Exception e) {
                logger.error("生成模板出错,错误信息:",e);
            }
            
            try {
                t.process(dataMap, out);
                out.flush();
                out.close();
                File file = new File(lastFileName);
                FileUtil.downloadFile(file, response);
                // 如果存在就删除
                if (file.exists()) {
                    file.delete();
                }
    
            } catch (TemplateException e) {
                logger.error("生成模板出错,错误信息:",e);
            } catch (IOException e) {
                logger.error("生成模板出错,错误信息:",e);
            }
    
        }
        
        /**
         * 返回文件生成位置
         * 
         * @author fanhy
         * @param request
         * @return
         */
        private  String returnSaveDir(HttpServletRequest request){
            // 文件保存位置,当前项目下的upload/import
            String uploadDir = "upload" + File.separatorChar + "import"+ File.separatorChar;
    
            String ctxDir = request.getSession().getServletContext().getRealPath(String.valueOf(File.separatorChar));
            if (!ctxDir.endsWith(String.valueOf(File.separatorChar))) {
                ctxDir = ctxDir + File.separatorChar;
            }
            // 获取创建路径
            File savePath = new File(ctxDir + uploadDir);
            if (!savePath.exists()) {
                savePath.mkdirs();
            }
            String saveDirectory = ctxDir + uploadDir;
            return saveDirectory;
        }
    
        
    }

     

    FTL模板:

    if语句使用:

    根据条件展示某一块的数据

    <#if (AllNetWork="true")>
                    <w:p wsp:rsidR="00A635F3" wsp:rsidRDefault="00A635F3" wsp:rsidP="00A635F3">
                        <w:pPr>
                            <w:pStyle w:val="1" />
                            <w:listPr>
                                <w:ilvl w:val="0" />
                                <w:ilfo w:val="2" />
                                <wx:t wx:val="1、" />
                                <wx:font wx:val="Times New Roman" />
                            </w:listPr>
                            <w:ind w:first-line-chars="0" />
                            <w:outlineLvl w:val="1" />
                        </w:pPr>

    </#if>

    非空判断

    ${time!}

    <#if rscpList.startTime??>
        ${rscpList.startTime?string('yyyy-MM-dd HH:mm:ss')}
    </#if>

     

     

    图片插入:image二进制图片流

    <w:pict>
    <w:binData w:name="wordml://03000001.jpg">${image}</w:binData>
    <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:450.75pt;height:200pt">
    <v:imagedata src="${"wordml://03000001.jpg"}" />
    </v:shape>
    </w:pict>

     

     

    List填充数据表格:

    在这里表头没有加入太长了,只是从第二行开始生成数据!

    <#list RNCList as RNCList>
                        <w:tr wsp:rsidR="003A2EA1" wsp:rsidRPr="006F59E7" wsp:rsidTr="006F59E7">
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1382" w:type="dxa" />
                                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                                </w:tcPr>
                                <w:p wsp:rsidR="003A2EA1" wsp:rsidRPr="006F59E7" wsp:rsidRDefault="00345453" wsp:rsidP="006F59E7">
                                    <w:pPr>
                                        <w:jc w:val="left" />
                                    </w:pPr>
                                    <w:proofErr w:type="spellStart" />
                                    <w:r wsp:rsidRPr="006F59E7">
                                        <w:t>
                                        <#if RNCList.startTime??>
                                        ${RNCList.startTime?string('yyyy-MM-dd HH:mm:ss')}
                                        </#if>
                                        </w:t>
                                    </w:r>
                                    <w:proofErr w:type="spellEnd" />
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1382" w:type="dxa" />
                                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                                </w:tcPr>
                                <w:p wsp:rsidR="003A2EA1" wsp:rsidRPr="006F59E7" wsp:rsidRDefault="00345453" wsp:rsidP="006F59E7">
                                    <w:pPr>
                                        <w:jc w:val="left" />
                                    </w:pPr>
                                    <w:proofErr w:type="spellStart" />
                                    <w:r wsp:rsidRPr="006F59E7">
                                        <w:t>${RNCList.cityName!}</w:t>
                                    </w:r>
                                    <w:proofErr w:type="spellEnd" />
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1383" w:type="dxa" />
                                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                                </w:tcPr>
                                <w:p wsp:rsidR="003A2EA1" wsp:rsidRPr="006F59E7" wsp:rsidRDefault="00345453" wsp:rsidP="006F59E7">
                                    <w:pPr>
                                        <w:jc w:val="left" />
                                    </w:pPr>
                                    <w:proofErr w:type="spellStart" />
                                    <w:r wsp:rsidRPr="006F59E7">
                                        <w:t>${RNCList.rncName!}</w:t>
                                    </w:r>
                                    <w:proofErr w:type="spellEnd" />
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1383" w:type="dxa" />
                                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                                </w:tcPr>
                                <w:p wsp:rsidR="003A2EA1" wsp:rsidRPr="006F59E7" wsp:rsidRDefault="00345453" wsp:rsidP="006F59E7">
                                    <w:pPr>
                                        <w:jc w:val="left" />
                                    </w:pPr>
                                    <w:proofErr w:type="spellStart" />
                                    <w:r wsp:rsidRPr="006F59E7">
                                        <w:t>${RNCList.rscpAvg}</w:t>
                                    </w:r>
                                    <w:proofErr w:type="spellEnd" />
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1383" w:type="dxa" />
                                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                                </w:tcPr>
                                <w:p wsp:rsidR="003A2EA1" wsp:rsidRPr="006F59E7" wsp:rsidRDefault="00345453" wsp:rsidP="006F59E7">
                                    <w:pPr>
                                        <w:jc w:val="left" />
                                    </w:pPr>
                                    <w:proofErr w:type="spellStart" />
                                    <w:r wsp:rsidRPr="006F59E7">
                                        <w:t>${RNCList.ecnoAvg}</w:t>
                                    </w:r>
                                    <w:proofErr w:type="spellEnd" />
                                </w:p>
                            </w:tc>
                            <w:tc>
                                <w:tcPr>
                                    <w:tcW w:w="1383" w:type="dxa" />
                                    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
                                </w:tcPr>
                                <w:p wsp:rsidR="003A2EA1" wsp:rsidRPr="006F59E7" wsp:rsidRDefault="00345453" wsp:rsidP="006F59E7">
                                    <w:pPr>
                                        <w:jc w:val="left" />
                                    </w:pPr>
                                    <w:proofErr w:type="spellStart" />
                                    <w:r wsp:rsidRPr="006F59E7">
                                        <w:t>${RNCList.badcellRate}</w:t>
                                    </w:r>
                                    <w:proofErr w:type="spellEnd" />
                                </w:p>
                            </w:tc>
                        </w:tr>
    </#list>

     

     

     

    参考:http://blog.csdn.net/lun379292733/article/details/18673081

    转载于:https://www.cnblogs.com/fan101113/p/4136287.html

    展开全文
  • java使用freemarker导出word

    千次阅读 2019-02-01 11:59:07
    java使用freemarker生成word文档,生成docx格式文档
  • Spring Boot 系列教程 freemarker导出word下载
  • FreeMarker生成word文件

    2014-09-09 23:45:46
    FreeMarker生成word,比较简单
  • java freemarker导出word -包含多张图片导出

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,275
精华内容 2,110
关键字:

freemarker导出word