POI操作Word文档工具

  • 1.POI简单介绍
  • 2.POI操作Word文档基本方法
  • 3.POI操作Word文档基本方法应用
  • 4.POI操作Word文档工具类
1.POI简单介绍
  • POIFS(可疑混淆执行文件系统):此组件是所有其他POI元素的基本因素。 它用于显式读取不同的文件。
  • HSSF(可怕的SpreadSheet格式):用于读取和写入.xls格式的MS-Excel文件。
  • XSSF(XML SpreadSheet格式):用于MS-Excel的.xlsx文件格式。
  • HPSF(可怕属性集格式):用于提取MS-Office文件的属性集。
  • HWPF(可怕字处理器格式):用于读取和写入MS-Word的.doc扩展文件。
  • XWPF(XML字处理器格式):用于读取和写入MS-Word的扩展文件 .docx 。
  • HSLF(可怕的幻灯片布局格式):用于阅读,创建和编辑PowerPoint演示文稿。
  • HDGF(Horrible DiaGram格式):它包含MS-Visio二进制文件的类和方法。
  • HPBF(Horrible PuBlisher格式):用于读取和写入MS-Publisher文件。
  • SXSSF:从POI 3.8版本开始,当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报内存溢出错误。这时应该用SXSSFworkbook。
2.POI操作Word文档基本方法
  • XWPFRun用于向段落中添加文本区域

    • addBreak() 指定中断应放置在运行内容中的当前位置
    • addTab() 指定制表符应放置在运行内容中的当前位置
    • setColor(String rgbStr) 设置文本颜色
    • setFontSize(int size) 指定在显示时应用于此运行内容中所有非复杂脚本字符的字体大小
    • setText(String value) 设置此文本运行的文本
    • setBold(boolean b) 是否应用粗体属性
  • XWPFRelation表示OOXML关系的描述符
  • CTHyperlink超链接
  • XWPFDocument它用于创建.docx文件格式的MS-Word文档
    • commit() 提交并保存文档
    • createParagraph() 在本文档中追加一个新段落
    • createTable() 默认情况下,创建一个包含一行和一列的空表
    • createTOC() == 创建Word文档的内容表==
    • getParagraphs() 返回包含页眉或页脚文本的段落
    • getStyle() 返回使用的样式对象
  • XWPFParagraph用于在Word文档中创建段落
    • createRun() 新运行附加到此段落
    • getAlignment() 返回将应用于本段文本的段落对齐方式
    • setAlignment(ParagraphAlignment align) 指定应适用于本段文本的段落对齐方式
    • setBorderBottom(Borders border) 指定应显示在一组段落下方的边框
    • setBorderRight(Borders border) 指定应在页面右侧围绕指定段落显示的边框
  • XWPFStyle用于向word文档中的对象元素添加不同的样式
    • getNextStyleID() 它用于获取下一个样式的StyleID
    • getStyleId() 它用于获取样式的StyleID
    • getStyles() 它用于获取样式
    • setStyleId(String styleId) == 它用于设置styleID==
  • XWPFTable用于将表数据添加到Word文档中
    • addNewCol() 为此表中的每一行添加一个新列
    • addRow(XWPFTableRow row,int pos) 在位置pos处向表中添加一个新行
    • createRow() 创建一个新的XWPFTableRow对象
    • setWidth(int width) 设置列的宽度
  • XWPFWordExtractor用于从Word文档中提取简单文本
    • getText() 检索文档中的所有文本
