Apache POI 操作Word常用方法

系列文章目录

一、Java使用Apache POI导出excel
二、Apache POI 操作Excel常用方法
三、Apache poi 拆分单元格并赋值
四、使用easypoi模板方法导出excel
五、Apache poi给excel单元格添加下拉框或数据验证
六、Apache poi操作Word常用方法

文章目录

  • 系列文章目录
  • 一、介绍
  • 二、Apache POI中的常用方法
    • 1.新建、读取、输出文档
      • 1、新建
      • 2、读取
      • 3、输出
    • 2.段落
      • 1、创建、写入段落
      • 2、获取段落
      • 3、获取段落文本、修改内容
      • 4、删除段落
      • 5、插入换行符
      • 6、段落格式
    • 3.字体
    • 4.边框
    • 5.表格
      • 1、创建表格、填写内容
      • 2、获取表格、修改内容
      • 3、设置表格行高、列宽
      • 4、设置边框
      • 5、设置背景色
      • 6、设置对齐方式
      • 7、合并
      • 8、拆分
    • 6.图片
      • 1、插入图片


一、介绍

本文介绍使用 Apache POI 操作Word文档(.docx)

引入依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.3.0</version>
</dependency>

二、Apache POI中的常用方法

1.新建、读取、输出文档

1、新建

XWPFDocument document= new XWPFDocument();

2、读取

FileInputStream fileInputStream = new FileInputStream("D:/桌面/createdocument.docx");
XWPFDocument document= new XWPFDocument(fileInputStream);

3、输出

FileOutputStream out = new FileOutputStream("D:/桌面/createdocument.docx");
document.write(out);
document.close();
out.close();

2.段落

1、创建、写入段落

// 创建段落
XWPFParagraph paragraph = document.createParagraph();
// 运行段落
XWPFRun run = paragraph.createRun();
run.setText("北国风光,千里冰封,万里雪飘。\n" +"望长城内外,惟余莽莽;大河上下,顿失滔滔。\n" +"山舞银蛇,原驰蜡象,欲与天公试比高。\n" +"须晴日,看红装素裹,分外妖娆。\n" +"江山如此多娇,引无数英雄竞折腰。\n" +"惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。\n" +"一代天骄,成吉思汗,只识弯弓射大雕。\n" +"俱往矣,数风流人物,还看今朝。");

2、获取段落

XWPFParagraph paragraph = document.getParagraph(ctp);  // 通过CTP获取段落
List<XWPFParagraph> paragraphs = document.getParagraphs();	// 获取段落集合
XWPFParagraph paragraphArray = document.getParagraphArray(1);	// 段落索引获取段落

3、获取段落文本、修改内容

String text = paragraph.getText();  // 获取段落后获取段落文本
// 获取段落后删除run,创建新的run并设置文本内容。
List<XWPFParagraph> paragraphs = document.getParagraphs();
paragraphs.getFirst().removeRun(0);
paragraphs.getFirst().createRun().setText("test");

4、删除段落

boolean b = document.removeBodyElement(0); // 段落索引删除// 通过段落内容删除
for (int i = 0; i < document.getParagraphs().size(); i++) {XWPFParagraph paragraph = document.getParagraphs().get(i);if (paragraph.getText().contains("想要删除的段落文本")) {document.removeBodyElement(i);break;}
}

5、插入换行符

run.addBreak();

6、段落格式

