freemarker的使用

Freemarker的使用方法

freemarkerjar
<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>

word转换为ftl

在这里插入图片描述

保存word为xml格式

在这里插入图片描述

将xml格式转为ftl。

Freemarker模板语法

1. 访问属性 ===》${name}
2. 访问对象===》${user.name}
3. 访问list集合:
<#list studentList  as student> </#list>
集合下标:
<#list studentList as student>
    ${student_index}
</#list>

4. 判断:
<#if student ??>
        student不为空
    <#else>
        student为空
</#if>
集合判断
<#if (deviceMap?size>0)></#if>
 
5.map遍历:
  <#list sparePartsMap?keys as key>
   	<#assign Items=sparePartsMap[key]>
        <#list Items as Item>
        </#list>    
  </#list>
 
6.截取字符串长度:
  <#if name?length lt 7>
  <#else>
      ${name[0..6]}
  </#if>
      
7.时间格式化:
  时间戳日期==》 ${time?number_to_datetime}
  时间戳乘1000===》${time?number*1000}
    
  日期格式化:
      ${dateTime?string('yyyy-MM-dd hh:mm:ss')} 格式化为: 2022-11-12 15:03:22
8.取小数点:
      ${num?string(',###.##')} 保留小数点后两位  1233422.23
      ${num?string('0000.00')} 整数部分不足三位,前面用0补齐.  0123.20

实例:

  // 图片
        String path = "C:/home/itsm/upload/week/png"; //TODO 测试

        //TODO 运维类别 饼图
        DefaultPieDataset dataset_yw_type_task = new DefaultPieDataset();
        for (CensusCountVO censusCountVO : taskTypeList) {
            dataset_yw_type_task.setValue(censusCountVO.getName(), Double.parseDouble(censusCountVO.getData()));
        }

        String image_userId_1_unitId = "image_" + SecureUtil.getUser().getUserId() + "_1_" + customerId; // 图片1名称 =image_本人id_1_查询单位id
        // 图片1路径
        String image_1_dir = JFreeChartUtil.createAndGenerateWeeklyPiechart(dataset_yw_type_task, "运维类别", 650, 300, path,image_userId_1_unitId);
        // 图片1
        String image_1 = JFreeChartUtil.getImageStr(image_1_dir);



		Map<String, Object> beanParams = new HashMap<String, Object>();
        beanParams.put("ywTaskList", ywTaskList);
        beanParams.put("workList", workList);

        beanParams.put("image_1", image_1); // 图片3-硬件维护柱状图



        //word导出

        String templateFile = "demo.ftl";
        String templateDir = "文件路径;
        WordExportUtil.writeResponse(request, response, WordExportUtil.WORD_2003, docFileName, templateDir, templateFile, beanParams);

工具类

public class JFreeChartUtil {
       /**
     * 创建并生成 周报-备件更换-饼形图
     * @param dataset 饼状图数据
     * @param title 标题
     * @param width 图片宽度
     * @param height 图片高度
     * @param destPath 目的地-路径
     * @param imgName  图片名称   如:mybook-pie
     * @return 返回图片全路径
     */
    public static String createAndGenerateWeeklyPiechart(PieDataset dataset, String title, int width, int height, String destPath, String imgName) {
    	// step1:创建数据集对象 , 取得数据
    	
    	// step2:创建图  
    	JFreeChart chart = createWeeklyPieChart(dataset, title);  
    	
    	// step3: 输出PNG图表到磁盘  
    	drawPNGToOutputStream(destPath + "//" + imgName +".png", chart, width, height); 
    	
    	// 返回图片全路径
    	return destPath + "//" + imgName + ".png";
    }
    
    
       /**
     * 获得图片的Base64编码
     * @param imgFile 图片文件路径
     * @return
     * @author  
     */
    public static String getImageStr(String imgFile) {
        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(imgFile);
        } catch (FileNotFoundException e) {
            log.error("加载图片未找到", e);
            e.printStackTrace();
        }
        try {
            data = new byte[in.available()];
            //注:FileInputStream.available()方法可以从输入流中阻断由下一个方法调用这个输入流中读取的剩余字节数
            in.read(data);
            in.close();
        } catch (IOException e) {
            log.error("IO操作图片错误", e);
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);
    }
    
}
public class WordExportUtil { 
 	public static String WORD_2007 = "WORD_2007";  
    public static String WORD_2003 = "WORD_2003";  

