POI:对Word的基本操作

1 向word中写入文本并设置样式

java 复制代码
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 创建基础的表格

java 复制代码
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 给表格添加样式

在这边的话,就不用上述的方法创建表格了,直接给出行数和列数也是可以直接创建表格的

java 复制代码
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;   // 一行中的单元格遍历结束后,需要恢复值为0
            currentRow++;
        }

        // 在这边也可以判断路径是否存在, 如果不存在, 则创建路径
        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 写入图片

java 复制代码
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 读取文档中内容

java 复制代码
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 读取文档中的图片

java 复制代码
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 读取文档中表格的内容

java 复制代码
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();
    }
}

相关推荐
向阳121819 分钟前
mybatis 缓存
java·缓存·mybatis
上等猿25 分钟前
函数式编程&Lambda表达式
java
蓝染-惣右介43 分钟前
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
java·设计模式
秋恬意1 小时前
IBatis和MyBatis在细节上的不同有哪些
java·mybatis
齐 飞2 小时前
BeanFactory和FactoryBean
java·sprint
大霞上仙2 小时前
lxml 解析xml\html
java·服务器·网络
yivifu2 小时前
用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容
word
Xiaoweidumpb2 小时前
tomcat temp临时文件不清空,占用硬盘,jdk字体内存泄漏
java·tomcat
AI人H哥会Java2 小时前
【Spring】控制反转(IoC)与依赖注入(DI)—IoC容器在系统中的位置
java·开发语言·spring boot·后端·spring