数据塞入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) 编辑 收藏 举报