【原创】利用dom4j读取并修改word模板内容,并生成word文档

最近在做一个项目,其中需要把客户的提供的word文档动态提供下载服务,在网上找了N多资料,发现很多对word文档都不是很完美。例如:JACOB和JAVA2WORD,这两个都只能在windows平台上使用,对于跨平台系统来讲,就等于形同虚设;然后还有就是apache组织的poi组件,poi对于excle的操作还是不错的,但对于word的操作还处于开发阶段,很多都是很普通的功能,对于word的操作基本上没有什么用途。无奈之下,查了很多资料,发现可以把word转换成mht格式或者rtf格式或者xml格式的文档,本来一开始是想修改mht,但后来发现效果不是很好,而且格式问题很难控制,rtf也是一样,特别是中文问题。后来实在没有办法,就抱着试下的心理用xml文档,才发现效果也不是很好,比较复杂。但相对于上面的方法来讲已经算最好的了。迫于项目需求,没有办法,目前就只好用此方法了。

此方法用到dom4j来解释xml文件,效果不错,也比较简单。深入的以后再写吧,现在先贴个测试时写的类,希望可以抛砖引玉,代码里有解释,欢迎一起交流。


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;


public class UpdateReport {
	
	public static void main(String[] args) {
		UpdateReport up = new UpdateReport();
		//把word文档修改成xml文件,然后再对xml进行操作
		up.UpdateXmlFile("d:\\1.xml", "d:\\2.xml");
	}

	/**
	 * 解释xml文档,并修改其内容
	 * @param filename 模板文件
	 * @param newfilename	输出目标文件
	 * @return
	 */
	public void UpdateXmlFile(String filename,String newfilename){
		//利用dom4j解释xml文件
	       try{
	           SAXReader saxReader = new SAXReader(); 
	           Document document = saxReader.read(new FileInputStream(new File(filename)));
	           
	           //替换内容
	           List list = document.selectNodes("//w:t" ); 
	           Iterator iter = list.iterator();
	           while(iter.hasNext()){
	        	   Element element = (Element)iter.next();
	        	   String str = element.getText();
	        	   //将变量设成你需要更换的内容,这里把变量统一设成$xxx$格式
	        	   if(str != null && "$rid$".equals(str.trim())) {
	        		   System.out.println(element.getText());
	        		   element.setText("LCZC10010");
	        	   }
	           }
	           
	           
	           //把所有的图片内容含有\n字符的去掉,不知道什么原因,
	           //不去掉就显示不出图片来
	           List list1 = document.selectNodes("//w:binData" ); 
	           Iterator iter1 = list1.iterator();
	           while(iter1.hasNext()){
	        	   Element element = (Element)iter1.next();
	        	   String str = element.getText();
	        	   str = str.replaceAll("\n", "");
	        	   element.setText(str);
	           }
	           
	       //利用dom4j输出document到文件上
	           try{
	        	   XMLWriter writer = null;
	               /** 格式化输出 */
	               //OutputFormat format = OutputFormat.createPrettyPrint();
	        	   //OutputFormat format = OutputFormat.createCompactFormat();
	        	   //OutputFormat format = new OutputFormat();
	        	   //格式化各标签之间的间隔符,这里将其设置为空
	        	   OutputFormat format  = new OutputFormat("");
	        	   //格式化换行符,这里将其设成空
	        	   format.setLineSeparator("");
	        	   
	               /** 指定XML编码,一定要设成UTF-8,否则如果有中文,就会导致文件打不开 */
	               format.setEncoding("UTF-8");
	               writer= new XMLWriter(new FileOutputStream(new File(newfilename)),format);
	               writer.write(document);
	               writer.flush();
	               writer.close();      
	           }catch(Exception ex){
	               ex.printStackTrace();
	           }
	           
	           //写出到文件的另一种方式,没有测试
//	           Writer writer = new OutputStreamWriter(new FileOutputStream(newfilename));
//	           document.write(writer);
//	           writer.flush();
//	           writer.close();
	           
	       }catch(Exception ex){
	           ex.printStackTrace();
	       }
	}
	
}

你可能感兴趣的:(apache,windows,xml,UP)