数据塞入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 阅读(509) 评论(0) 收藏 举报
浙公网安备 33010602011771号