【原创】利用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();
}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值