场景:
word文档解析写入数据库
数据库内容写入word文档
操作
依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
代码实现流程
1.创建文档
public static void main(String[] args) throws IOException {
//创建一个word 文档对象 :操作一个拓展名为 .docx 的word文档
XWPFDocument doc = new XWPFDocument();
//创建一个文件对象
File file = new File("D:\\Java\\code\\JavaSE\\poi\\test.docx");
//创建一个文件输出流
FileOutputStream outputStream = new FileOutputStream(file);
//通过文件输出流,将目标写入到 磁盘
doc.write(outputStream);
//关闭 文件输出流
outputStream.close();
}
2.写入文档
2.1 段落与段落内容
//word文档分段落,首先创建一个段落
XWPFParagraph paragraph = doc.createParagraph();
//创建一个具有相同属性的文本区域 --盒子:在该文本区域写入内容
XWPFRun paragraphRun = paragraph.createRun();
paragraphRun.setText("你好,今天天气不错");
2.1.2文本区域、段落操作
段落居中 paragraph.setAlignment(ParagraphAlignment.CENTER); 文本区域加粗 paragraphRun.setBold(true); 文本区域设置字体大小 paragraphRun.setFontSize(30); 段落首行缩进 paragraph2.setIndentationFirstLine(400);
2.2 表格
2.2.1创建表格
//向word 文档输出一个表格
XWPFTable table = doc.createTable();
table.setWidth("100%");//表格占据文档的百分比
2.2.2表格输入内容
//表格分为行,行中有单元格
//先获取表格的第一行,再对单元格进行操作
XWPFTableRow oneRow = table.getRow(0);
XWPFTableCell oneRowCell = oneRow.getCell(0);
oneRowCell.setText("我是第一行,第一列");
//创建第一行第二列
oneRow.addNewTableCell().setText("我是第一行,第二列");
第二行略有不同,可以在第一行的模板上添加
//创建第二行
XWPFTableRow row = table.createRow();
row.getCell(0).setText("我是第二行,第一列");
row.getCell(1).setText("我是第二行,第二列");
3.读取文档
3.1简单读取word文档内容
//找到读取的目标文件
File file = new File("D:\\Java\\code\\JavaSE\\poi\\test.docx");
//创建一个文件输入流
FileInputStream fileInputStream = new FileInputStream(file);
//创建一个 word文档对象,将输入流存入文档
XWPFDocument document = new XWPFDocument(fileInputStream);
//创建一个文档执行器,使用执行器的输出方法
XWPFWordExtractor extractor = new XWPFWordExtractor(document);
//获取当前word的文本内容
String text = extractor.getText();
System.out.println(text);
fileInputStream.close();
3.2读取文档中的图片
String filePath = "D:\\Java\\code\\JavaSE\\poi\\test.docx";
File file = new File(filePath);
//创建文件输入流
FileInputStream fileInputStream = new FileInputStream(file);
//创建文档对象
XWPFDocument document = new XWPFDocument(fileInputStream);
//获得文档所有内容-->段落
List<XWPFParagraph> paragraphs = document.getParagraphs();
//准备一个集合,存储拿到的图片的名字和二进制数据
HashMap<String, byte[]> images = new HashMap<>();
//遍历段落
for (XWPFParagraph paragraph: paragraphs){
//获得所有文本区域
List<XWPFRun> runs = paragraph.getRuns();
//遍历文本区域
for (XWPFRun run : runs){
//获得所有图片
List<XWPFPicture> pics = run.getEmbeddedPictures();
//遍历图片
for (XWPFPicture pic : pics){
//获得每个图片名
String fileName = pic.getPictureData().getFileName();
//图片二进制,可以通过输出流的read方法写出
byte[] data = pic.getPictureData().getData();
//集合:key是文件地址,value是二进制数据
images.put("D:\\Java\\code\\JavaSE\\poi\\"+fileName,data);
}
}
}
//遍历map集合,
for(Map.Entry<String, byte[]> entry :images.entrySet()){
FileOutputStream fileOutputStream = new FileOutputStream(entry.getKey());
fileOutputStream.write(entry.getValue());
fileOutputStream.close();
}
}
3.3读取文档中的表格
String filePath = "D:\\Java\\code\\JavaSE\\poi\\test.docx";
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){
String text = cell.getText();
System.out.println(text);
//拿到了值,进行逻辑处理
}
}
}
笔记来自b站:喜欢编程的代先生