java操作word,自动填写word表格

工作中常要填写各种word表格,其中内容有很多是重复的。于是想做一个工具,输入word文件所对应的xml格式文件,自动填写表格。

word其实可以转化成xml来处理,这一步可以手工用word把.doc格式文件另存为.xml格式。word的表格中,每一行对应一个<w:tr>标签;每一个格子对应一个<w:tc>标签;格子中每行的内容,对应一个<w:t>标签。

对于xml的处理,可以用dom4j来处理。主要思路为:

1.将所要自动填写的内容,按key  -- value的格式,写进一个properties文件中。并通过程序将文件内容取出,放入到entityList当中。

2.从xml根节点开始,遍历所有节点。若当前为w:tc节点,则获取该节点下所有w:t的内容,与所有entityList中所有key值对比。若有匹配,则在下一个w:tc格子中,新加一个w:t把该key值对应的value填入该表格中。

3.生成新的xml格式文件

 

所有代码如下:

1.xml处理相关函数:

package com.XML.test;

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.FileWriter;  
import java.io.OutputStreamWriter;  
import java.nio.charset.Charset;  
import java.nio.charset.CharsetEncoder;  
import java.util.ArrayList;
import java.util.Iterator;  
import java.util.List;  

import javax.xml.soap.Node;
  
import org.dom4j.Attribute;  
import org.dom4j.Document;  
import org.dom4j.Element;  
import org.dom4j.io.OutputFormat;  
import org.dom4j.io.SAXReader;  
import org.dom4j.io.XMLWriter;  
import org.junit.Test;  
  
public class Demo01 {  
  
    @Test  
    public void test() throws Exception {  
  
        // 创建saxReader对象  
        SAXReader reader = new SAXReader();  
        // 通过read方法读取一个文件 转换成Document对象  
        Document document = reader.read(new File("./src/倪锐个人简历表格.xml"));  
        //获取根节点元素对象  
        Element node = document.getRootElement();  
        //遍历所有的元素节点
        
        List<Entity> entityList= GetPro.GetEntityList();
        int i=0;
        for(Entity a:entityList){
        	System.out.println("Entity" +i +a.getKey()+" "+a.getValue()); 
        	i++;
        }
        listNodes(node,entityList);  
  
        
        // 写入到一个新的文件中  
        writer(document);  
  
    }  
  
    /** 
     * 把document对象写入新的文件 
     *  
     * @param document 
     * @throws Exception 
     */  
    public void writer(Document document) throws Exception {  
        // 紧凑的格式  
        // OutputFormat format = OutputFormat.createCompactFormat();  
        // 排版缩进的格式  
        OutputFormat format = OutputFormat.createPrettyPrint();  
        // 设置编码  
        format.setEncoding("UTF-8");  
        // 创建XMLWriter对象,指定了写出文件及编码格式  
        // XMLWriter writer = new XMLWriter(new FileWriter(new  
        // File("src//a.xml")),format);  
        XMLWriter writer = new XMLWriter(new OutputStreamWriter(  
                new FileOutputStream(new File("src//a.xml")), "UTF-8"), format);  
        // 写入  
        writer.write(document);  
        // 立即写入  
        writer.flush();  
        // 关闭操作  
        writer.close();  
    }  
  
    /** 
     * 遍历当前节点元素下面的所有(元素的)子节点 
     *  
     * @param node 
     */  
    public void listNodes(Element node,List<Entity>  fillList) {  
        System.out.println("当前节点的名称::" + node.getName());  
        // 获取当前节点的所有属性节点  
        List<Attribute> list = node.attributes();  
        // 遍历属性节点  
        for (Attribute attr : list) {  
            System.out.println(attr.getText() + "-----" + attr.getName()  
                    + "---" + attr.getValue());  
        }  
         
       if (!(node.getTextTrim().equals(""))) {  
    	   System.out.println("文本内容::::" + node.getText()); 
       }
        if (node.getName().equals("tc")){
        	System.out.println("----------------enter tc------------------");
        	for(Entity ent:fillList){
        		rightFil(node,ent.getKey(),ent.getValue());
        	}        	
        }
        // 当前节点下面子节点迭代器  
        Iterator<Element> it = node.elementIterator();  
        // 遍历  
        while (it.hasNext()) {  
            // 获取某个子节点对象  
            Element e = it.next();  
            // 对子节点进行遍历  
            listNodes(e,fillList);  
        }  
    }  

