【问题标题】:Apache POI numbered listApache POI 编号列表
【发布时间】:2021-08-06 23:52:57
【问题描述】:

我正在使用apache-poi 在 MS Word 文档中写入一些数据。我已经花了几个小时试图弄清楚如何创建编号列表,但我没有取得任何成果。

我已经解决了thisthat 和其他多个问题。考虑到apache-poi 拥有我见过的最糟糕的文档(基本上根本没有文档),而且它们的类和方法的名称绝对是疯狂的,我很难理解如此复杂的示例。

问: 谁能提供一个简洁的代码 sn-p 在 MS Word 文档中创建这样的列表:

  1. 一个
  2. 两个
  3. 三个

提前致谢。

【问题讨论】:

    标签: java ms-word apache-poi


    【解决方案1】:

    首先,我认为您的问题中链接的代码存在问题,因为apache poi 处于高度开发阶段,有时在早期版本中有效的代码在当前版本中不再有效。但即使在当前版本 3.16 中,简单的复制和粘贴代码也能生成工作代码。

    所以我删除了所有表格内容,因为链接的问题是关于表格单元格中的列表,我得到:

    import java.io.FileOutputStream;
    
    import org.apache.poi.xwpf.usermodel.*;
    
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    
    import java.math.BigInteger;
    
    public class CreateWordSimplestNumberingList {
    
     public static void main(String[] args) throws Exception {
    
      XWPFDocument document = new XWPFDocument();
    
      XWPFParagraph paragraph = document.createParagraph();
      XWPFRun run=paragraph.createRun();  
      run.setText("The list:");
    
      ArrayList<String> documentList = new ArrayList<String>(
       Arrays.asList(
        new String[] {
         "One",
         "Two",
         "Three"
        }));
    
      CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
      //Next we set the AbstractNumId. This requires care. 
      //Since we are in a new document we can start numbering from 0. 
      //But if we have an existing document, we must determine the next free number first.
      cTAbstractNum.setAbstractNumId(BigInteger.valueOf(0));
    
    /* Bullet list
      CTLvl cTLvl = cTAbstractNum.addNewLvl();
      cTLvl.setIlvl(BigInteger.valueOf(0)); // set indent level 0
      cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);
      cTLvl.addNewLvlText().setVal("•");
    */
    
    ///* Decimal list
      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));
    //*/
    
      XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
    
      XWPFNumbering numbering = document.createNumbering();
    
      BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
    
      BigInteger numID = numbering.addNum(abstractNumID);
    
      for (String string : documentList) {
       paragraph = document.createParagraph();
       paragraph.setNumID(numID);
       run=paragraph.createRun(); 
       run.setText(string); 
      }
    
      paragraph = document.createParagraph();
    
      FileOutputStream out = new FileOutputStream("CreateWordSimplestNumberingList.docx");
      document.write(out);
      out.close();
      document.close();
    
     }
    }
    

    这会导致:

    您需要知道的是,*.docx 文件只是一个 ZIP 文件,其中包含一个包含XMLfiles 的目录结构。因此,如果我需要创建一个特殊的 Word 文档,我要做的是使用 Word 本身创建该文档的最简单形式。然后我解压*.docx 文件并在/word/document.xml 中找到主要故事。我在那里找到编号(列表):

    <w:numId w:val="1"/>
    

    在段落内。这是对/word/numbering.xml 中的mumIds 的引用。好吧,看看这个,我发现类似:

    <w:numbering>
     <w:abstractNum w:abstractNumId="0">
      <w:lvl>
       <w:start w:val="1"/>
       <w:numFmt w:val="decimal"/>
       <w:lvlText w:val="%1."/>
      </w:lvl>
     </w:abstractNum>
     <w:num w:numId="1">
      <w:abstractNumId w:val="0"/>
     </w:num>
    </w:numbering>
    

    abstractNum 具有编号级别 (lvl) 的定义,num 具有 numId 和对 abstractNum 的引用。

    那么你需要知道apache poi XWPF 基于org.openxmlformats.schemas.wordprocessingml.x2006.main.*。所以我们有XWPFNumberingXWPFAbstractNumXWPFAbstractNum 只能使用org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum 创建所以如何找到有关CTAbstractNum 的文档。那么谷歌它并找到http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats/schemas/wordprocessingml/x2006/main/CTAbstractNum.java

    【讨论】:

    • 非常感谢您的宝贵时间!你真的帮了大忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多