SpringBoot项目借助POI(3.16)实现docx文件加入页码(奇偶页页码格式有区别)

本文主要是介绍SpringBoot项目借助POI(3.16)实现docx文件加入页码(奇偶页页码格式有区别),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 需求描述:
  • 后端开发框架
  • maven引用第三方库
  • 实现逻辑
  • 具体代码(包含注释)
  • 相关链接

前言

docx的相关知识:
docx文件的xml解析

需求描述:

需要给一个word(docx格式)文件加上页码,奇数页页码在右下角,偶数页页码在左下角,并且页码的格式为“- num -”。
如:“- 1 -”、“- 2 -”
奇数页
在这里插入图片描述
偶数页
在这里插入图片描述

后端开发框架

SpringBoot

maven引用第三方库

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.16</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.10-FINAL</version>
</dependency>

实现逻辑

  1. 读入docx文件,
  2. 增加奇偶页标识(一些文件的设置,具体的流程我也不懂,详情见下面的代码)
  3. 设置全部页的页码都在右下角,按照对应格式设置页码
  4. 设置偶数页的页码都在左下角,按照对应格式设置页码

具体代码(包含注释)


/*** 在docx文件中加入奇偶页码(奇数页面加入的页码靠右,偶数页面加入的页码靠左)* 页码样式如下(注意"-"和数字之间均有一个空格,“”中间的为页码样式)*“- 1 -”*“- 2 -”* @param docxFilePath  需要加入页码docx文件的路径* @return 无返回值,在原文件上直接修改**/
public void addOddAndEvenPageNumber(String docxFilePath){XWPFDocument document = null;try {InputStream is = new ByteArrayInputStream(FileUtil.getContent(docxFilePath));//获取docx对象  增加 奇偶页document = new XWPFDocument(is);//添加奇偶页标识addNewEvenAndOddHeaders(document);//为全部页面创建靠右的页码createFooter(document, HeaderFooterType.DEFAULT, ParagraphAlignment.RIGHT);//为偶数页创建靠左的页码createFooter(document,HeaderFooterType.EVEN,ParagraphAlignment.LEFT);//在指定路径生成对应的文件document.write(new FileOutputStream(docxFilePath));} catch (IOException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}}/*** 创建页码** @param document  需要引用的XWPFDocument对象* @param headerFooterType  页码的样式  HeaderFooterType.DEFAULT  所有页面   HeaderFooterType.EVEN 偶数下标页面* @param paragraphAlignment  脚标靠哪个方向  如:ParagraphAlignment.RIGHT  靠右* @throws IOException* @throws NoSuchFieldException* @throws IllegalAccessException*/
static void createFooter(XWPFDocument document, HeaderFooterType headerFooterType, ParagraphAlignment paragraphAlignment) throws IOException, NoSuchFieldException, IllegalAccessException {//设置XWPFFooter类型脚标对象XWPFFooter footer = document.createFooter(headerFooterType);//创建一个新的XWPFFooter对象XWPFParagraph paragraph = footer.createParagraph();//创建新的XWPFParagraph对象paragraph.setAlignment(paragraphAlignment);//设置样式靠右//设置段落对象XWPFRun runPre = paragraph.createRun();//新的段落对象runPre.setText("- ");setXWPFRunStyle(runPre,"宋体",14);XWPFRun run = paragraph.createRun();//新的段落对象CTFldChar fldChar = run.getCTR().addNewFldChar();//新的CTFldChar对象fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));CTText ctText = run.getCTR().addNewInstrText();ctText.setStringValue("PAGE  \\* MERGEFORMAT");ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));setXWPFRunStyle(run,"宋体",14);fldChar = run.getCTR().addNewFldChar();fldChar.setFldCharType(STFldCharType.Enum.forString("end"));//设置段落对象XWPFRun runSuf = paragraph.createRun();//新的段落对象runSuf.setText(" -");setXWPFRunStyle(runSuf,"宋体",14);
}/*** 添加奇偶页标识* @param document word对应的XWPFDocument对象*/
static void addNewEvenAndOddHeaders(XWPFDocument document){//设置奇偶页辨别try{Field _settings = XWPFDocument.class.getDeclaredField("settings");_settings.setAccessible(true);XWPFSettings xwpfsettings = (XWPFSettings)_settings.get(document);Field _ctSettings = XWPFSettings.class.getDeclaredField("ctSettings");_ctSettings.setAccessible(true);CTSettings ctsettings =(CTSettings)_ctSettings.get(xwpfsettings);ctsettings.addNewEvenAndOddHeaders();}catch (Exception e){e.printStackTrace();}
}/*** 设置页脚的字体样式* @param r1 段落元素* @param font 段落元素* @param fontSize 的大小*/
static void setXWPFRunStyle(XWPFRun r1, String font, int fontSize) {r1.setFontSize(fontSize);CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();fonts.setAscii(font);fonts.setEastAsia(font);fonts.setHAnsi(font);
}

相关链接

How to generate different headers in first page and other pages in poi word XWPF?

XWPFDocument的官方文档传送门

这篇关于SpringBoot项目借助POI(3.16)实现docx文件加入页码(奇偶页页码格式有区别)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167909

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2