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);
    }

實現結果

最後的實現結果上面的圖片就是一部分內容,還有最下面的一部分帶格式的表格:
這裏寫圖片描述

代碼鏈接

下面附上代碼連接:點我下載

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