java操作word

前言

使用java操作word使用的是java开源项目docx4j,在学习docx的使用过程中,参考了大牛的链接,下面放上我参考过的网址:

http://blog.csdn.net/zhyh1986/article/details/8766131

上面的博主翻译了一系列国外大神的博客,直接在他博客里面查找就行了,下面开始讲解一下我对docx的理解

word基本格式

一个编辑过的word文档可以直接使用winRAR打开,打开之后,可以看到里面有许许多多的xml文件,其中有一个叫做document.xml的文件就是你编辑的word文档,如下:
这里写图片描述
这里写图片描述
这里写图片描述
好像word的保存格式是基于openXML的一个东东的,具体的我也不太清楚,就不多说了

docx4j的使用

前面讲了那么多关于word的,docx4j是个什么东西呢?

docx4j是一个用于创建和操作Microsoft Open XML (Word docx, Powerpoint pptx, 和 Excel xlsx)文件的Java类库。
—————————以上摘自百度百科

我在上面显示出来的表格就是使用docx4j创建的,既然需要创建一个word里面的表格,那么需要用到下面一些类:

  • WordprocessingMLPackage : 整个word的生成就是它实现的
  • MainDocumentPart: 存有docx4j里面的许多对象,例如后面要讲到的Tbl、Tr等等,WordprocessingMLPackage就是将这个对象转换成word
  • Tbl :表格对象
  • TblPr:表格的属性,可以用来设置看边框
  • Tr : 表格里面的行
  • Tc : 表格里面的列
  • TcPr:表格列的属性
  • P : 一个文本端
  • R:一个运行块(貌似就是一段设置了styled的文本)
  • RPr:R对象的属性
  • Text:一段文本
  • VMerge:一个合并对象,这个对象由TcPr对象设置,如果不调用VMerge.setVal(“restart”),那么这个这一列下面的行都会被当前列合并
  • RFont:设置选中的文本的字体,通常由RPr设置
  • BooleanDefaultTrue:是否加粗,通常由RPr设置
  • U:是否加下划线,通常由RPr设置
  • HpsMeasure:字体大小,通常由RPr设置

上面是一些基本的对象,创建表格的步骤通常是先创建表格对象、然后创建行对象、再创建列对象,添加的顺序也是表格添加行、行添加列,这就类似二维数组的概念了,java里面只有一维数组,一维数组里面再有一维数组,然后就构成了二维数组,这个也是类似,表格里面只有行,行里面再有列,就构成了二维表格。
如果只要创建普通的表格,表格里面没有什么要求(例如文本加粗、加下划线、设置字体、设置字体大小)的话,可以直接使用Tc.getContent().add(P),就可以创建一列了:

    private static void addTableCell(Tr tableRow, String content, int width) {
        //使用object  factory创建表格列
        Tc tableCell = factory.createTc();
                    tableCell.getContent().add(pack.getMainDocumentPart().createParagraphOfText(content));
        //设置列宽
        setCellWidth(tableCell, width);
        tableRow.getContent().add(tableCell);
    }

设置列宽使用TcPr属性做的:

    private static void setCellWidth(Tc tableCell, int width) {
        TcPr properties = tableCell.getTcPr();
        if( properties == null) {
            properties = new TcPr();
        }
        TblWidth columnWidth = new TblWidth();
        columnWidth.setW(BigInteger.valueOf(width));
        properties.setTcW(columnWidth);
        tableCell.setTcPr(properties);
    }

上面是创建普通文本的表格列,下面创建带各种格式的文本的表格列,思路 是先创建一个P对象,然后再创建一个R对象,因为R对象是一个可以拥有样式的文本,叫做运行块(参考博主的翻译),然后通过列添加P,P添加R,R添加Text,这样就可以实现带样式的文本列了:

private static void  addTableCell(Tr tableRow, String content, int width, boolean bold, int fontSize) {
        Tc tableCell = factory.createTc();
        P paragraph = factory.createP();
        R run = factory.createR();
        Text text = factory.createText();
        text.setValue(content);
        run.getContent().add(text);
        paragraph.getContent().add(run);
        //创建R的属性
        RPr properties = factory.createRPr();
        if( bold ) {
            //设置是否加粗
            BooleanDefaultTrue b = new BooleanDefaultTrue();
            b.setVal(bold);
            properties.setB(b);
        }
        //设置字体大小
        HpsMeasure size = new HpsMeasure();
        size.setVal(BigInteger.valueOf(fontSize));
        properties.setSz(size);
        properties.setSzCs(size);
        run.setRPr(properties);
        tableCell.getContent().add(paragraph);
        //设置宽度
        setCellWidth(tableCell, width);
        tableRow.getContent().add(tableCell);
    }

创建合并列,应用场景,例如,一共有两行三列,其中第一列的一二行合并,那么实现这种方式可以使用VMerger对象,只要第一列的一二行都设置VMerge属性,那么就可以实现一二行合并,当然第一行要设置VMerge.setVal(“restart”)方法,这样第一行的列内容就会显示,第二行不设置这个值,就算往列里面添加内容也不会显示:

    private static void addMergeCell(Tr tableRow, String content, boolean merge, int width) {
        Tc tableCell = factory.createTc();
        TcPr prop = new TcPr();
        //创建合并对象
        VMerge mergeObj = new VMerge();
        if( merge ) {
            mergeObj.setVal("restart");
        }
        prop.setVMerge(mergeObj);
        tableCell.setTcPr(prop);
        setCellWidth(tableCell, width);
        tableCell.getContent().add(pack.getMainDocumentPart().  
                createParagraphOfText(content));
        tableRow.getContent().add(tableCell);
    }

实现结果

最后的实现结果上面的图片就是一部分内容,还有最下面的一部分带格式的表格:
这里写图片描述

代码链接

下面附上代码连接:点我下载

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章