注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

java使用解析编辑xml方法编辑word(转)  

2013-01-12 17:56:33|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近因为客户的要求,需要做一个关于项目具体信息导出到word的功能。java处理word已经存在很多种方法了,但是用起来都不是那么方便,而且不太灵活,而使用xml的方法可以做到非常灵活,你可以先建好模板,然后往里面填数,模板怎么建,填出来的效果就是怎么样的。首先说说word和xml的关系,每个word它都对应着一个xml文件,也就是说你修改了xml,对应的word文件也就跟着修改了。通过word的保存功能可以将一个word文件保存为xml文件,该文件虽然是.xml格式的,但是直接双击打开的话还是使用word打开,所以你只能用txt将它打开,用txt打开之后将里面的一句话:<?mso-application progid="Word.Document"?>去掉,然后保存,接着就可以双击直接打开了,这样使用的就是IE打开的,你这样就可以查看里面的节点具体的构造。

最上面的主节点是<w:wordDocument>(如果不是的话,相信你将word文件保存成xml的时候使用的是07word,选择的是:word xml文档(*.xml),你可以选择word 2003 xml文档(*.xml)试试);该主节点下面有大致8个节点,其中我们要操作的就是<w:body>节点,该节点是word的正文节点,其他的节点没有去研究;<w:body>下面包含的节点可能会有:<w:p>段落节点、<w:tbl>表格节点。

接着要做的就是在java程序中,使用dom来解析编辑xml文件,这里贴出一些代码来供大家参考:

 

public Document loadXML(String filename){//////////加载xml文件

Document document = null; 

   try{

   DocumentBuilderFactory   factory = DocumentBuilderFactory.newInstance();    

       DocumentBuilder builder=factory.newDocumentBuilder();    

       document=builder.parse(new File(filename));    

       document.normalize(); 

   }catch (Exception ex){

       ex.printStackTrace(); 

   }   

   return document; 

}

 

public boolean doc2XmlFile(Document document,File targetFile){ ///////回写xml文件

boolean flag = true; 

   try{

   TransformerFactory tFactory = TransformerFactory.newInstance();    

       Transformer transformer = tFactory.newTransformer();  

       DOMSource source = new DOMSource(document);  

       StreamResult result = new StreamResult(targetFile.toURI().getPath());

       transformer.transform(source, result);  

   }catch(Exception ex){ 

       flag = false; 

       ex.printStackTrace(); 

   } 

   return flag;       

}

String void function(){///////////程序入口

 

String rootPath=ServletActionContext.getServletContext().getRealPath("/excelTemplate")+"\\";

try{

Document document=loadXML(rootPath+"projectModel.xml");

Element root = document.getDocumentElement();

NodeList rootList=root.getChildNodes();

Node bodyNode=null;///////w:body

for(int i=0;i<rootList.getLength();i++){////////找到<w:body>节点

bodyNode=rootList.item(i);

if("w:body".equals(bodyNode.getNodeName())){

break;

}

}

NodeList nodeList=bodyNode.getChildNodes();

for(int i=0;i<nodeList.getLength();i++){

Node node=nodeList.item(i);

if("w:tbl".equals(node.getNodeName())){

dealWithTableNode(document,node);

}else if("w:p".equals(node.getNodeName())){

dealWithWPNode(document,node);

}

 

}

File destFile = File.createTempFile("project", ".xml");

doc2XmlFile(document,destFile);///////回写

inputStream = new FileInputStream(destFile);/////////生成流,用于下载

fileName=URLEncoder.encode(project.getProjectName(),"utf-8")+".doc";

}catch(Exception e){

e.printStackTrace();

}

 

}

注意:

1、在解析编辑xml文件的时候一定好看好节点的位置,比如一般的文本内容的话可能是在<w:p>节点下的<w:r>节点下的<w:t>里设置,使用的是getTextContent()方法来获取它的内容,setTextContent()来设置它的参数

2、对于图片如何插入呢?首先最好在模板中插入一张图片,主要用于定下图片的那些格式,然后图片必须用java转成base64的字符串,这里也提供一个方法:

 

private String toBASE64codeFile(File file){

String codeString="";

try{

FileInputStream fis=new FileInputStream(file);

BASE64Encoder encoder=new BASE64Encoder();

byte[] b=new byte[228];

int count=-1,n=0;

while((count=fis.read(b))!=-1){

codeString+=encoder.encode(b);

}

return codeString;

}catch(Exception e){

e.printStackTrace();

return "";

}

}

然后找到<w:pict>节点:一般如果图片是在table里的话,该节点就是在<w:tbl>-<w:tr>-<w:tc>-<w:p>-<w:r>节点下面,不在table里的话就是:<w:p>-<w:r>,建议仿照用IE打开的xml对照一下。然后将该节点下的<w:binData>的内容置成你所要插入的图片的base64码即可。

  评论这张
 
阅读(536)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016