数据塞入word模板

1.新建word模板

(1).新建word

 

完成后显示为:

 

按照类似,我最后添加有列表数据  最终模板为  可自己调节模板格式,例如加入下划线

最后效果图:

2.代码

(1).模板里数据分为两大类,一个是单个字段数据,另一个是列表数据,在列表数据中命名是 列表名.属性名字(第一个字母大写)

依赖包:

 

package com.pgf.practise;
/*
作者:pgf
时间:2018年3月30日
描述:TODO
*/
public class Amt {
	private String amt;

	public Amt(String string) {

		this.amt = string;
	}

	public String getAmt() {
		return amt;
	}

	public void setAmt(String amt) {
		this.amt = amt;
	}
}

  

package com.pgf.practise;
/*
作者:pgf
时间:2018年3月30日
描述:TODO
*/
public class House {
	private String region;
	private String addr;
	private String price;

	public String getPrice() {
		return price;
	}

	public House(String region, String addr, String price) {
		super();
		this.region = region;
		this.addr = addr;
		this.price = price;
	}

	public String getRegion() {
		return region;
	}

	public void setRegion(String region) {
		this.region = region;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public void setPrice(String price) {
		this.price = price;
	}
}

  

package com.pgf.practise;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;



import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;

/*
作者:pgf
时间:2018年3月30日
描述:将数据塞入word模板
*/
public class DataToDocTemplate {
	public static void main(String[] args) throws Exception {
		String name = "张三";
		//首先new出4ge列表数据
		House h1 = new House("重庆","沙坪坝区冰河路阳光家园1号","1000000");
		House h2 = new House("成都","高新区中和镇沙海沅2号","2000000");
		House h3 = new House("上海","徐汇区红虹桥路骊山京城3号","3000000");
		//放入lis集合---对应list1数据
		List <House>list1 = new ArrayList<House>();
		list1.add(h1);
		list1.add(h2);
		list1.add(h3);
		
		//list2中的bean数据
		List <Amt>list2 = new ArrayList<Amt>();
		BigDecimal sum = BigDecimal.ZERO;
		for(House item:list1){
			sum = sum.add(new BigDecimal(item.getPrice()));
		}
		Amt amt = new Amt(sum.toString());
		list2.add(amt);
		
		Map singleMap = new HashMap();
		Map mutilMap = new HashMap();
		
		singleMap.put("name", name);
		mutilMap.put("list1", list1);
		mutilMap.put("list2", list2);
		
		//处理数据,单个字段和列表字段
		createDoc(singleMap,mutilMap);			
	}
	
	
	
	
	
	public static void createDoc(Map singleMap,Map mutilMap) throws Exception{
		 InputStream in =new FileInputStream(new File("G:\\template.docx"));
	     IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity );
	     IContext context = report.createContext();
		//单个字段数据填充
		 if(singleMap!=null){
			 replaceSingleDateTemplate(context,singleMap);
		 }
		//列表字段数据填充
		 if(mutilMap!=null){
	            FieldsMetadata metadata = report.createFieldsMetadata();
	            loadMetadata(metadata,mutilMap);
			    replaceListDataTemplate(context,mutilMap);
		 }
		//保存数据填充后生成新的文档
         OutputStream out = new FileOutputStream(new File("G:\\PGFdata.docx"));
         report.process(context, out );
	}
	
	 /**
     * DOCX
     * metadata取得类class
     * @param metadata
     * @param mutilMap
     * @throws CommonException
     */
    public static  void  loadMetadata(FieldsMetadata metadata ,Map mutilMap) throws Exception{

		if(mutilMap!=null){
		    try {

				Set  set = mutilMap.entrySet();
		        for (Iterator  it = set.iterator(); it.hasNext();) {
		                Map.Entry  entry = (Map.Entry) it.next();
		                metadata.load(entry.getKey().toString(),((List) entry.getValue()).get(0).getClass(), true );

		         }
	        }catch (Exception e) {
				e.printStackTrace();			
			}
		}
    }

	
	
	/**
     * DOCX
     * 针对单个文本占位符的数据自动填充
     * @param template
     * @param singleMap
     * @throws CommonException
     */
    public static  void  replaceSingleDateTemplate(IContext context,Map  singleMap) throws Exception{
		if(singleMap!=null){
			Set  set = singleMap.entrySet();
		    try {
		        for (Iterator  it = set.iterator(); it.hasNext();) {
		            Map.Entry  entry = (Map.Entry) it.next();
		            	//StringUtils.strToRtf 专为解决中文编码在rtf模版中乱码问题。
		            context.put(entry.getKey().toString(),entry.getValue()!=null?entry.getValue().toString():"");
		        }
		    } catch (Exception e) {
				e.printStackTrace();
				
			}
		}
    }
    
    

    /**
     * DOCX
     * 针对List的数据自动填充
     * @param mutilList
     * @param tablesList
     * @throws CommonException
     */
    public static  void  replaceListDataTemplate(IContext context,Map map) throws Exception{


		if(map!=null){
		    try {

				Set  set = map.entrySet();
		        for (Iterator  it = set.iterator(); it.hasNext();) {
		                Map.Entry  entry = (Map.Entry) it.next();
		                context.put(entry.getKey().toString(),entry.getValue());
		         }
	        }catch (Exception e) {
				e.printStackTrace();			
			}

		}

    }

	
	
}

  

我把3个类写在同一个类下时候,list数据生成失败

 

posted on 2018-03-30 16:50  HelloWorld20180327  阅读(487)  评论(0编辑  收藏  举报

导航