    //node is where you find key value
    public String merge(Element node,String tag,String ini){
    	StringBuffer strMerg=new StringBuffer(ini);
    	Iterator<Element> it = node.elementIterator();  
    	if(node.getName().equals(tag)){
            strMerg.append(node.getText());
//            System.out.println("for strMerg-----" + strMerg);
//            System.out.println("for node.getText()=" + node.getText());
    	}
        while (it.hasNext()) {  
            // 获取某个子节点对象  
            Element e = it.next();  
            // 对子节点进行遍历  
            strMerg=new StringBuffer(merge(e,tag,strMerg.toString())); 
            
        }
//        System.err.println("strMerg=" + strMerg);

    	return strMerg.toString().replace(" ", "");
    }
    public String mergebackup(Element node,String tag){
    	try{
    		List<Element> sibList=node.elements("p");
            System.err.println("size=-----" + sibList.size());

    		
        	StringBuffer strMerg=new StringBuffer("");
        	int i=0;
            for (Element elm : sibList) {  
                System.out.println("sibList-----" + elm.element("r").element("t").getText());
                strMerg.append(elm.element("r").element("t").getText());
                System.out.println("for strMerg =" + strMerg);
                i++;
                System.err.println("i======" + i);
            }
//            System.out.println("strMerg-----" + strMerg);
            
            System.out.println("strMerg del blanks-----" + strMerg.toString().replace(" ", ""));
            return strMerg.toString().replace(" ", "");
    	}catch(NullPointerException e){
    		System.out.println("merge: no t in this tc -----" );
    		return "";
    	}


    }
    public void rightFil(Element node,String key,String value){//node 为tc级别,合并所有t标签
    	String strMerg=merge(node,"t","");
    	if(strMerg.equals(key)&&strMerg.length()>0){
        	System.out.println("***********************"+key+"found");
        	System.out.println(node.getName());

        	//int j=node.indexOf(node.getParent());
        	Element father=node;//self tc tag
        	System.out.println(father.getName());
       	
        	Element sib=(Element) father.selectSingleNode("following-sibling::w:tc[1]");//next tc tag
        	if(sib!= null){
        		insertT(sib,value);
        	}
        	else{
        		
        	}
        }
    }
    
    public void rightFilBackup(Element node,String key,String value){//node 为t级别,不能合并所有t标签
    	if(node.getText().replace(" ", "").equals(key)){
        	System.out.println("***********************"+key+"found");
        	System.out.println(node.getName());

        	//int j=node.indexOf(node.getParent());
        	Element father=(Element) node.getParent().getParent().getParent();//self tc tag
        	System.out.println(father.getName());
       	
        	Element sib=(Element) father.selectSingleNode("following-sibling::w:tc[1]");//next tc tag
        	insertT(sib,value);
        	
        }
    }   
    public void insertT(Element tc,String value){
        
        List<Attribute> list = tc.attributes();  
        // 遍历属性节点  
        for (Attribute attr : list) {  
            System.out.println(attr.getText() + "-----" + attr.getName()  
                    + "---" + attr.getValue());  
        } 
 
        System.out.println("tc.attribute(\"id\")========");
        System.out.println(tc.attribute("id"));  
 

    	Element adE=tc.element("p");
    	System.out.println("adEtest++++++++++++====="+adE.getName());               
    	System.out.println("adEtest++++++++++++=====END"+adE.getName());  
    	Element r=adE.addElement("w:r");            	
    	Element rPr=r.addElement("w:rPr");
    	rPr.addElement("w:rFonts hint=\"eastAsia\"");
    	rPr.addElement("w:sz val=\"24\"");
    	Element t=r.addElement("w:t");
    	t.setText(value);
    }
    
    /** 
     * 介绍Element中的element方法和elements方法的使用 
     *  
     * @param node 
     */  
    public void elementMethod(Element node) {  
        // 获取node节点中,子节点的元素名称为西游记的元素节点。  
        Element e = node.element("西游记");  
        // 获取西游记元素节点中,子节点为作者的元素节点(可以看到只能获取第一个作者元素节点)  
        Element author = e.element("作者");  
  
        System.out.println(e.getName() + "----" + author.getText());  
  
        // 获取西游记这个元素节点 中,所有子节点名称为作者元素的节点 。  
  
        List<Element> authors = e.elements("作者");  
        for (Element aut : authors) {  
            System.out.println(aut.getText());  
        }  
  
        // 获取西游记这个元素节点 所有元素的子节点。  
        List<Element> elements = e.elements();  
  
        for (Element el : elements) {  
            System.out.println(el.getText());  
        }  
  
    }  
  
}  

2.自动填写格式设定:(key姓名--value张三) 

package com.XML.test;

public class Entity {
	String key;
	String value;

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

}

3.从properties文件读出到entityList程序 

package com.XML.test;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

import org.dom4j.DocumentException;

//关于Properties类常用的操作
public class GetPro {

  
  //读取Properties的全部信息
  public static List GetEntityList() throws IOException {
	  List<Entity> entityList= new ArrayList();
      Properties pps = new Properties();
      InputStream in = new BufferedInputStream(new FileInputStream("./src/com/XML/test/properties"));
      pps.load(new InputStreamReader( in, "utf-8"));
      Enumeration en = pps.propertyNames(); //得到配置文件的名字
      
      while(en.hasMoreElements()) {
          String strKey = (String) en.nextElement();
          String strValue = pps.getProperty(strKey);
          Entity entity =new Entity();
          entity.setKey(strKey);
          entity.setValue(strValue);
          entityList.add(entity);
          System.out.println(strKey + "=" + strValue);
          
          
      }
	return entityList;
      
  }
  public static void main(String[] args) throws DocumentException,
  IOException {
   Entity entity_1 =new Entity();
    List<Entity> entityList_1=GetEntityList();
    for(int i=0;i<entityList_1.size();i++){
     entity_1=entityList_1.get(i);
     System.out.println(entity_1.getKey() + "=" + entity_1.getValue());
    } 
   
  }

  }

4.propeties文件 

#Update long name
#Sat Sep 22 00:57:39 CST 2018
姓名=牛逼
性别=女
出身年月=1987年7月
身份证号码=518209387428982347
民族=汗
政治面貌=中共党员
婚姻状况=已婚
健康状况=良好
身高=175
现户口所在地=北京
所学专业=英语
学历=本科
最后毕业学校=清华大学
毕业时间=2017年8月
技术职称=高级工程师
现工作单位=百度
参加工作时间=2017年10月
现从事专业=搬砖

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值