java xml模板导出word

首先创建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();
		 }
	 }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值