1 向word中写入文本并设置样式
package com.example;import org.apache.poi.xwpf.usermodel.*;import java.io.File;
import java.io.FileOutputStream;/*** @Author:xiexu* @Date:2024/1/12 23:54*/
public class WriteWord {static String PATH = "D:\\Idea-projects\\POI_word";public static void main(String[] args) throws Exception {// 1. 创建文档XWPFDocument document = new XWPFDocument();// 2. 创建一个标题段落XWPFParagraph titleParagraph = document.createParagraph();// 设置段落为居中titleParagraph.setAlignment(ParagraphAlignment.CENTER);// 3. 创建第一段的运行XWPFRun titleParagraphRun = titleParagraph.createRun();// 4. 设置文本titleParagraphRun.setText("这是一个标题");// 5. 设置第一个段落中文本样式titleParagraphRun.setFontSize(20);titleParagraphRun.setBold(true);titleParagraphRun.setFontFamily("宋体");titleParagraphRun.setColor("FF0000");// 6. 创建第二个段落XWPFParagraph contentParagraph = document.createParagraph();// 设置段落为左对齐contentParagraph.setAlignment(ParagraphAlignment.LEFT);// 设置首行缩进contentParagraph.setIndentationFirstLine(400);contentParagraph.setBorderBottom(Borders.BASIC_BLACK_DASHES); // 加边框(上右下左都可以)// 7. 创建第二段的运行XWPFRun contentParagraphRun = contentParagraph.createRun();// 8. 设置文本 (这边使用StringBuffer来拼接字符,来模拟文章效果)StringBuffer content = new StringBuffer();for (int i = 0; i < 50; i++) {content.append("小蟹学Java-POI");}contentParagraphRun.setText(content.toString());contentParagraphRun.setItalic(true);//twoParagraphRun.setStrike(true); // 删除线// contentParagraphRun.setSubscript(VerticalAlign.SUBSCRIPT); // 下标contentParagraphRun.addBreak(); // 添加个换行// 9. 创建第三个段落XWPFParagraph endParagraph = document.createParagraph();// 设置段落为右对齐endParagraph.setAlignment(ParagraphAlignment.RIGHT);// 10. 创建第三个段的运行XWPFRun endParagraphRun = endParagraph.createRun();// 11.设置文本endParagraphRun.setText("结束");endParagraphRun.setFontSize(16);endParagraphRun.setColor("8E0500");// 创建一个文件对象File file = new File(PATH + "\\write_word.docx");// 创建一个文件输出流FileOutputStream fileOutputStream = new FileOutputStream(file);// 通过输出流,将目标文件写入到磁盘document.write(fileOutputStream);// 关闭输出流fileOutputStream.close();// 输出提示System.out.println("文件创建成功");}
}
2 创建基础的表格
package com.example;import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;/*** @Author:xiexu* @Date:2024/1/13 10:18*/
public class WriteTable {static String PATH = "D:\\Idea-projects\\POI_word";public static void main(String[] args) throws Exception {XWPFDocument document = new XWPFDocument();// 创建表格XWPFTable table = document.createTable();// 创建第一行XWPFTableRow oneRow = table.getRow(0);oneRow.getCell(0).setText("col one, row one");oneRow.addNewTableCell().setText("col two, row one");oneRow.addNewTableCell().setText("col three, row one");// 创建第二行XWPFTableRow twoRow = table.createRow();twoRow.getCell(0).setText("col one, row two");twoRow.getCell(1).setText("col two, row two");twoRow.getCell(2).setText("col three, row two");// 创建第三行XWPFTableRow threeRow = table.createRow();threeRow.getCell(0).setText("col one, row three");threeRow.getCell(1).setText("col two, row three");threeRow.getCell(2).setText("col three, row three");File file = new File(PATH + "\\write_table.docx");FileOutputStream fileOutputStream = new FileOutputStream(file);document.write(fileOutputStream);fileOutputStream.close();System.out.println("表格写入成功!");}
}
3 给表格添加样式
在这边的话,就不用上述的方法创建表格了,直接给出行数和列数也是可以直接创建表格的
package com.example;import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;import java.io.File;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.util.List;/*** @Author:xiexu* @Date:2024/1/13 10:40*/
public class SetTableStyle {static String PATH = "D:\\Idea-projects\\POI_word";public static void main(String[] args) throws Exception {// 1. 创建一个文档对象XWPFDocument document = new XWPFDocument();// 2. 给出行数和列数int RowNums = 5;int colNums = 6;// 3. 创建表格对象XWPFTable table = document.createTable(RowNums, colNums);// 4. 设置表格样式// 4.1 获取表格(table)的属性对象(CTTblPr),该对象用于描述表格的一些属性,例如样式、边框等CTTblPr tblPr = table.getCTTbl().getTblPr();// 4.2创建一个新的表格样式对象(CTString),并将其添加到表格属性对象中CTString tblStyle = tblPr.addNewTblStyle();// 4.3设置表格样式对象的值为 "TableStyle"tblStyle.setVal("TableStyle");// 4.4 获取所有的行并设置样式List<XWPFTableRow> rows = table.getRows();int currentRow = 0;int currentCol = 0;for (XWPFTableRow row : rows) {// 设置行高CTTrPr ctTrPr = row.getCtRow().addNewTrPr();CTHeight ctHeight = ctTrPr.addNewTrHeight();ctHeight.setVal(BigInteger.valueOf(300));// 设置单元格样式List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {// 4.5 设置单元格样式// 获取单元格(cell)的属性对象(CTTcPr),该对象用于描述单元格的一些属性,例如宽度、边框、垂直对齐方式等。CTTcPr ctTcPr = cell.getCTTc().addNewTcPr();// 创建一个新的垂直对齐方式对象(CTVerticalJc),并将其添加到单元格属性对象中。CTVerticalJc ctVerticalJc = ctTcPr.addNewVAlign();// 设置垂直对齐方式对象的值为 "CENTER",将单元格中的内容垂直居中显示ctVerticalJc.setVal(STVerticalJc.CENTER); // 枚举,可以有多种// 设置单元格阴影样式CTShd ctShd = ctTcPr.addNewShd();ctShd.setColor("auto");ctShd.setVal(STShd.CLEAR); // 枚举,可以有多种// 头行和内容行的阴影颜色应有区别 (需要定义当前行和当前列的变量)if (currentRow == 0) {ctShd.setFill("FFFFCC");} else {ctShd.setFill("90EE90");}// 设置单元格中的内容样式XWPFParagraph xwpfParagraph = cell.getParagraphs().get(0);XWPFRun cellRun = xwpfParagraph.createRun();// 设置居中xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);// 内容的样式也是需要区分头行和内容行的if (currentRow == 0) {cellRun.setFontSize(18);cellRun.setBold(true);cellRun.setColor("FF0000");}// 设置单元格内容if (currentRow == 0) {cellRun.setText("header" + (currentCol+1));} else {cellRun.setText("content" + (currentCol+1));}currentCol++;}currentCol = 0; // 一行中的单元格遍历结束后,需要恢复值为0currentRow++;}// 在这边也可以判断路径是否存在, 如果不存在, 则创建路径File path = new File(PATH);if (!path.exists()) {path.mkdirs();}// 创建文件对象File file = new File(PATH + "\\write_tableStyle.docx");// 创建输出流FileOutputStream fileOutputStream = new FileOutputStream(file);document.write(fileOutputStream);fileOutputStream.close();System.out.println("表格样式设置完成");}
}
4 写入图片
package com.example;import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;import java.io.FileInputStream;
import java.io.FileOutputStream;/*** @Author:xiexu* @Date:2024/1/13 11:44*/
public class Write_img {static String PATH = "D:\\Idea-projects\\POI_word";public static void main(String[] args) throws Exception {// 1. 定义一个图片路径String imgPath = "D:\\Idea-projects\\POI_word\\beag.png";// 2. 创建一个文件对象XWPFDocument document = new XWPFDocument();// 3.创建一个段落XWPFParagraph paragraph = document.createParagraph();//4.创建运行区域XWPFRun run = paragraph.createRun();// 5.写入图片// 将文件路径写入word文档run.setText("图片路径:" + imgPath);// 换行run.addBreak();// 增加图片到运行区域// 创建一个输入流FileInputStream fileInputStream = new FileInputStream(imgPath);run.addPicture(fileInputStream, Document.PICTURE_TYPE_PNG, imgPath, Units.toEMU(400), Units.toEMU(250));// 第一个参数是输入流、// 第二个参数是图片的类型、// 第三个参数是图片的路径、// 第四个参数是图片的宽度、// 第五个参数是图片的高度// 6.另起一个页面run.addBreak(BreakType.PAGE);// 7. 写入到磁盘// 创建一个输出流FileOutputStream outputStream = new FileOutputStream(PATH + "\\write_img.docx");document.write(outputStream);outputStream.close();System.out.println("图片写入完成");}
}
5 读取文档中内容
package com.exampleRead;import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File;
import java.io.FileInputStream;/*** @Author:xiexu* @Date:2024/1/13 12:04*/
public class ReadWord {public static void main(String[] args) throws Exception {// 找到用读取的目标文件File file = new File("D:\\Idea-projects\\POI_word\\write_word.docx");// 创建输入流,将文件写入输入流FileInputStream fileInputStream = new FileInputStream(file);// 创建一个文档对象,将输入流写入文档对象XWPFDocument document = new XWPFDocument(fileInputStream);// 创建一个文档执行器XWPFWordExtractor xwpfWordExtractor = new XWPFWordExtractor(document);// 输出文档内容String text = xwpfWordExtractor.getText();System.out.println(text);fileInputStream.close();}
}
读取目标文档中其它的属性信息
这些属性信息可以在创建文件的时候,可以设置进去
6 读取文档中的图片
package com.exampleRead;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.XWPFRun;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Author:xiexu* @Date:2024/1/13 12:32*/
public class Read_img {public static void main(String[] args) throws Exception {// 定义一个待读取的文件路径String filePath = "D:\\Idea-projects\\POI_word\\write_img.docx";File Path = new File(filePath);// 判断路径是否存在if (!Path.exists()) {System.out.println("文件不存在");return;}// 创建一个输入流FileInputStream fileInputStream = new FileInputStream(filePath);// 创建一个文档对象XWPFDocument document = new XWPFDocument(fileInputStream);// 定义一个HashMap来存储图片的信息Map<String, byte[]> ImagesHashMap = new HashMap<>();// 获取所有段落List<XWPFParagraph> paragraphs = document.getParagraphs();// 遍历所有段落for (XWPFParagraph paragraph : paragraphs) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {// 获取运行区域的所有图片List<XWPFPicture> pictures = run.getEmbeddedPictures();// 遍历图片for (XWPFPicture picture : pictures) {// 我们需要定义一个HashMap来存储图片的信息String fileName = picture.getPictureData().getFileName();byte[] data = picture.getPictureData().getData(); // 是以二进制的形式ImagesHashMap.put("D:\\Idea-projects\\POI_word\\poi1"+fileName, data);}}}// 遍历ImagesHashMap集合for (Map.Entry<String, byte[]> entry : ImagesHashMap.entrySet()) {String FilePathKey = entry.getKey();byte[] Filevalue = entry.getValue();System.out.println("开始写入图片...");// 创建一个输出流FileOutputStream fileOutputStream = new FileOutputStream(FilePathKey);fileOutputStream.write(Filevalue);fileOutputStream.close();System.out.println("图片写入完成...");}}
}
7 读取文档中表格的内容
package com.exampleRead;import org.apache.poi.xwpf.usermodel.*;import java.io.File;
import java.io.FileInputStream;
import java.util.List;/*** @Author:xiexu* @Date:2024/1/13 13:01*/
public class Read_table {public static void main(String[] args) throws Exception {// 定义一个待读取的文件路径String filePath = "D:\\Idea-projects\\POI_word\\write_tableStyle.docx";// 判断路径是否存在File pathCheck = new File(filePath);if (!pathCheck.exists()){System.out.println("文件路径不存在");return;}// 创建一个输入流FileInputStream fileInputStream = new FileInputStream(filePath);// 创建一个文档对象XWPFDocument document = new XWPFDocument(fileInputStream);// 获取表格对象List<XWPFTable> tables = document.getTables();// 遍历表格(因为一个文档中可能有多个表格)for (XWPFTable table : tables) {List<XWPFTableRow> rows = table.getRows();// 遍历所有的行for (XWPFTableRow row : rows) {List<XWPFTableCell> cells = row.getTableCells();// 遍历所有的单元格for (XWPFTableCell cell : cells) {System.out.println("开始读取表格...");// 获取内容String text = cell.getText();System.out.println("单元格中的内容是:" + text);}}}System.out.println("表格读取完毕");fileInputStream.close();}
}