第一步:引入poi相关包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
第二步:创建工具类
public class WordTool {
public static final String TITLE_FIRST = "一、级标题";
public static final String TITLE_SECOND = "二、级标题";
public static final String TITLE_THIRD = "三、级标题";
public static final String TITLE_FOURTH = "四、级标题";
@SneakyThrows
public static void write(XWPFDocument document, String path) {
FileOutputStream fileOut = new FileOutputStream(path);
document.write(fileOut);
fileOut.close();
}
public static void createTitle(XWPFDocument document, String style, String text) {
XWPFParagraph paragraph = document.createParagraph();
paragraph.setPageBreak(false);
paragraph.setStyle(style);
XWPFRun run = paragraph.createRun();
run.setFontFamily("黑体");
run.setFontSize(22);
run.setText(text);
}
public static void createText(XWPFDocument document, String txt) {
XWPFParagraph remark = document.createParagraph();
remark.setAlignment(ParagraphAlignment.CENTER);
XWPFRun remarkRun = remark.createRun();
remarkRun.setFontFamily("宋体");
remarkRun.setBold(true);
remarkRun.setFontSize(20);
remarkRun.setText(txt);
}
public static void createText(XWPFDocument document, String txt, boolean bold, int fontSize, ParagraphAlignment paragraphAlignment) {
XWPFParagraph remark = document.createParagraph();
remark.setAlignment(paragraphAlignment);
XWPFRun remarkRun = remark.createRun();
remarkRun.setFontFamily("宋体");
remarkRun.setBold(bold);
remarkRun.setFontSize(fontSize);
remarkRun.setText(txt);
}
public static void createText(XWPFDocument document, String txt, ParagraphAlignment paragraphAlignment) {
XWPFParagraph remark = document.createParagraph();
remark.setAlignment(paragraphAlignment);
XWPFRun remarkRun = remark.createRun();
remarkRun.setFontFamily("宋体");
remarkRun.setBold(false);
remarkRun.setFontSize(20);
remarkRun.setText(txt);
}
public static XWPFTable createTable(XWPFDocument document, int rows, int cols) {
XWPFTable table = document.createTable(rows, cols);
table.setCellMargins(200, 200, 200, 200);
CTTbl bl = table.getCTTbl();
CTTblPr pr = bl.getTblPr() == null ? bl.addNewTblPr() : bl.getTblPr();
CTTblWidth tblWidth = pr.addNewTblW();
tblWidth.setW(BigInteger.valueOf(9000));
tblWidth.setType(STTblWidth.DXA);
return table;
}
public static 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);
}
}
}
public static 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);
}
}
}
@SneakyThrows
public static void createPicture(XWPFDocument document, String path) {
File pictureFile = FileUtil.file(path);
if (!pictureFile.exists()) {
return;
}
InputStream inputStream = new FileInputStream(pictureFile);
XWPFParagraph paragraph = document.createParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);
paragraph.createRun().addPicture(inputStream, XWPFDocument.PICTURE_TYPE_PNG, "picture", Units.toEMU(200), Units.toEMU(200));
closeStream(inputStream);
}
public static void closeStream(Closeable... closeAbles) {
for (Closeable c : closeAbles) {
if (c != null) {
try {
c.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, int headingLevel) {
CTStyle ctStyle = CTStyle.Factory.newInstance();
ctStyle.setStyleId(strStyleId);
CTString styleName = CTString.Factory.newInstance();
styleName.setVal(strStyleId);
ctStyle.setName(styleName);
CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
indentNumber.setVal(BigInteger.valueOf(headingLevel));
ctStyle.setUiPriority(indentNumber);
CTOnOff onoffnull = CTOnOff.Factory.newInstance();
ctStyle.setUnhideWhenUsed(onoffnull);
ctStyle.setQFormat(onoffnull);
CTPPr ppr = CTPPr.Factory.newInstance();
ppr.setOutlineLvl(indentNumber);
ctStyle.setPPr(ppr);
XWPFStyle style = new XWPFStyle(ctStyle);
XWPFStyles styles = docxDocument.createStyles();
style.setType(STStyleType.PARAGRAPH);
styles.addStyle(style);
}
public static String nullToEmpty(Object obj) {
if (Objects.isNull(obj)) {
return StringUtils.EMPTY;
}
return String.valueOf(obj);
}
@SneakyThrows
public static void createPieChart(XWPFDocument document, List<String> xDataList,
List<Integer> yDataList, String titleText,
String pieTitleText) {
XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);
chart.setTitleText(titleText);
chart.setTitleOverlay(false);
XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.RIGHT);
String[] xAxisData = xDataList.toArray(new String[0]);
XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData);
Integer[] yAxisData = yDataList.toArray(new Integer[0]);
XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData);
XDDFPieChartData pieChart = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null);
pieChart.setVaryColors(true);
XDDFPieChartData.Series pieSeries = (XDDFPieChartData.Series) pieChart.addSeries(xAxisSource, yAxisSource);
pieSeries.setTitle(pieTitleText, null);
pieSeries.setShowLeaderLines(true);
chart.plot(pieChart);
}
public void changeParagraphText(XWPFDocument document, Map<String, String> textMap) {
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
String text = paragraph.getText();
if (checkText(text)) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
run.setText(changeValue(run.toString(), textMap), 0);
}
}
}
}
public void changeTableText(XWPFDocument document, List<Map<String, String>> tableTextList) {
List<XWPFTable> tables = document.getTables();
for (int i = 0; i < tables.size(); i++) {
Map<String, String> textMap = tableTextList.get(i);
XWPFTable table = tables.get(i);
if (table.getRows().size() > 1) {
if (checkText(table.getText())) {
List<XWPFTableRow> rows = table.getRows();
eachTable(rows, textMap);
}
}
}
}
public static boolean checkText(String text) {
boolean check = false;
if (text.indexOf("$") != -1) {
check = true;
}
return check;
}
public static String changeValue(String value, Map<String, String> textMap) {
Set<Map.Entry<String, String>> textSets = textMap.entrySet();
for (Map.Entry<String, String> textSet : textSets) {
String key = "${" + textSet.getKey() + "}";
if (value.indexOf(key) != -1) {
value = textSet.getValue();
}
}
if (checkText(value)) {
value = "";
}
return value;
}
public static void eachTable(List<XWPFTableRow> rows, Map<String, String> textMap) {
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
if (checkText(cell.getText())) {
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
run.setText(changeValue(run.toString(), textMap), 0);
}
}
}
}
}
}
static CellReference setTitleInDataSheet(XWPFChart chart, String title, int column) throws Exception {
XSSFWorkbook workbook = chart.getWorkbook();
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFRow row = sheet.getRow(0);
if (row == null)
row = sheet.createRow(0);
XSSFCell cell = row.getCell(column);
if (cell == null)
cell = row.createCell(column);
cell.setCellValue(title);
return new CellReference(sheet.getSheetName(), 0, column, true, true);
}
}
第三步:测试用例
public class WordTest {
public static void main(String[] args) {
XWPFDocument document = new XWPFDocument();
WordTool.addCustomHeadingStyle(document, WordTool.TITLE_FIRST, 1);
WordTool.addCustomHeadingStyle(document, WordTool.TITLE_SECOND, 2);
WordTool.addCustomHeadingStyle(document, WordTool.TITLE_THIRD, 3);
WordTool.addCustomHeadingStyle(document, WordTool.TITLE_FOURTH, 4);
XWPFParagraph paragraph = document.createParagraph();
paragraph.setPageBreak(true);
paragraph.setStyle("一、级标题");
XWPFRun run = paragraph.createRun();
run.setFontFamily("黑体");
run.setFontSize(22);
run.setText("一级标题");
XWPFParagraph campParagraph = document.createParagraph();
campParagraph.setFirstLineIndent(600);
campParagraph.setStyle("二、级标题");
XWPFRun campRun = campParagraph.createRun();
campRun.setFontFamily("黑体");
campRun.setText("二级标题");
campRun.setFontSize(14);
WordTool.createText(document, "\t\t223", ParagraphAlignment.LEFT);
WordTool.createText(document, "224");
XWPFTable table = WordTool.createTable(document, 10, 2);
int row = 0;
XWPFTableRow firstRow = table.getRow(row);
firstRow.getCell(0).setText("专题报告名称");
firstRow.getCell(1).setText("13");
WordTool.createPicture(document, "D://123.png");
WordTool.createPieChart(document, CollectionUtil.newArrayList("甲", "乙")
, CollectionUtil.newArrayList(1, 2), "股份图", "投资比例");
WordTool.write(document, "D://123.docx");
}
}
第四步:样例
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a2d05fb5c4a4c0bbd66c3f94e554314.png)
附言其他工具访问github自取
github地址