工作中常要填写各种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 valuepublic 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 tagSystem.out.println(father.getName());Element sib=(Element) father.selectSingleNode("following-sibling::w:tc[1]");//next tc tagif(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 tagSystem.out.println(father.getName());Element sib=(Element) father.selectSingleNode("following-sibling::w:tc[1]");//next tc taginsertT(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月
现从事专业=搬砖

java操作word,自动填写word表格相关推荐

  1. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  2. word表格图片自动适应表格大小_Excel应用实践20:使用Excel中的数据自动填写Word表格...

    学习Excel技术,关注微信公众号: excelperfect 我在Excel工作表中存放着数据,如下图1所示. 图1 我想将这些数据逐行自动输入到Word文档的表格中并分别自动保存,Word文档表格 ...

  3. java操作跨页的word cell_Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行...

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  4. java操作跨页的word cell_Java 创建Word表格/嵌套表格、添加/复制表格行或列、设置表格跨页断行...

    概述 表格作为一种可视化交流模式及组织整理数据的手段,在各种场合及文档中应用广泛.常见的表格可包含文字.图片等元素,我们操作表格时可以插入图片.写入文字及格式化表格样式等.下面,将通过Java编程在W ...

  5. Java使用FreeMarker自动生成Word文档

    背景:根据模板填充导出word 一.添加依赖 1 <dependency> 2 <groupId>org.freemarker</groupId> 3 <ar ...

  6. java操作跨页的word cell,“excle如何打印不出现断行“EXCEL中,如何不跨页断行打印或显示,谢谢...

    EXCEL中,如何不跨页断行打印或显示,谢谢 打印预览--页面设置--工作表--网格线(打勾) 试试! java导入excel 判断当前行有没有数据 工作中用到入excel一个方法,你还可以通过一些插 ...

  7. java操作跨页的word cell,利用itext 生成pdf,处理cell 跨页问题 [转]

    处理方法: PdfPTable table =newPdfPTable(1); table.setSplitLate(false); table.setSplitRows(true); 开发中的例子: ...

  8. 搞点Python骚操作,自动美化excel表格

    今天就整点不一样的:用Python自动美化表格! 以前写过一篇文章,用Python爬虫爬取了全国20多个图书馆的热门借阅图书信息,并按照一定的规则做了统计汇总,得到了这一份大学生各领域必读TOP150 ...

  9. wps文档复制粘贴序号_wps 中word文档插入表格,如何插入的表格中实现 序号的自动 填写...

    wps 中word文档插入表格,如何插入的表格中实现 序号的自动 填写以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! w ...

最新文章

  1. 每日站会要关注团队目标-Scrum中文网
  2. I am too vegetable to all kill the 51nod problems on level 2 and 3.
  3. Boost:线程实例
  4. Android studio 清除缓存数据的步骤
  5. 数据结构六——堆的应用
  6. LeetCode题库5:最长回文子串——JavaScript解答
  7. android studio outline,AndroidStudio常用设置
  8. pycharm去除波浪线的方法
  9. html media设置自适应屏幕用法,css使用@media响应式适配各种屏幕的方法示例
  10. silvaco器件仿真bug整理
  11. 新入职软件安装-win10
  12. HTTP 多处理模块(MPM)
  13. Win10 易升更新 安装wls2 部署docker
  14. 基于OpenCV的火焰检测(二)——RGB颜色判据
  15. html字体及颜色设置
  16. 普通一本的计算机专业好就业吗,放弃985大学冷门专业,填报普通一本热门专业,值吗?...
  17. 服务器出错的原因有哪些
  18. linux 搜索文本手机号,Linux三剑客学习之提取手机号码
  19. elevation_mapping使用笔记
  20. U盘启动盘安装win10出现cdboot:couldn't find ntldr

热门文章

  1. 中国区海图列表 中国海图列表 中国电子海图000格式列表
  2. office Excel中的vlookup函数的使用
  3. HTML第六次作业笔记
  4. windows下命令行解压zip文件
  5. The dependencies of some of the beans in the application context form a cycle:
  6. 体育参数检验方法之一 T检验
  7. 了解Go编译处理(二)—— go build
  8. .nomedia文件的作用
  9. javaSE-实用类
  10. 自定义View,和Canvas(画布),Paint(画笔),Path(路径)的用法