`
tiwson
  • 浏览: 330591 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

【原创】利用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();
	       }
	}
	
}
分享到:
评论

相关推荐

    JSP实例编程100例

    82、使用jsp指令生成Word文档 83、JSP网页模板 84、判断是否空白文件 85、cookie 用户登录次数 86、获取用户的真实IP地址 87、获取用户的浏览器信息 88、在客户端进行数据检查 89、在JSP中获取当前绝对路径 90、读取...

    JAP编程学习100例

    82、使用jsp指令生成Word文档 83、JSP网页模板 84、判断是否空白文件 85、cookie 用户登录次数 86、获取用户的真实IP地址 87、获取用户的浏览器信息 88、在客户端进行数据检查 89、在JSP中获取当前绝对路径 90、读取...

    Python Cookbook

    2.27 从微软Word文档中抽取文本 97 2.28 使用跨平台的文件锁 98 2.29 带版本号的文件名 100 2.30 计算CRC-64循环冗余码校验 102 第3章 时间和财务计算 105 引言 105 3.1 计算昨天和明天的日期 111 3.2 寻找...

    vc++ 应用源码包_1

    在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用...

    vc++ 应用源码包_2

    在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框出现气球提示 调用...

    vc++ 应用源码包_6

    独立打包,保证可解压,内含大量源码,网上搜集...在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC...

    vc++ 应用源码包_5

    独立打包,保证可解压,内含大量源码,网上搜集...在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC...

    vc++ 应用源码包_3

    在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 VC满屏开满玫瑰花 VC然输入框...

    vc++ 开发实例源码包

    ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 class CDHtmlSinkHandler; // Events Sink Base class CDHtmlEventSink; // IHTMLDocument2 Events Sink // IDispatch class ...

Global site tag (gtag.js) - Google Analytics