// 设置段落对齐方式
paragraph1.setAlignment(ParagraphAlignment.LEFT); // 设置段落缩进
paragraph1.setIndentationLeft(440); // 左缩进,单位为 twips(1 twip = 1/20 点)(字号 * 20 约为 缩进1字符)
paragraph1.setIndentationRight(440); // 右缩进
paragraph1.setIndentationFirstLine(440); // 首行缩进两字符// 设置段落行间距
CTPPr pPr = paragraph1.getCTP().getPPr();
CTSpacing spacing = pPr.isSetSpacing() ? pPr.getSpacing() : pPr.addNewSpacing();
spacing.setAfter(BigInteger.valueOf(220)); // 段前间距,单位为 twips
spacing.setBefore(BigInteger.valueOf(220)); // 段后间距
spacing.setLine(BigInteger.valueOf(360)); // 行间距,单位为 twips
spacing.setLineRule(STLineSpacingRule.AUTO); // 行间距规则// 设置段落间距
CTInd ind = pPr.isSetInd() ? pPr.getInd() : pPr.addNewInd();
ind.setLeft(BigInteger.valueOf(440)); // 左缩进
ind.setRight(BigInteger.valueOf(440)); // 右缩进
ind.setFirstLine(BigInteger.valueOf(440)); // 首行缩进

3.字体

run.setFontFamily("宋体"); // 设置字体名称
run.setFontSize(14); // 设置字体大小
run.setColor("FF0000"); // 设置字体颜色  红色
run.setBold(true); // 设置粗体
run.setItalic(true); // 设置斜体
run.setUnderline(UnderlinePatterns.SINGLE); // 设置下划线
run.setStrikeThrough(true); // 设置删除线

4.边框

paragraph.setBorderBottom(Borders.BASIC_BLACK_DASHES);
paragraph.setBorderLeft(Borders.BASIC_BLACK_DASHES);
paragraph.setBorderRight(Borders.BASIC_BLACK_DASHES);
paragraph.setBorderTop(Borders.BASIC_BLACK_DASHES);

5.表格

1、创建表格、填写内容

// 方式1
XWPFTable table = document.createTable(3, 3);
XWPFTableRow row = table.getRow(0); // 获取第一行
row.getCell(0).setText("Header 1"); // 设置单元格内容
row.getCell(1).setText("Header 2");
row.getCell(2).setText("Header 3");
XWPFTableRow newRow = table.createRow(); // 创建新的一行
newRow.getCell(0).setText("Data 1");
newRow.getCell(1).setText("Data 2");
newRow.getCell(2).setText("Data 3");// 方式2
XWPFTable table = document.createTable(); 
// 第一行
XWPFTableRow tableRowOne = table.getRow(0);
tableRowOne.getCell(0).setText("col one, row one");
tableRowOne.addNewTableCell().setText("col two, row one");
tableRowOne.addNewTableCell().setText("col three, row one");
// 第二行
XWPFTableRow tableRowTwo = table.createRow();
tableRowTwo.getCell(0).setText("col one, row two");
tableRowTwo.getCell(1).setText("col two, row two");
tableRowTwo.getCell(2).setText("col three, row two");
// 第三行
XWPFTableRow tableRowThree = table.createRow();
tableRowThree.getCell(0).setText("col one, row three");
tableRowThree.getCell(1).setText("col two, row three");
tableRowThree.getCell(2).setText("col three, row three");

2、获取表格、修改内容

