使用 apache poi api 创建 Word 文档时,如何添加 X of Y 格式的页码?

2023-12-11

POI API 中是否指定了任何方法来获取总页数,我可以在文档的页脚中添加页码,但无法添加总页数值。


页数Word取决于很多因素,例如字体大小、段落顶部/底部边距和填充、打印机设置、手动插入的分页符等。所以不能直接存到文件中。它将在运行时计算Word正在渲染其页面。

但是我们可以使用页脚中的字段来计算页码和总页数。

使用最多的示例apache poi 3.14:

import java.io.*;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
//import org.apache.poi.wp.usermodel.HeaderFooterType;

public class CreateWordHeaderFooter {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  // the body content
  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The Body:");

  paragraph = doc.createParagraph();
  run=paragraph.createRun();  
  run.setText("Lorem ipsum.... page 1");

  paragraph = doc.createParagraph();
  run=paragraph.createRun();
  run.addBreak(BreakType.PAGE); 
  run.setText("Lorem ipsum.... page 2");

  paragraph = doc.createParagraph();
  run=paragraph.createRun();
  run.addBreak(BreakType.PAGE); 
  run.setText("Lorem ipsum.... page 3");

  // create header-footer
  XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy();
  if (headerFooterPolicy == null) headerFooterPolicy = doc.createHeaderFooterPolicy();

  // create header start
  XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
  //XWPFHeader header = doc.createHeader(HeaderFooterType.DEFAULT);

  paragraph = header.getParagraphArray(0);
  if (paragraph == null) paragraph = header.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.LEFT);

  run = paragraph.createRun();  
  run.setText("The Header:");

  // create footer start
  XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);
  //XWPFFooter footer = doc.createFooter(HeaderFooterType.DEFAULT);

  paragraph = footer.getParagraphArray(0);
  if (paragraph == null) paragraph = footer.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.CENTER);

  run = paragraph.createRun();  
  run.setText("Page ");
  paragraph.getCTP().addNewFldSimple().setInstr("PAGE \\* MERGEFORMAT");
  run = paragraph.createRun();  
  run.setText(" of ");
  paragraph.getCTP().addNewFldSimple().setInstr("NUMPAGES \\* MERGEFORMAT");

  FileOutputStream out = new FileOutputStream("CreateWordHeaderFooter.docx");
  doc.write(out);
  out.close();
  doc.close();

 }
}

中的字段Word那么是{PAGE \* MERGEFORMAT} and {NUMPAGES \* MERGEFORMAT}.

对于使用电流apache poi 4.1.2无需XWPFHeaderFooterPolicy using XWPFDocument.createHeader, XWPFDocument.createFooter and HeaderFooterType:

...
//import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.wp.usermodel.HeaderFooterType;
...

  // create header-footer
  //XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy();
  //if (headerFooterPolicy == null) headerFooterPolicy = doc.createHeaderFooterPolicy();

  // create header start
  //XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
  XWPFHeader header = doc.createHeader(HeaderFooterType.DEFAULT);
...
  // create footer start
  //XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);
  XWPFFooter footer = doc.createFooter(HeaderFooterType.DEFAULT);
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 apache poi api 创建 Word 文档时,如何添加 X of Y 格式的页码? 的相关文章