      /**  
     *  word导出
     * @param request  HttpServletRequest  
     * @param response HttpServletResponse  
     * @param version  Word_2003/Word_2007  
     * @param docFileName 生成的doc文件名  
     * @param templateDir  freemark模板文件路径  
     * @param templateFile  freemark模板文件名  
     * @param beanParams  入参数据:  Map<String, Object>类型  
     */  
    public static void writeResponse( HttpServletRequest request, HttpServletResponse response, String version, String docFileName, String templateDir, String templateFile, Map<String, Object> beanParams) {  
        writeResponse(request, response, version, "temp", docFileName, templateDir, templateFile, beanParams);  
    }  
    
    
    
    
    /**  
     * word写入模板文件并输出文件到response
     * @param request  HttpServletRequest  
     * @param response HttpServletResponse  
     * @param version  Word_2003/Word_2007  
     * @param docFileTempDir 生成的doc文件暂存目录 
     * @param docFileName 生成的doc文件名  
     * @param templateDir 存放freemark模板的目录  
     * @param templateFile freemark模板文件名  
     * @param beanParams   入参数据:  Map<String, Object>类型  
     */  
    public static void writeResponse(HttpServletRequest request, HttpServletResponse response, String version, String docFileTempDir, String docFileName,  String templateDir, String templateFile, Map<String, Object> beanParams) {  
        Configuration config = new Configuration();     
        InputStream is = null;  
        File previewFile = null;  
        try {  
            config.setDirectoryForTemplateLoading(new File(templateDir));     
            config.setObjectWrapper(new DefaultObjectWrapper());     
            Template template = config.getTemplate(templateFile, "UTF-8"); 
            if (WORD_2007.equals(version)) {  
                docFileName = docFileName + ".docx";                
            } else {  
                docFileName = docFileName + ".doc";                 
            }  
            String docName = templateDir+"//" + docFileName;
           // String docName =FileUploadUtils.getUploadAddress()+docFileName;        
            FileOutputStream fos = new FileOutputStream(docName);     
            Writer out = new OutputStreamWriter(fos, "UTF-8");     
            template.process(beanParams, out);     
            out.flush();     
            out.close();  
            
            
            previewFile = new File(docName);    
            is = new FileInputStream(previewFile);   
            response.reset();   
            if (WORD_2007.equals(version)) {  
                response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8");  
            }else{  
                response.setContentType("application/vnd.ms-word;charset=UTF-8");   
            }    
            String agent = request.getHeader("USER-AGENT");
	        if(null != agent && -1 != agent.indexOf("MSIE")){//IE
	        	docFileName = java.net.URLEncoder.encode(docFileName,"UTF-8");
	        }else if(null != agent && -1 != agent.indexOf("Mozilla")){
	        	docFileName = new String (docFileName.getBytes("UTF-8"),"iso-8859-1");
	        }else{
	        	docFileName = java.net.URLEncoder.encode(docFileName,"UTF-8");
	        }
            response.addHeader("Content-Disposition", "attachment;filename="+docFileName);            
            byte[] b = new byte[1024];   
            int len;   
            while ((len=is.read(b)) >0) {   
               response.getOutputStream().write(b,0,len);   
            }  
            response.getOutputStream().flush();   
            response.getOutputStream().close();  
        } catch (ParseException e) {
        	log.error("解析模板出错,请检查模板格式", e);
        	e.printStackTrace();
        } catch (IOException e) {
        	log.error("IO读取失败", e);
        	e.printStackTrace();
        }catch (Exception e) {     
            e.printStackTrace();  
            
        }finally{  
            if(is!=null){  
                try {  
                    is.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }   
            }  
            if(previewFile!=null){  
                previewFile.delete();  
            }  
        }  
    }  

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值