// 假设我们要修改第一个表格
XWPFTable tables = document.getTables().getFirst();
// 假设我们要修改第一行第二列的单元格(索引从0开始)
int rowIndex = 0;
int cellIndex = 1;
XWPFTableRow row = tables.getRow(rowIndex);
if (row != null) {XWPFTableCell cell = row.getCell(cellIndex);if (cell != null) {// 清空单元格原有的所有段落for (int i = cell.getParagraphs().size() - 1; i >= 0; i--) {cell.removeParagraph(i);}// 添加新的段落到单元格XWPFParagraph paragraph = cell.addParagraph();XWPFRun run = paragraph.createRun();run.setText("这是新的单元格内容----------");}
}

3、设置表格行高、列宽

List<XWPFTableRow> rows = table.getRows();
List<XWPFTableCell> tableCells = rows.getFirst().getTableCells();
for (int i = 0; i < rows.size(); i++) {table.getRow(i).setHeight(1000); // 设置行高for (int j = 0; j < tableCells.size(); j++) {table.getRow(i).getCell(j).setWidth("3000"); // 设置列宽 必要时做null判断}
}

4、设置边框

// 设置外边框
table.setTopBorder(XWPFTable.XWPFBorderType.SINGLE, 20, 0, "006400"); // 线条样式 宽度 偏移 颜色
table.setBottomBorder(XWPFTable.XWPFBorderType.SINGLE, 20, 0, "006400");
table.setLeftBorder(XWPFTable.XWPFBorderType.SINGLE, 20, 0, "006400");
table.setRightBorder(XWPFTable.XWPFBorderType.SINGLE, 20, 0, "006400");CTTblBorders borders = table.getCTTbl().getTblPr().addNewTblBorders();
// 设置内边框
CTBorder hBorder = borders.addNewInsideH();
hBorder.setVal(STBorder.Enum.forString("double"));
hBorder.setSz(new BigInteger("1")); // 线条大小
hBorder.setColor("191970"); // 设置颜色CTBorder vBorder = borders.addNewInsideV();
vBorder.setVal(STBorder.Enum.forString("double"));
vBorder.setSz(new BigInteger("1"));
vBorder.setColor("191970");

5、设置背景色

CTShd shd = CTShd.Factory.newInstance();
shd.setFill("FF0000");  // 设置背景色为红色
cell.getCTTc().addNewTcPr().addNewShd().set(shd);

6、设置对齐方式

// 设置文本对齐方式
for (XWPFParagraph p : cell.getParagraphs()) {p.setAlignment(ParagraphAlignment.CENTER);  // 水平居中对齐
}
CTVerticalJc vjc = cell.getCTTc().addNewTcPr().addNewVAlign();
vjc.setVal(STVerticalJc.CENTER);  // 垂直居中对齐

7、合并

mergeCellsHorizontally(table, 0, 0, 2); // 合并第1行第1列到第3列
mergeCellsVertically(table, 1, 0, 2);   // 合并第2行第1列到第3行第1列private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {for (int col = fromCol; col <= toCol; col++) {XWPFTableCell cell = table.getRow(row).getCell(col);if (col != fromCol) {cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);} else {cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);}}
}
private static void mergeCellsVertically(XWPFTable table, int fromRow, int col, int toRow) {for (int row = fromRow; row <= toRow; row++) {XWPFTableCell cell = table.getRow(row).getCell(col);if (row != fromRow) {cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);} else {cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);}}
}

8、拆分

splitCellsHorizontally(table, 0, 0, 2); // 拆分第1行第1列到第4列
splitCellsVertically(table, 1, 0, 2);   // 拆分第2行第1列到第3行第1列private static void splitCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {for (int col = fromCol; col <= toCol; col++) {XWPFTableCell cell = table.getRow(row).getCell(col);if (col != fromCol) {removeHMerge(cell);}}
}private static void splitCellsVertically(XWPFTable table, int fromRow, int col, int toRow) {for (int row = fromRow; row <= toRow; row++) {XWPFTableCell cell = table.getRow(row).getCell(col);if (row != fromRow) {removeVMerge(cell);}}
}private static void removeHMerge(XWPFTableCell cell) {CTTcPr tcPr = cell.getCTTc().getTcPr();if (tcPr != null) {XmlCursor cursor = tcPr.newCursor();while (cursor.hasNextToken()) {if ("hMerge".equals(cursor.getName().getLocalPart())) {cursor.removeXml();break;}cursor.toNextToken();}cursor.dispose();}
}private static void removeVMerge(XWPFTableCell cell) {CTTcPr tcPr = cell.getCTTc().getTcPr();if (tcPr != null) {XmlCursor cursor = tcPr.newCursor();while (cursor.hasNextToken()) {if ("vMerge".equals(cursor.getName().getLocalPart())) {cursor.removeXml();break;}cursor.toNextToken();}cursor.dispose();}
}

6.图片

1、插入图片

 // 插入图片
