工作中常要填写各种word表格,其中内容有很多是重复的。于是想做一个工具,输入word文件所对应的xml格式文件,自动填写表格。
word其实可以转化成xml来处理,这一步可以手工用word把.doc格式文件另存为.xml格式。word的表格中,每一行对应一个
对于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 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 fillList) {
System.out.println("当前节点的名称::" + node.getName());
// 获取当前节点的所有属性节点
List 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 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 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 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 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 authors = e.elements("作者");
for (Element aut : authors) {
System.out.println(aut.getText());
}
// 获取西游记这个元素节点 所有元素的子节点。
List 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 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 entityList_1=GetEntityList();
for(int i=0;i
4.propeties文件
#Update long name
#Sat Sep 22 00:57:39 CST 2018
姓名=牛逼
性别=女
出身年月=1987年7月
身份证号码=518209387428982347
民族=汗
政治面貌=中共党员
婚姻状况=已婚
健康状况=良好
身高=175
现户口所在地=北京
所学专业=英语
学历=本科
最后毕业学校=清华大学
毕业时间=2017年8月
技术职称=高级工程师
现工作单位=百度
参加工作时间=2017年10月
现从事专业=搬砖