3.POI操作Word文档基本方法应用
  • 以下简单程序用于创建空白MS-Word文档
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
public class CreateDocument{public static void main(String[] args)throws Exception{//空白文档XWPFDocument document= new XWPFDocument();//写文件FileOutputStream out = new FileOutputStream(new File("createdocument.docx"));document.write(out);out.close();System.out.println("createdocument.docx written successully");}
}
  • 以下代码用于将数据写入段落
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
public class CreateParagraph{public static void main(String[] args)throws Exception {XWPFDocument document= new XWPFDocument();FileOutputStream out = new FileOutputStream(new File("createparagraph.docx"));//创建段落XWPFParagraph paragraph = document.createParagraph();XWPFRun run=paragraph.createRun();run.setText("At tutorialspoint.com, we strive hard to provide " +"quality tutorials for self-learning purpose in the domains of Academics, Information " +"Technology, Management and Computer Programming Languages.");document.write(out);out.close();System.out.println("createparagraph.docx written successfully");}
}
  • 以下代码用于在文档中应用边框:
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.Borders;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
public class ApplyingBorder{public static void main(String[] args)throws Exception{XWPFDocument document= new XWPFDocument();FileOutputStream out = new FileOutputStream(new File("applyingborder.docx"));XWPFParagraph paragraph = document.createParagraph();//设置边框paragraph.setBorderBottom(Borders.BASIC_BLACK_DASHES);paragraph.setBorderLeft(Borders.BASIC_BLACK_DASHES);paragraph.setBorderRight(Borders.BASIC_BLACK_DASHES);paragraph.setBorderTop(Borders.BASIC_BLACK_DASHES);XWPFRun run=paragraph.createRun();run.setText("At tutorialspoint.com, we strive hard to provide " +"quality tutorials for self-learning purpose in the domains of Academics, Information " +"Technology, Management and Computer Programming Languages.");document.write(out);out.close();System.out.println("applyingborder.docx written successully");}
}
  • 以下代码用于在文档中创建表
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
public class CreateTable{public static void main(String[] args)throws Exception{XWPFDocument document= new XWPFDocument();FileOutputStream out = new FileOutputStream(new File("create_table.docx"));//创建表格XWPFTable table = document.createTable();//创建第一行XWPFTableRow tableRowOne = table.getRow(0);tableRowOne.getCell(0).setText("col one, row one");tableRowOne.addNewTableCell().setText("col two, row one");tableRowOne.addNewTableCell().setText("col three, row one");//创建第二行XWPFTableRow tableRowTwo = table.createRow();tableRowTwo.getCell(0).setText("col one, row two");tableRowTwo.getCell(1).setText("col two, row two");tableRowTwo.getCell(2).setText("col three, row two");//创建第三行XWPFTableRow tableRowThree = table.createRow();tableRowThree.getCell(0).setText("col one, row three");tableRowThree.getCell(1).setText("col two, row three");tableRowThree.getCell(2).setText("col three, row three");document.write(out);out.close();System.out.println("create_table.docx written successully");}
}
  • 以下代码用于设置不同样式的字体:
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.VerticalAlign;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
public class FontStyle{public static void main(String[] args)throws Exception{XWPFDocument document= new XWPFDocument();FileOutputStream out = new FileOutputStream(new File("fontstyle.docx"));XWPFParagraph paragraph = document.createParagraph();//设置粗体和斜体XWPFRun paragraphOneRunOne = paragraph.createRun();paragraphOneRunOne.setBold(true);paragraphOneRunOne.setItalic(true);paragraphOneRunOne.setText("Font Style");paragraphOneRunOne.addBreak();//设置文本位置XWPFRun paragraphOneRunTwo = paragraph.createRun();paragraphOneRunTwo.setText("Font Style two");paragraphOneRunTwo.setTextPosition(100);//设置删除线、字体大小和下标XWPFRun paragraphOneRunThree = paragraph.createRun();paragraphOneRunThree.setStrike(true);paragraphOneRunThree.setFontSize(20);paragraphOneRunThree.setSubscript(VerticalAlign.SUBSCRIPT);paragraphOneRunThree.setText(" Different Font Styles");document.write(out);out.close();System.out.println("fontstyle.docx written successully");}
}
  • 以下代码用于设置与段落文本的对齐方式:
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
public class AlignParagraph{public static void main(String[] args)throws Exception{XWPFDocument document= new XWPFDocument();FileOutputStream out = new FileOutputStream(new File("alignparagraph.docx"));XWPFParagraph paragraph = document.createParagraph();//设置向右对齐paragraph.setAlignment(ParagraphAlignment.RIGHT);XWPFRun run=paragraph.createRun();run.setText("At tutorialspoint.com, we strive hard to provide " +"quality tutorials for self-learning purpose in the domains of Academics, Information " +"Technology, Management and Computer Programming Languages.");//创建另一段paragraph=document.createParagraph();//居中对齐paragraph.setAlignment(ParagraphAlignment.CENTER);run.setText("At tutorialspoint.com, we strive hard to provide " +"quality tutorials for self-learning purpose in the domains of Academics, Information " +"Technology, Management and Computer Programming Languages.");document.write(out);out.close();System.out.println("alignparagraph.docx written successfully");}
}
  • 以下代码显示如何从Word文件提取简单文本:
import java.io.FileInputStream;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
public class WordExtractor{public static void main(String[] args)throws Exception{XWPFDocument docx = new XWPFDocument(new FileInputStream("create_paragraph.docx"));//使用文本提取XWPFWordExtractor we = new XWPFWordExtractor(docx);System.out.println(we.getText());}
}
4.POI操作Word文档工具类

文本样式类

package com.office.utils;
import lombok.Data;
/**- 文本样式
*/
@Data
public class TextStyle {/*** 超链接*/private String url;/*** 文本内容*/private String text;/*** 字体*/private String fontFamily;/*** 字体大小*/private String fontSize;/*** 字体颜色*/private String colorVal;/*** 底纹颜色*/private String shdColor;/*** 文本位置*/private int position;/*** 间距*/private int spacingValue;/*** 缩进*/private int indent;/*** 加粗*/private boolean isBlod;/*** 文本内容*/private boolean isUnderLine;/*** 下划线颜色*/private boolean underLineColor;/*** 倾斜*/private boolean isItalic;/*** 删除线*/private boolean isStrike;/*** 双删除线*/private boolean isDStrike;/*** 阴影*/private boolean isShadow;/*** 隐藏*/private boolean isVanish;/*** 阳文*/private boolean isEmboss;/*** 阴文*/private boolean isImprint;/*** 空心*/private boolean isOutline;/*** 突出显示文本*/private boolean isHightLight;/*** 底纹*/private boolean isShd;
}

段落样式类

package com.office.utils;
import lombok.Data;
/**- 段落样式
*/
@Data
public class ParagraphStyle {/*** 是否缩进*/private boolean isSpace;/*** 段前磅数*/private String before;/*** 段后磅数*/private String after;/*** 段前行数*/private String beforeLines;/*** 段后行数*/private String afterLines;/*** 是否间距*/private boolean isLine;/*** 间距距离*/private String line;/*** 段落缩进信息*/private String firstLine;private String firstLineChar;private String hanging;private String hangingChar;private String right;private String rightChar;private String left;private String leftChar;
}

文本段落工具类

package com.office.utils;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.TextAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFPicture;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;
import org.apache.poi.xwpf.usermodel.XWPFRelation;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule;
/**- <p>- 基本概念说明:XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档- XWPFParagraph    代表文档、表格、标题等种的段落,由多个XWPFRun组成- XWPFRun          代表具有同样风格的一段文本- XWPFTable        代表一个表格- XWPFTableRow     代表表格的一行- XWPFTableCell    代表表格的一个单元格- XWPFChar         表示.docx文件中的图表- XWPFHyperlink    表示超链接- XWPFPicture      代表图片- <p>- 注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。- @Description 设置docx文档的样式及一些操作
*/
class DocumentParagraphUtils {private static Logger logger = Logger.getLogger(DocumentParagraphUtils.class.toString());/*** 创建一个word对象*/public XWPFDocument createDocument() {XWPFDocument document;document = new XWPFDocument();return document;}/*** 打开word文档*/public XWPFDocument openDoc(String path) throws IOException {InputStream is = new FileInputStream(path);return new XWPFDocument(is);}/*** 保存word文档*/public void saveDocument(XWPFDocument document, String savePath) throws IOException {OutputStream os = new FileOutputStream(savePath);document.write(os);os.close();}/*** 设置段落文本样式  设置超链接及样式*/public void addParagraphTextHyperlink(XWPFParagraph paragraph, TextStyle textStyle) {String id = paragraph.getDocument().getPackagePart().addExternalRelationship(textStyle.getUrl(),XWPFRelation.HYPERLINK.getRelation()).getId();//追加链接并将其绑定到关系中CTHyperlink cLink = paragraph.getCTP().addNewHyperlink();cLink.setId(id);//创建链接文本CTText ctText = CTText.Factory.newInstance();ctText.setStringValue(textStyle.getText());CTR ctr = CTR.Factory.newInstance();CTRPr rpr = ctr.addNewRPr();//以下设置各种样式 详情看TextStyle类if (!"".equals(textStyle.getFontFamily()) && textStyle.getFontFamily() != null) {CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();fonts.setAscii(textStyle.getFontFamily());//...}//设置字体大小}/*** 设置段落的基本样式  设置段落间距信息, 一行 = 100    一磅=20*/public void setParagraphSpacingInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle, STLineSpacingRule.Enum lineValue) {CTPPr pPPr = getParagraphCTPPr(paragraph);CTSpacing pSpacing = pPPr.getSpacing() != null ? pPPr.getSpacing() : pPPr.addNewSpacing();if (paragStyle.isSpace()) {//段前磅数if (paragStyle.getBefore() != null) {pSpacing.setBefore(new BigInteger(paragStyle.getBefore()));}//段后磅数if (paragStyle.getAfter() != null) {pSpacing.setAfter(new BigInteger(paragStyle.getAfter()));}//依次设置段前行数、段后行数//...}//间距if (paragStyle.isLine()) {if (paragStyle.getLine() != null) {pSpacing.setLine(new BigInteger(paragStyle.getLine()));}if (lineValue != null) {pSpacing.setLineRule(lineValue);}}}/*** 设置段落缩进信息  1厘米 约等于 567*/public void setParagraphIndInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle) {CTPPr pPPr = getParagraphCTPPr(paragraph);CTInd pInd = pPPr.getInd() != null ? pPPr.getInd() : pPPr.addNewInd();if (paragStyle.getFirstLine() != null) {pInd.setFirstLine(new BigInteger(paragStyle.getFirstLine()));}//再进行其他设置//...}/*** 设置段落对齐 方式*/public void setParagraphAlignInfo(XWPFParagraph paragraph, ParagraphAlignment pAlign, TextAlignment valign) {if (pAlign != null) {paragraph.setAlignment(pAlign);}if (valign != null) {paragraph.setVerticalAlignment(valign);}}/*** 得到段落的CTPPr*/public CTPPr getParagraphCTPPr(XWPFParagraph paragraph) {CTPPr pPPr = null;if (paragraph.getCTP() != null) {if (paragraph.getCTP().getPPr() != null) {pPPr = paragraph.getCTP().getPPr();} else {pPPr = paragraph.getCTP().addNewPPr();}}return pPPr;}/*** 得到XWPFRun的CTRPr*/public CTRPr getRunCTRPr(XWPFParagraph paragraph, XWPFRun pRun) {CTRPr ctrPr = null;if (pRun.getCTR() != null) {ctrPr = pRun.getCTR().getRPr();if (ctrPr == null) {ctrPr = pRun.getCTR().addNewRPr();}} else {ctrPr = paragraph.getCTP().addNewR().addNewRPr();}return ctrPr;}/*** 复制表格*/public void copyTable(XWPFTable targetTable, XWPFTable sourceTable) {//复制表格属性targetTable.getCTTbl().setTblPr(sourceTable.getCTTbl().getTblPr());//复制行for (int i = 0; i < sourceTable.getRows().size(); i++) {XWPFTableRow targetRow = targetTable.getRow(i);XWPFTableRow sourceRow = sourceTable.getRow(i);if (targetRow == null) {targetTable.addRow(sourceRow);} else {copyTableRow(targetRow, sourceRow);}}}/*** 复制单元格*/public void copyTableRow(XWPFTableRow targetRow, XWPFTableRow sourceRow) {//复制样式if (sourceRow != null) {targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());}//复制单元格assert sourceRow != null;for (int i = 0; i < sourceRow.getTableCells().size(); i++) {XWPFTableCell tCell = targetRow.getCell(i);XWPFTableCell sCell = sourceRow.getCell(i);if (tCell == sCell) {tCell = targetRow.addNewTableCell();}copyTableCell(tCell, sCell);}}/*** 复制单元格(列) 从sourceCell到targetCell*/public void copyTableCell(XWPFTableCell targetCell, XWPFTableCell sourceCell) {//表格属性if (sourceCell.getCTTc() != null) {targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());}//删除段落for (int pos = 0; pos < targetCell.getParagraphs().size(); pos++) {targetCell.removeParagraph(pos);}//添加段落for (XWPFParagraph sourceParag : sourceCell.getParagraphs()) {XWPFParagraph targetParag = targetCell.addParagraph();copyParagraph(targetParag, sourceParag);}}/*** 复制段落,从sourceParag到targetParag*/public void copyParagraph(XWPFParagraph targetParag, XWPFParagraph sourceParag) {//设置段落样式targetParag.getCTP().setPPr(sourceParag.getCTP().getPPr());//移除所有的runfor (int pos = targetParag.getRuns().size() - 1; pos >= 0; pos--) {targetParag.removeRun(pos);}//copy新的runfor (XWPFRun sRun : sourceParag.getRuns()) {XWPFRun tarRun = targetParag.createRun();copyRun(tarRun, sRun);}}/*** 复制XWPFRun 从sourceRun到targetRun*/public void copyRun(XWPFRun targetRun, XWPFRun sourceRun) {//设置targetRun属性targetRun.getCTR().setRPr(sourceRun.getCTR().getRPr());//设置文本targetRun.setText(sourceRun.text());//处理图片List<XWPFPicture> pictures = sourceRun.getEmbeddedPictures();for (XWPFPicture picture : pictures) {try {copyPicture(targetRun, picture);} catch (InvalidFormatException | IOException e) {e.printStackTrace();logger.log(Level.WARNING, "copyRun", e);}}}/*** 复制图片从sourcePicture到 targetRun(XWPFPicture --> XWPFRun)*/public void copyPicture(XWPFRun targetRun, XWPFPicture sourcePicture) throws InvalidFormatException, IOException {XWPFPictureData picData = sourcePicture.getPictureData();//图片的名称String fileName = picData.getFileName();InputStream picInIsData = new ByteArrayInputStream(picData.getData());int picType = picData.getPictureType();int width = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCx();int height = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCy();targetRun.addPicture(picInIsData, picType, fileName, width, height);
//        targetRun.addBreak();//分行}
}

文本表格工具类

package com.office.utils;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.xwpf.usermodel.BodyElementType;
import org.apache.poi.xwpf.usermodel.IBodyElement;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHeight;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGridCol;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTrPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
/**- @Description 操作word表格的基本工具类
*/
public class DocumentTableUtils {/*** 删除指定位置的表格,被删除表格后的索引位置*/public void deleteTableByIndex(XWPFDocument document, int pos) {Iterator<IBodyElement> bodyElement = document.getBodyElementsIterator();int eIndex = 0, tableIndex = -1;while (bodyElement.hasNext()) {IBodyElement element = bodyElement.next();BodyElementType elementType = element.getElementType();if (elementType == BodyElementType.TABLE) {tableIndex++;if (tableIndex == pos) {break;}}eIndex++;}document.removeBodyElement(eIndex);}/*** 获得指定位置的表格*/public XWPFTable getTableByIndex(XWPFDocument document, int index) {List<XWPFTable> tableList = document.getTables();if (tableList == null || index < 0 || index > tableList.size()) {return null;}return tableList.get(index);}/*** 得到表格的内容(第一次跨行单元格视为一个,第二次跳过跨行合并的单元格)*/public List<List<String>> getTableRConten(XWPFTable table) {List<List<String>> tableContextList = new ArrayList<>();for (int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {XWPFTableRow row = table.getRow(rowIndex);List<String> cellContentList = new ArrayList<>();for (int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++) {XWPFTableCell cell = row.getCell(colIndex);CTTc ctTc = cell.getCTTc();if (ctTc.isSetTcPr()) {CTTcPr tcPr = ctTc.getTcPr();if (tcPr.isSetHMerge()) {CTHMerge hMerge = tcPr.getHMerge();if (STMerge.RESTART.equals(hMerge.getVal())) {cellContentList.add(getTableCellContent(cell));}} else if (tcPr.isSetVMerge()) {CTVMerge vMerge = tcPr.getVMerge();if (STMerge.RESTART.equals(vMerge.getVal())) {cellContentList.add(getTableCellContent(cell));}} else {cellContentList.add(getTableCellContent(cell));}}}tableContextList.add(cellContentList);}return tableContextList;}/*** 获得一个表格的单元格的内容*/public String getTableCellContent(XWPFTableCell cell) {StringBuilder sb = new StringBuilder();List<XWPFParagraph> cellParagList = cell.getParagraphs();if (cellParagList != null && cellParagList.size() > 0) {for (XWPFParagraph xwpfPr : cellParagList) {List<XWPFRun> runs = xwpfPr.getRuns();if (runs != null && runs.size() > 0) {for (XWPFRun xwpfRun : runs) {sb.append(xwpfRun.getText(0));}}}}return sb.toString();}/*** 得到表格内容,合并后的单元格视为一个单元格*/public List<List<String>> getTableContent(XWPFTable table) {List<List<String>> tableContentList = new ArrayList<>();for (int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {XWPFTableRow row = table.getRow(rowIndex);List<String> cellContentList = new ArrayList<>();for (int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++) {XWPFTableCell cell = row.getCell(colIndex);cellContentList.add(getTableCellContent(cell));}tableContentList.add(cellContentList);}return tableContentList;}/*** 跨列合并*/public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {XWPFTableCell cell = table.getRow(row).getCell(cellIndex);if (cellIndex == fromCell) {cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);} else {cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);}}}/*** 跨行合并*/public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {XWPFTableCell cell = table.getRow(rowIndex).getCell(col);//第一个合并单元格用重启合并值设置if (rowIndex == fromRow) {cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);} else {//合并第一个单元格的单元被设置为“继续”cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);}}}/*** 创建表格, 创建后表格至少有1行1列, 设置列宽*/public XWPFTable createTable(XWPFDocument xdoc, int rowSize, int cellSize,boolean isSetColWidth, int[] colWidths) {XWPFTable table = xdoc.createTable(rowSize, cellSize);if (isSetColWidth) {CTTbl ttbl = table.getCTTbl();CTTblGrid tblGrid = ttbl.addNewTblGrid();for (int j = 0, len = Math.min(cellSize, colWidths.length); j < len; j++) {CTTblGridCol gridCol = tblGrid.addNewGridCol();gridCol.setW(new BigInteger(String.valueOf(colWidths[j])));}}return table;}/*** 设置表格总宽度与水平对齐方式*/public void setTableWidthAndHAlign(XWPFTable table, String width,STJc.Enum enumValue) {CTTblPr tblPr = getTableCTTblPr(table);// 表格宽度CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();if (enumValue != null) {CTJc cTJc = tblPr.addNewJc();cTJc.setVal(enumValue);}// 设置宽度tblWidth.setW(new BigInteger(width));tblWidth.setType(STTblWidth.DXA);}/*** 得到Table的CTTblPr, 不存在则新建*/public CTTblPr getTableCTTblPr(XWPFTable table) {CTTbl ttbl = table.getCTTbl();// 表格属性CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();return tblPr;}/*** 设置表格行高*/public void setTableHeight(XWPFTable infoTable, int heigth, STVerticalJc.Enum vertical) {List<XWPFTableRow> rows = infoTable.getRows();for (XWPFTableRow row : rows) {CTTrPr trPr = row.getCtRow().addNewTrPr();CTHeight ht = trPr.addNewTrHeight();ht.setVal(BigInteger.valueOf(heigth));List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell tableCell : cells) {CTTcPr cttcpr = tableCell.getCTTc().addNewTcPr();cttcpr.addNewVAlign().setVal(vertical);}}}
}

POI操作Word文档工具相关推荐

  1. poi操作word文档总结

    POI分段落生成纯Word动态模板并导入数据 导出数据,可以用word另存为xml格式的ftl文件,变量用${变量名}表示,然后在类中通过 freemarker去替换变量. 但是怎么导入word数据. ...

  2. [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能)

    [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能) 基于Apache POI对Word进行操作 一.基于Apache POI封装的word文档工具V1. ...

  3. 使用poi操作word文档实现套打功能

    使用poi操作word文档实现套打功能 本文目的是为了分享一个实现套打功能,但是不同于简单的word的文本替换而是采用poi对word的文本框就行操作实现的功能: poi中各种jar的说明 套打的实现 ...

  4. Poi 操作Word文档设置页边距 解决CTPageMar类找不到

    Poi操作Word文档设置页边距 CTPageMar类找不到 已解决 在百度上搜了一顿,找到了相关的解决方案,但是缺失了一个类,在百度怎么也找不到! 给大家一个参考数据 1厘米≈567 CTSectP ...

  5. spire.doc操作word文档工具类(自用)

    如果有相关问题,可以一起研究下 引入依赖 <dependencies> <dependency><groupId>e-iceblue</groupId> ...

  6. POI操作word文档-添加上标下标

    背景: 接了新需求,前端提供一个大概的word模板,包含通用信息,用户在前端填写可修改内容至模板完善,然后将整个数据传递给后端进行保存,后端提供导出word的功能. 数据中包含这种类型,由于前端输出框 ...