String imagePath = "D:/桌面/128c46f7fa08b0eb7b6c17f5f2bb9b1.jpg";
FileInputStream imageStream = new FileInputStream(imagePath);
int format = XWPFDocument.PICTURE_TYPE_JPEG;
// 创建段落
XWPFParagraph paragraph = document.createParagraph();
// 运行段落
XWPFRun run = paragraph.createRun();
// 插入图片到段落中
run.addPicture(imageStream, format, imagePath, Units.toEMU(200), Units.toEMU(200));  // 图片宽高为 200px

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

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

相关文章

H.264/H.265播放器EasyPlayer.js无插件H5播放器关于WASM的压缩优化

在当今的Web开发领域&#xff0c;流媒体播放器的性能和效率至关重要&#xff0c;尤其是在处理大型视频文件和高分辨率视频流时。EasyPlayer.js RTSP播放器作为一款先进的流媒体播放器&#xff0c;它在WebAssembly&#xff08;WASM&#xff09;的压缩优化方面表现出色&#xff0…

使用 Python 从 REST URL 下载文件

使用 Python 从 REST URL 下载文件&#xff0c;可以使用 requests 库来简化文件的下载和保存过程。以下是一个示例代码&#xff0c;展示了如何从给定的 REST API 或 URL 下载文件并保存到本地。 1、问题背景 我们需要编写一个脚本&#xff0c;从一个支持 REST URL 的网站下载一…

SpringMVC学习记录(三)之响应数据

SpringMVC学习记录&#xff08;三&#xff09;之响应数据 一、页面跳转控制1、快速返回模板视图2、转发和重定向 二、返回JSON数据1、前置准备2、ResponseBody 三、返回静态资源1、静态资源概念2、访问静态资源 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为h…

CSDN做样板,教我们如何为新网站引流

CSDN为我们做了个很好的例子&#xff0c;详细请看下图 亮点分析&#xff1a; 1. 未采用硬广在网站上进行引流。减少了给用户在直觉上的造成的反感&#xff1b; 2. 在GitHub的转跳页面中&#xff0c;植入额外的关联网站链接。虽然对用户解决问题没啥鸟用&#xff0c;但是人家能…

什么是头皮EA(剥头皮EA)?

在许多外汇交易者的眼中&#xff0c;剥头皮交易一直是一个神秘的存在。一部分人认为它是一种“外汇禁招”&#xff0c;而另一部分人则认为它比日内交易更容易盈利。那么&#xff0c;外汇剥头皮到底是什么&#xff1f;它与点差之间又有怎样的关系&#xff1f;本文将对剥头皮交易…

华为ensp防火墙配置(纯享版)

文章目录 前言一、拓扑结构二、配置步骤1.路由器配置&#xff08;路由器代替互联网&#xff09;2.server和pc配置3.防护墙配置4.测试 总结 前言 防火墙是生活和项目中不可或缺的一部分&#xff0c;本篇文章对华为的ensp防火墙配置做一个总结。在之前的dhcp配置中有软件的下载地…

区块链技术在数字版权管理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 引言 区块链技术概述 …

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功&#xff1a; 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…

VUE3中Element table表头动态展示合计信息(不是表尾合计)

一、背景 原型上需要对两个字段动态合计,输出摘要信息 原先想到是的Element的 :summary-method,发现不是动态,所以换监听来实现 二、vue代码 <el-table v-model="loading" :data="itemList"><el-table-column label="药品名称" pro…

让直播流量不再是“数字游戏”!本地生活+AI数字人的共赢方式 !

如今&#xff0c;数字化浪潮席卷全球&#xff0c;直播行业竞争愈发激烈。许多人都希望能够将自己直播间所产生的热度实时变现&#xff0c;但总是没有头绪或者是把握不住机会&#xff0c;就这样让直播流量从白白流失。即便是有人使用上创新型智能AI数字人系统&#xff0c;也少有…