随机推荐

  • Arm 板上有两个以上的 SPI 设备,但只支持两个?

    我们其中一块板上的 Arm 处理器有一个 spi 端口 带有两条片选线 该处理器的数据表中提到它最多可以控制两个 spi 设备 是否可以使用 GPIO 作为附加 spi 设备的从选择 如何修改现有的库 设备驱动程序以支持此更改 到目前为止
  • Linux C++ 尝试使用绝对路径加载一个特定库,而所有其他库则使用相对路径链接

    我有以下问题 我正在尝试创建程序的可移植版本 因此我将 rpath 设置为 因此所有库都使用相对文件路径链接 这确实适用于除一个库之外的所有库 由于某种原因 只有当一个特定库存在于编译时链接的同一位置时 该程序才能工作 这是我自己写的 它的
  • 在 Flex Line 图表中显示数据点

    我有一个弹性折线图 有没有办法改变每个点的渲染并让它们始终显示 而不是必须将鼠标悬停在线条的某些部分上才能查看数据点的默认行为 几乎就像连接点类型视图 Try this
  • 使用 CGSizeMake 和 CGSize 有什么区别?这个比那个好吗?

    CGSize width 360 height 480 and CGSizeMake 360 480 似乎有同样的效果 一个比另一个更受青睐吗 有什么不同 The CGSize构造函数是 Swift 的扩展CGSize extension
  • Visual Studio 2022 发布窗口未检测身份验证状态

    我已经登录到 VS2022 因此也登录到 Azure 但在尝试发布应用程序时 我看到以下屏幕 从右上角可以看出我已经登录了 那么我什么时候得到这个 我什至尝试了这个建议link 我退出并删除了 localappdata IdentitySe
  • 可滚动的 JFree 域轴和自定义标记标签

    我有这段代码来绘制图表 效果很好 我这里需要两件事 在域轴 x 上我希望能够滚动 在标记上我看到一条粗粗的线 我希望能够看到该标记的一些可读文本 For now I see this output 缩放后我看到了这个 同样在域轴上我有毫秒值
  • 在 JavaScript 中重试 Promise 的通用解决方案

    我尝试给出一个重试承诺的通用解决方案 以下是我的方式 出现 未捕获 承诺 的错误 我该如何解决这个问题 function tryAtMost maxRetries promise let tries maxRetries return ne
  • SQL Server 2005 - 如何将图像数据类型转换为字符格式

    背景 我是一名软件测试人员 使用测试用例管理数据库 该数据库使用已弃用的图像数据类型存储数据 我对 SQL Server 比较缺乏经验 问题 具有富文本格式的字符数据存储为图像数据类型 目前 以人类可读格式查看这些数据的唯一方法是通过测试用
  • 在 PHP 中寻找加载依赖项/服务/配置的优雅方法?

    我正在构建一个 MVC PHP 框架 我想知道哪些是在我的类中加载所需内容的最佳实践 无论是其他类还是普通配置 到目前为止 我已经使用了单例 注册表以及最近的依赖注入容器 虽然许多人声称 DI 是可行的方法 但在我看来 它只是将组件之间的耦
  • ASP.NET 中的 OpenIDSelector 问题

    我正在尝试使用 asp net c 在我的网站中使用 OpenID 我正在使用 asp net v4 开发 asp net 表单网站 我遇到的问题是我的工具箱中的 openidselector 控件是由 dotnetopenauth dll
  • dbms_output.put() 的缓冲方式与 dbms_output.put_line() 不同吗?

    我使用 Aqua Data Studio 通过分散输出语句来调试存储过程 我在包中有一条违反完整性约束的删除语句 DELETE FROM x WHERE x ID an x with children 正如预期的那样 我的过程在该行失败并出
  • 为什么类的静态方法可以继承,而接口的静态方法不能继承?

    我知道在Java中静态方法就像实例方法一样被继承 不同之处在于当它们被重新声明时 父实现被隐藏而不是被覆盖 好吧 这是有道理的 然而 Java 教程注意到 接口中的静态方法永远不会被继承 为什么 常规方法和接口静态方法有什么区别 让我澄清一
  • php通过序列号进行页面导航

    任何人都可以帮助这个 php 页面导航脚本打开计算正常序列号吗 在这个脚本中有一个名为 page id 的变量 我希望这个变量按0 1 2 3 4 5等顺序存储真实的页面链接
  • 有没有办法在 EDM Designer 2010 中设置自定义复数形式?

    我正在使用 VS 2010 并且我有一个实体 Person 复数服务将其复数变为 People 我希望它是 Persons 有没有可以管理复数库的地方 不在 Visual Studio 中 no 与此同时 您可以下降到 API 级别并创建您
  • 将匿名/动态函数设置为菜单

    我想在 Google Sheets 插件中为动态菜单设置动态功能 我正在使用以下代码 function onOpen e var menu SpreadsheetApp getUi createAddonMenu for var i 0 i
  • 更新外键值

    我有一个数据库应用程序 其中的组建模如下 TABLE Group group id integer primary key group owner id integer TABLE GroupItem item id integer pri
  • Android 传感器:getRotationMatrix() 返回错误值,为什么?

    我开始使用这个功能已经过去几天了 但还没有成功获得有效的结果 我想要的是基本上将加速度矢量从设备坐标系转换为现实世界坐标 我知道这是可能的 因为我有相对坐标的加速度 并且我知道设备在现实世界系统中的方向 阅读 Android 开发人员似乎使
  • 从 Angular 4 中的不同包导入模块

    这是一个概念性问题 我对 Angular 和 npm 都是绝对的初学者 所以这肯定是一个基本问题 但我一直在寻找答案 但没有找到答案 我想在开始项目之前做一些概念验证 我想要一个名为 Imported 的包 并在名为 Importer 的包
  • kubernetes 中的 coredns crashloopbackoff

    我已经设置了kubernetes in ubuntu 16 04 我使用的是kube版本1 13 1并使用 weave 进行联网 我已经使用以下方法初始化了集群 sudo kubeadm init token ttl 0 apiserver
  • 使用 apache poi api 创建 Word 文档时,如何添加 X of Y 格式的页码?

    POI API 中是否指定了任何方法来获取总页数 我可以在文档的页脚中添加页码 但无法添加总页数值 页数Word取决于很多因素 例如字体大小 段落顶部 底部边距和填充 打印机设置 手动插入的分页符等 所以不能直接存到文件中 它将在运行时计算