package testModel;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
public class WordExportTest {
public static void main(String[] args) {
System.out.println("-----------------------start");
List<Map<String, String>> lms = new ArrayList<Map<String,String>>();
Map<String, String> map_re = new HashMap<String, String>();
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
map_re.put("name", "李白");
map_re.put("name2", "太白");
map_re.put("con", "李白 (唐代著名浪漫主义诗人)");
map_re.put("con2", "李白(701年-762年) ,字太白,号青莲居士,又号“谪仙人”,是唐代伟大的浪漫主义诗人,被后人誉为“诗仙”,与杜甫并称为“李杜”,"
+ "为了与另两位诗人李商隐与杜牧即“小李杜”区别,杜甫与李白又合称“大李杜”。据《新唐书》记载,李白为兴圣皇帝(凉武昭王李暠)九世孙,与李唐诸王同宗。其人爽朗大方,爱饮酒作诗,喜交友。"
+ "李白深受黄老列庄思想影响,有《李太白集》传世,诗作中多以醉时写的,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《梁甫吟》《早发白帝城》等多首。"
+ "李白所作词赋,宋人已有传记(如文莹《湘山野录》卷上),就其开创意义及艺术成就而言,“李白词”享有极为崇高的地位。");
map_re.put("now_date", format.format(new Date()));
lms.add(map_re);// 第一份
//lms.add(map_re);// 第二份(这里与第一份相同了,,因为懒我,)
replaceWord("D:\\opensour\\apache-tomcat-8.0.30\\webapps\\file-service\\uploadfile\\word\\wordModel.docx", lms, "D:\\opensour\\apache-tomcat-8.0.30\\webapps\\file-service\\uploadfile\\word\\dd.docx");
System.out.println("-----------------------end");
}
@SuppressWarnings({ "resource", "unused" })
/**
*
* @param mbFilePath 获取word模板路径
* @param mapRes 数据源
* @param outFilePath 导出word路径
*/
public static void replaceWord(String mbFilePath,List<Map<String, String>> mapRes,String outFilePath) {
ByteArrayOutputStream oStream = new ByteArrayOutputStream();
OutputStream out = null;
try {
// 读入模板文件
InputStream in = new FileInputStream(new File(mbFilePath));
// InputStream in = WordExportTest.class.getResourceAsStream("/LifeHouseinspectionsExcel/wordModel.docx");
// 创建一个word对象
XWPFDocument docu = new XWPFDocument(in);
CTBody body = docu.getDocument().getBody();
if(mapRes.size() > 1)
docu.createParagraph().setPageBreak(true);// 设置分页符
CTBody mbody = docu.getDocument().getBody();
String src_mdoc = mbody.xmlText();
String src_mdoc_start = src_mdoc.substring(0, src_mdoc.indexOf(">") + 1);
String src_mdoc_main = src_mdoc.substring(src_mdoc.indexOf(">") + 1, src_mdoc.lastIndexOf("<"));
String src_mdoc_end = src_mdoc.substring(src_mdoc.lastIndexOf("<"));
StringBuffer bodyt = new StringBuffer();
bodyt.append(src_mdoc_start);
for (int i = 0; i < mapRes.size(); i++) {
String src_mdoc_add = src_mdoc_main;
Map<String, String> entry = mapRes.get(i);
List<String> keys = new ArrayList<String>(entry.keySet());
// 替换内容到 word 中标记的位置
for (int j = 0; j < keys.size(); j++) {
src_mdoc_add = src_mdoc_add.replace("${" + keys.get(j) + "}", entry.get(keys.get(j)));
}
bodyt.append(src_mdoc_add);
}
bodyt.append(src_mdoc_end);
// CTBody parse = CTBody.Factory.parse(bodyt.toString());
docu.getDocument().getBody().set(CTBody.Factory.parse(bodyt.toString()));
out = new FileOutputStream(outFilePath,true);
docu.write(oStream);
out.write(oStream.toByteArray());
out.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(out != null) {
out.close();
}
oStream.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
word模板:
word生成: