首先创建WORD模板并添加占位符 (TITLE,BODY等为占位符)
另存为XML
为XML的占位符元素添加ID属性,不需要设值
以下是JAVA代码
package com.archive.util;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.DocumentSource;
import org.dom4j.io.SAXReader;
public class Export {
/**
*
* 用XML模板导出WORD
* 编辑好WORD,把要替换的内容用占位符代替,如:XMMC XMMC和conMap的KEY对应
* 替换后转换成XML。再由XML生成WORD
* @param srouceXml 源XML
* @param outXml 替换后的XML
* @param conMap 替换的字符集
*/
public void xmlReplaceAndToWord(String srouceXml,String outXml,HashMap conMap){
try {
// srouceXml,outXml eg:D:\\a.xml
/****************************以下为替换XML的占位符****************************************/
SAXReader reader = new SAXReader();
//模版文件为 : conf\\testReportTemplate.xml
Document document = reader.read(new File(srouceXml));
Element root = document.getRootElement();
// w:t是占位符所在的元素标签,视具体情况而定 //w:t 表示从任意位位置查换w:t //w:t[@id]表示具有id属性的w:t元素
// //w:t[@id='abc']表示id属性值是abc的w:t元素 如<w:t id="abc">PHONE</w:t>中的 id="abc"要自已加进去。生成的XML中没有
List list = root.selectNodes("//w:t[@id]");
String key = "";
Element changeElement = null;
for(int i = 0; i < list.size(); i++) {
changeElement = (Element)list.get(i);
key = changeElement.getText();// 取得有占位符的元素
if(conMap.get(key) != null){//替换值
changeElement.setText(conMap.get(key)+"");
}
}
/**********和下面的方法比,少了这一部分****** 开始**/
//获得一个TransformerFactory对象
TransformerFactory transformerFactory = TransformerFactory.newInstance();
//获得一个Transformer对象
Transformer transformer = transformerFactory.newTransformer();
//把document对象用一个DOMSource对象包装起来
DocumentSource xmlSource = new DocumentSource(document);
//建立一个存储目标对象
FileOutputStream fos = new FileOutputStream(new File(outXml));
Result outputTarget = new StreamResult(fos);
//生成相应的xml文件
transformer.transform(xmlSource, outputTarget);
fos.close();
/**********和下面的方法比,少了这一部分***** 结束 ***/
/****************************以下为xml转换成WORD****************************************/
//模版文件
document = reader.read(new File(outXml));
ByteArrayInputStream bais = new ByteArrayInputStream(document.asXML().getBytes("utf-8"));
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
DocumentEntry de = directory.createDocument("WordDocument", bais);
// 创建目标文件夹
createFolder("D:\\result.doc");
fos = new FileOutputStream("D:\\result.doc");
fs.writeFilesystem(fos);
bais.close();
fos.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
/**
*
* 用XML模板导出WORD
* 编辑好WORD,把要替换的内容用占位符代替,如:XMMC XMMC和conMap的KEY对应
* 替换后的XML直接转生成WORD
* 和上面的方法比起来。不需要生成新的XML。只是把修改后的XML直接生成WORD
* @param srouceXml 源XML
* @param outWord 生成的WORD
* @param conMap 替换的字符集
*/
public void xmlReplaceAndToWord2(String srouceXml,String outWord,HashMap conMap){
try {
// srouceXml eg:D:\\a.xml,outWord eg:D:\\a.doc
/****************************以下为替换XML的占位符****************************************/
SAXReader reader = new SAXReader();
//模版文件为 : conf\\testReportTemplate.xml
Document document = reader.read(new File(srouceXml));
Element root = document.getRootElement();
// w:t是占位符所在的元素标签,视具体情况而定 //w:t 表示从任意位位置查换w:t //w:t[@id]表示具有id属性的w:t元素
// //w:t[@id='abc']表示id属性值是abc的w:t元素 如<w:t id="abc">PHONE</w:t>中的 id="abc"要自已加进去。生成的XML中没有
List list = root.selectNodes("//w:t[@id]");
String key = "";
Element changeElement = null;
for(int i = 0; i < list.size(); i++) {
changeElement = (Element)list.get(i);
key = changeElement.getText();// 取得有占位符的元素
if(conMap.get(key) != null){//替换值
changeElement.setText(conMap.get(key)+"");
}
}
/****************************以下为xml转换成WORD****************************************/
//模版文件
ByteArrayInputStream bais = new ByteArrayInputStream(document.asXML().getBytes("utf-8"));
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
DocumentEntry de = directory.createDocument("WordDocument", bais);
// 创建目标文件夹
createFolder(outWord);
FileOutputStream fos = new FileOutputStream(outWord);
fs.writeFilesystem(fos);
bais.close();
fos.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
/**
* 创建文件夹,并删除原有文件
* @param path
*/
private void createFolder(String path){
File targetFile = null;
targetFile = new File(path);
if(targetFile.exists()){//删除原有文件
targetFile.delete();
}
// 创建目标文件夹
targetFile = new File(path.substring(0,path.lastIndexOf("\\")));
if(!targetFile.exists()){
targetFile.mkdirs();
}
}
}