java - Apache poi Java。我正在尝试添加 upper_letter 编号,但结果是所有部分都编号为 A

标签 java apache-poi

下面的代码允许我添加大写字母编号,它将字母 A. 添加到第一部分,但对于其余部分,它保留相同的字母 A。它不会创建连续的列表编号。我得到的结果如下:

A.这是第一部分

A.这是第二部分

我需要得到的是:

A.这是第一部分

B.这是第二部分

关于如何实现这一目标有什么想法吗?

列表列表 = document.getParagraphs();

CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
CTLvl cTLvl = cTAbstractNum.addNewLvl();
cTLvl.addNewNumFmt().setVal(STNumberFormat.UPPER_LETTER);
cTLvl.addNewLvlText().setVal("A.");
cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
XWPFNumbering numbering = document.createNumbering();
BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
BigInteger numID = numbering.addNum(abstractNumID);


for (XWPFParagraph paragraph : list) {

    if (paragraph.getText().trim().contains("This is section number one")|| 
            paragraph.getText().trim().contains("This is section number two") ){

        System.out.println(paragraph.getText() + " " + list.indexOf(paragraph));
        paragraph.setNumID(numID);


    }

}

}

最佳答案

Hi, how can I restart numbering in java word apache poi?我提供了一个方法 BigInteger getNewDecimalNumberingId(XWPFDocument document, BigInteger AbstractNumID) 。在这个方法中

...
  CTLvl cTLvl = cTAbstractNum.addNewLvl();
  cTLvl.setIlvl(BigInteger.valueOf(0)); // set indent level 0
  cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
  cTLvl.addNewLvlText().setVal("%1.");
  cTLvl.addNewStart().setVal(BigInteger.valueOf(1));
...

表示如下:向具有十进制数字格式和模式 %1. 的级别文本的抽象编号添加第一级别,从第一个可用数字开始。

其中的 %1. 是一个模式。它不是意味着1.,而是%1 = 1级的下一个可用数字,后跟点.。如果有更多级别,则在级别 2 中,lvlText 可能具有 val="%1.%2."。这意味着 %1 = 级别 1 的当前编号,后跟点 .,然后 %2 = 级别 2 的下一个可用编号,后跟点 ..

相应的大写字母编号方法是:

 BigInteger getNewUpperLetterNumberingId(XWPFDocument document, BigInteger abstractNumID) {
  CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
  cTAbstractNum.setAbstractNumId(abstractNumID);

  CTLvl cTLvl = cTAbstractNum.addNewLvl();
  cTLvl.setIlvl(BigInteger.valueOf(0)); // set indent level 0
  cTLvl.addNewNumFmt().setVal(STNumberFormat.UPPER_LETTER);
  cTLvl.addNewLvlText().setVal("%1:");
  cTLvl.addNewStart().setVal(BigInteger.valueOf(1));

  XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);

  XWPFNumbering numbering = document.createNumbering();

  abstractNumID = numbering.addAbstractNum(abstractNum);

  BigInteger numID = numbering.addNum(abstractNumID);

  return numID;
 }

您仅看到 cTLvl.addNewNumFmt().setVal(STNumberFormat.UPPER_LETTER); 已更改。 %1: 又是一个模式。现在,它意味着 %1 = 1 级的下一个可用字母,后跟冒号 :

关于java - Apache poi Java。我正在尝试添加 upper_letter 编号,但结果是所有部分都编号为 A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60782708/

相关文章:

java - 我的 ArrayList 打印同一个对象两次

java - 如何根据 Apache POI 中的 "Name Box"值查找列索引号

java - 有没有办法在java中禁用Word文档的拼写检查?

java - poi无法将数据写入.xlsx

java - 仅从时间戳中获取日期

java - 如何使用 Java 将视频文件从 amazon s3 下载到特定文件夹

java - 获取网站中的链接

java - (true != false != true) 与 (false != true != false) 有何不同?

java - struts2 中 HttpServletResponse 的任何其他内置方法

java - 使用apache poi 3.9迭代写入xlsx文档时出现异常