  7. POI操作word文档,生成书签

    近期做动态的word文档生成, 需要在指定XWPFRun生成书签的功能,有两种情况: 创建新word文档时候,直接在createRun前后调用生成书签的方法 XWPFRun oldRun = runs ...

  8. poi处理word内容的公式_利用poi操作word文档

    关键字:POI JAVA 批注 总页数 总字符数 一:认识POI Apache POI是一个开源的利用Java读写Excel.WORD等微软OLE2组件文档的项目.最新的3.5版本有很多改进,加入了对 ...

  9. 利用poi操作word文档(针对docx格式)

    一:认识POI  Apache POI是一个开源的利用Java读写Excel.WORD等微软OLE2组件文档的项目.最新的3.5版本有很多改进,加入了对采用OOXML格式的Office 2007支持, ...

最新文章

  1. 事务RFC(TRFC)原理和实战解析
  2. 【笔记】分离字符串中的数字、字母和汉字
  3. mysql高可靠部署_可能是我见过最好的 MySQL 高可用解决方案 MySQL InnoDB Cluster 中文教程!...
  4. 用PDB库调试Python程序
  5. hp-socket 文本跟图片同时发送_文本、截图和应用,这样「包装」一秒变美观
  6. 前端:background背景图
  7. python3安装scrapy及使用方法(爬虫框架)
  8. javascript常用工具类整理(copy)
  9. springboot中spring.profiles.active来引入多个properties文件 Springboot获取容器中对象
  10. 关于浏览器兼容的问题
  11. 将ttc改为otf_几种字体格式的区别otf/ttf/ttc格式字体的区别
  12. 电脑如何接受邮件服务器,什么是传入邮件服务器?
  13. 其他总结(三)--window关闭或打开资源管理器
  14. Flask基础--思维导图
  15. 关于同比和环比的几个问题
  16. 华为、微软、戴尔等企业将参加“多哈智慧城市博览会”
  17. 关于Random(47)与randon.nextInt(100)的区别
  18. lottie轻松实现复杂动画(抽奖举例)
  19. windows num_workers
  20. Python数据标准化处理

热门文章

  1. android 多屏异屏显
  2. android免root自动化,免root自动化安卓助手
  3. FirePower X2 14.0.1 for RAD Studio Alexandria
  4. python开三次方函数_python开3次方
  5. Windows 2008 设置用户密码永不过期
  6. 滤芯怎么换 石头机器人_石头扫地机滤网怎么洗_小米扫地机滤网更换步骤_小米扫地机滤网...
  7. 马上消费成长内幕:一次金融底色、技术信仰的征程
  8. 三端式LC振荡器的组成原则
  9. 蓝牙运动耳机哪个牌子最专业、最专业的蓝牙运动耳机品牌排行
  10. 单向测径仪助力各行各业自动化生产