jmeter常用配置元件介绍总结之前置处理器、测试片段

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之前置处理器、测试片段 6.前置处理器6.1用户参数6.2取样器超时6.3.测试片段6.4JSR223 PreProcessor6.5.JDBC PreProcessor 6.前置处理器 在取样器请求之前执行的操作&#xff0c;优先级比取样器高&#xff0c;用来处理一些…

前端代码分析题(选择题、分析题)——this指向、原型链分析

this指向 普通函数&#xff1a;this 的指向由调用方式决定&#xff0c;可以是全局对象、调用该函数的对象&#xff0c;或者显式指定的对象。箭头函数&#xff1a;this 的指向在定义时确定&#xff0c;始终继承自外层函数作用域的 this&#xff0c;不会被调用方式影响。 var obj…

Linux下进程链接结构,命令行参数,环境变量

bash 是一种 shell。在 Linux 系统中&#xff0c;当我们在终端输入命令时&#xff0c;通常是在一个 shell 环境下进行的。如果这个 shell 是 bash&#xff0c;那么所有命令行执行的命令都是 bash 的子进程。 1.Linux下进程链接结构 进程链接补充知识&#xff1a; 所有进程都…

Android studio中关于printf和print和println的区别

print:为一般输出&#xff0c;同样不能保留精度格式转化&#xff0c;也不能换行输出&#xff0c;输出需要加上换行符printf:常用于格式转换&#xff0c;但需要注意不是换行输出&#xff0c;只用于精度转换&#xff0c;跟C语言的printf一样的&#xff0c;输出需要加上换行符prin…

GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件

在现代地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;有许多大家耳熟能详的GIS软件。它们各自具有独特的优势&#xff0c;适用于不同的行业需求和使用场景。在众多企业和开发者面前&#xff0c;如何选择合适的 GIS 软件成为了一个值得深入思考的问题。今天&#xff…

精深之道:在专业领域迅速铸就影响力

在知识爆炸的时代专业化已成为各行各业竞争的关键词。要想在专业领域内快速实现影响力&#xff0c;不仅需要深厚的专业知识积累&#xff0c;还需要独到的见解、创新的思维以及有效的传播策略。本文旨在探讨如何在专业领域内迅速建立并扩大个人或组织的影响力&#xff0c;成为行…

微服务(二)

目录 1.网关路由 1.1.认识网关 1.2.快速入门 1.2.1.引入依赖 1.2.2.启动类 1.2.3.配置路由 1.3.路由过滤 2.网关登录校验 2.1.鉴权思路分析 2.2.网关过滤器 2.3.自定义过滤器 2.3.1.自定义GatewayFilter 2.3.2.自定义GlobalFilter 2.4.登录校验 2.4.1.JWT工具 …

ESP32学习笔记_FreeRTOS(1)——Task的创建和使用

摘要(From AI): 本文是基于 FreeRTOS 和 ESP_IDF 的学习笔记&#xff0c;详细讲解了任务管理、优先级设置、任务堆栈监控、看门狗定时器&#xff08;IWDT 和 TWDT&#xff09;等关键功能。内容涵盖任务创建与删除、任务挂起与恢复、时间片轮转调度机制&#xff0c;以及任务看门…

95.【C语言】数据结构之双向链表的头插,头删,查找,中间插入,中间删除和销毁函数

目录 1.双向链表的头插 方法一 方法二 2.双向链表的头删 3.双向链表的销毁 4.双向链表的某个节点的数据查找 5.双向链表的中间插入 5.双向链表的中间删除 6.对比顺序表和链表 承接94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删文章 1.双向链表的头插 方法…

【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库

文章目录 一、Docker的安装与配置1、docker概述2、安装docker3、docker架构4、配置镜像加速器 二、Docker命令1、服务相关命令2、镜像相关命令3、容器相关命令 三、Docker容器数据卷1、数据卷概念及作用2、配置数据卷3、配置数据卷容器 四、Docker应用部署实战1、部署MySQL2、部…