前言
使用java操作word使用的是java開源項目docx4j,在學習docx的使用過程中,參考了大牛的鏈接,下面放上我參考過的網址:
上面的博主翻譯了一系列國外大神的博客,直接在他博客裏面查找就行了,下面開始講解一下我對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);
}
實現結果
最後的實現結果上面的圖片就是一部分內容,還有最下面的一部分帶格式的表格:
代碼鏈接
下面附上代碼連接:點我下載