運用Poi的XWPF操作word文檔
Word文檔基礎知識的簡介
word文檔包括 頁眉、頁腳、腳註、批註、鏈接、正文部分,在XWPF中都有與之對應的類:
.docx文件的文檔的根 XWPFDocument
頁眉 XWPFHeader
頁腳 XWPFFooter
腳註 XWPFFootnote
批註 XWPFComment
鏈接 XWPFHyperlink
內容主體
頁眉,頁腳,腳註,內容主體部分由 段落(XWPFParagraph)、表格(XWPFTable)、圖片(XWPFPicture)部分組成.每個類都有相應豐富的方法。瞭解了這些結構,對於掌握XWPF有很大幫助。每一個XWPF類型,都有與之對應的CT*,個人認爲CT*更接近底層操作.
XWPFParagraph 文檔、表格、標題等中的段落
CTP ctp = para.getCTP();段落可以設置對齊方式,字體,設置標籤等操作。
//遍歷段落
XWPFParagraph para = ...;
//通過ctp直接獲取相應的段落
XWPFParagraph paraOther = document.getParagraph(ctp)
List <XWPFRun> runs = para.getRuns();
for (XWPFRun run : runs) {
CTR ctr = run.getCTR();
System.out.println(run.getText(0));
}
//刪除段落
para.getDocument().removeBodyElement(para.getDocument().getPosOfParagraph(para));
XWPFRun 相同屬性設置的文本區域
CTR ctr = run.getCTR(); XWPFRun是組成XWPFParagraph等元素,對於文本的操作更細緻化的在這一個類,區分段落中的XWPFRun非常不容易,因爲每個XWPFRun不同體現在很多因素。
XWPFRun run = ..
XWPFRun runOther = para.getRun(ctr);
run.setText(value, pos);
run.getText(0)
//刪除
para.removeRun(index)
XWPFTable 文檔中的表格
CTTbl ct = table.getCTTbl();表格存在行(XWPFTableRow), 每行存在單元格(XWPFTableCell), 每個單元格有段落(XWPFParagraph) 遍歷表格:
List<XWPFTableRow> rows = table.getRows();
CTTbl ct = table.getCTTbl();
System.out.println("table text\t" + table.getText());
System.out.println("Table rowBandSize:\t" + table.getRowBandSize());
for (XWPFTableRow row : rows) {
CTRow ctrow = row.getCtRow();
XWPFTableRow rowother = table.getRow(ctrow);
List<ICell> cells = row.getTableICells();
List<XWPFTableCell> xcells = row.getTableCells();
for (XWPFTableCell cell: xcells) {
CTTc cttc = cell.getCTTc();
XWPFTableCell otherCell = row.getTableCell(cttc);
System.out.println("cell text\t" + cell.getText());
}
}
合併單元格
//跨行跨列合併
public void mergeCells(XWPFTable table, int fromrow, int endrow, int fromcell, int endcell) {
//先合併行
for (int rowindex = fromrow; rowindex <= endrow; rowindex++) {
XWPFTableRow row = table.getRow(rowindex);
if (rowindex == fromrow) {
row.getCell(fromcell).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
} else {
row.getCell(fromcell).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
}
//合併列
for (int rowindex = fromrow; rowindex <= endrow; rowindex++) {
for (int cellindex = fromcell; cellindex <= endcell; cellindex++) {
XWPFTableCell cell = table.getRow(rowindex).getCell(cellindex);
if (cellindex == fromcell) {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
}
//跨列合併
public void mergeCellsByCol(XWPFTable table, int rowindex, int fromcell, int endcell) {
for (int cellindex = fromcell; cellindex <= endcell; cellindex++) {
XWPFTableCell cell = table.getRow(rowindex).getCell(cellindex);
if (cellindex == fromcell) {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
//跨行合併
public void mergeCellByRow(XWPFTable table, int cellindex, int fromrow, int endrow) {
for (int rowindex = fromrow; rowindex <= endrow; rowindex++) {
XWPFTableRow row = table.getRow(rowindex);
if (rowindex == fromrow) {
row.getCell(cellindex).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
} else {
row.getCell(cellindex).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
}
}
XWPFPictureData 文檔中的圖片
List<XWPFPictureData> pictureDatas = document.getAllPictures();
public void watchPicture(XWPFPictureData pdata) {
System.out.println("圖片名稱:\t" + pdata.getFileName());
System.out.println("圖片類型:\t" + pdata.getPictureType());
byte[] data = pdata.getData();
}
word轉HTML
public void wordToHtml() throws XWPFConverterException, IOException {
//圖片存儲
File imageFolderFile = new File("d:/test/media");
XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imageFolderFile));
options.setExtractor(new FileImageExtractor(imageFolderFile));
OutputStream out = new FileOutputStream("E:/test/wth.html");
XHTMLConverter.getInstance().convert(document, out, options);
out.close();
}