POI:对Word的基本操作

news2024/9/23 3:28:55

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;   // 一行中的单元格遍历结束后,需要恢复值为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 写入图片

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();
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1381051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux(Ubantu)交叉编译生成windows(32位,64位)可执行程序和库

机缘 机缘巧合下收到了这个小任务. 工作流 先是找了下资料发现过去的都是关于mingw32. 教程的做法: 增加个源 (trusty 是linux发行的版本标识,比如22.04是jammy deb http://us.archive.ubuntu.com/ubuntu trusty main universe更新源 sudo apt update下载mingw32. sudo…

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子&#xff08;闯关游戏&#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…

通过shell脚本确定当前平台

shell中的变量OSTYPE存储操作系统的名称&#xff0c;也可以使用uname命令来确认当前所在的平台。 shell中的变量HOSTTYPE存储操作系统的架构。 测试代码如下所示&#xff1a; #! /bin/bashecho "use OSTYPE:" if [[ "$OSTYPE" "linux-gnu&quo…

java大学生宿舍共享厨房系统宿舍自习室宿舍洗衣房系统源码包含技术文档

主要功能&#xff1a;学生可注册登录&#xff0c;预约自己宿舍楼栋的共享厨房和评价&#xff0c;也可以使用该楼栋的洗衣房&#xff0c;查看洗衣机吹风机的使用情况和报修&#xff0c;还可以进入该楼栋自习室打卡和评价。管理员可管理所有的学生和宿管&#xff0c;分配宿舍&…

MYSQL的操作

1.库的操作 1.1创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 说明&#xff1a; #…

GitHub项目推荐-incubator

项目地址 Github地址&#xff1a;GitHub - apache/incubator-anser 官网&#xff1a;Apache Answer | Free Open-source Q&A Platform 项目简述 这是Apache的一个开源在线论坛&#xff0c;也可以部署成为一个自有的QA知识库。项目主要使用了Go和Typescript来开发&#…

Feature Fusion for Online Mutual KD

paper&#xff1a;Feature Fusion for Online Mutual Knowledge Distillation official implementation&#xff1a;https://github.com/Jangho-Kim/FFL-pytorch 本文的创新点 本文提出了一个名为特征融合学习&#xff08;Feature Fusion Learning, FFL&#xff09;的框架&…

设计模式—— 单例设计模式

单例设计模式 什么是单例模式 单例模式是一种对象创建型模式&#xff0c;使用单例模式&#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说&#xff0c;在整个程序空间中&#xff0c;该类只存在一个实例对象。 为什么使用单例模式 在应用系统开发中&#xff0c;我…

Python测试开发,掌握技巧更上一层楼!

学员学习分享&#xff1a; 自动化测试工作稳定之后&#xff0c;一向对技术着迷的我&#xff0c;迫不及待地要进入测开的世界&#xff0c;在java和Python的方向上&#xff0c;我选择了Python。 原因很简单&#xff0c;比较好上手&#xff0c;而且市场上也比较主流。 在跟着课…

【操作系统】在阅读论文:OrcFS: Orchestrated file system for flash storage是需要补充的基础知

在阅读论文&#xff1a;OrcFS: Orchestrated file system for flash storage是需要补充的基础知识 这篇论文是为了解决软件层次之间的信息冗余问题 To minimize the disk traffic, the file system buffers the updates and then flushes them to the disk as a single unit, …

二极管限幅电路理论分析,工作原理+作用

一、限幅是什么意思&#xff1f; 限幅也就是&#xff0c;将电压限制在某个范围内&#xff0c;去除交流信号的一部分但不会对波形的剩余部分造成影响。通常来说&#xff0c;限幅电路主要是由二极管构成&#xff0c;波形的形状取决于电路的配置和设计。二、限幅电路工作原…

流量预测中文文献阅读(郭郭专用)

目录 基于流量预测的超密集网络资源分配策略研究_2023_高雪亮_内蒙古大学&#xff08;1&#xff09;内容总结&#xff08;2&#xff09;流量预测部分1、数据集2、结果对其中的一个网格的CDR进行预测RMSE和R2近邻数据和周期数据对RMSE的影响 &#xff08;3&#xff09;基于流量预…

C语言实现简易n子棋小游戏(代码含注解)

利用C语言简单实现一个n子棋小游戏&#xff0c;棋盘大小由自己定义 将源文件分为 执行游戏的测试文件(test.c)和保存游戏运行逻辑的相关函数的文件(game.c) 头文件中声明符号和函数的定义(game.h) 游戏执行主要依靠二维数组实现&#xff0c;电脑走棋采用随机值的方法简易地…

【NI-DAQmx入门】LabVIEW中DAQmx同步

1.同步解释 1.1 同步基础概念 触发器&#xff1a;触发器是控制采集的命令。您可以使用触发器来启动、停止或暂停采集。触发信号可以源自软件或硬件源。 时钟&#xff1a;时钟是用于对数据采集计时的周期性数字信号。根据具体情况&#xff0c;您可以使用时钟信号直接控制数据采…

ElasticSearch概述+SpringBoot 集成 ES

ES概述 开源的、高扩展的、分布式全文检索引擎【站内搜索】 解决问题 1.搜索词是一个整体时&#xff0c;不能拆分&#xff08;mysql整体连续&#xff09; 2.效率会低&#xff0c;不会用到索引&#xff08;mysql索引失效&#xff09; 解决方式 进行数据的存储&#xff08;只存储…

ssm基于Javaweb的物流信息管理系统的设计与实现论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统物流信息管理难度大&#xff0c;容错率低&#xff0c;管理…

基于OpenCV的谷物颗粒识别

基于OpenCV的谷物颗粒识别 一、程序整体功能介绍1.1 导入库与函数定义1.2 颜色分割与灰度处理1.3 二值化与轮廓检测1.4 绘制与计数1.5 主程序与结果展示 二、算法原理与实现流程2.1算法原理&#xff08;1&#xff09;颜色分割&#xff08;2&#xff09;灰度处理与二值化&#x…

mysql进阶 - 存储过程

目录 1. 用途&#xff1a; 2. 相关语法 2.1 创建 2.1.1 语法 2.1.2 示例 2.2 查看存储过程 2.3 调用 2.4 修改存储过程 2.5 删除存储过程 1. 用途&#xff1a; 存储过程广泛存在于一些遗留系统&#xff0c;可以减少代码的编写。而近些年&#xff0c;存储过程很少再用…

【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C考前速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

试用统信服务器操作系统UOS 20

作者&#xff1a;田逸&#xff08;formyz&#xff09; 试用统信Linux操作系统UOS&#xff0c;想了解一下用已有的Linux经验能否轻松驾驭它。以便在某些场景下&#xff0c;可以多一种选择。本次试验在Proxmox VE 8&#xff08;以下简称PVE 8&#xff09;平台下进行&#xff0c;采…