如何在 poi 单词、有序数字或其他符号中为列表符号添加列表? [英] How can I add List in poi word, ordered number or other symbol for list symbol?

查看:42
本文介绍了如何在 poi 单词、有序数字或其他符号中为列表符号添加列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家!首先,我想在我的 poi 字(XWPF)中添加列表,其次,我想使用黑色立方体作为列表符号,如下图所示.第三,如果有序数字而不是黑色立方体符号我该怎么办.有人能给我一些建议吗?非常感谢!

解决方案

由于在 XWPFNumbering, XWPFAbstractNum 是必需的,并且直到现在,至少 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNumorg.openxmlformats.schemas.wordprocessingml代码>是必需的.

CTAbstractNum 用于在其中创建单个子对象.但是生成的代码将是非常小的部分代码,因此需要很多代码行.所以我认为最好的方法是解析 XML 来创建 AbstractNum.要获得这个 XML,可以创建一个简单的 Word 文档并带有编号,然后解压缩 *.docx 文件并查看 /word/numbering.xml.在那里你会找到类似的东西:

<w:abstractNum w:abstractNumId="0"><w:multiLevelType w:val="hybridMultilevel"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:numFmt w:val="decimal"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:hanging="360" w:left="720"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="decimal"/><w:lvlText w:val="%1.%2"/><<;w:lvlJc w:val="left"/><w:pPr><w:ind w:hanging="360" w:left="1440"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tentative="1"><w:start w:val="1"/><w:numFmt w:val="decimal"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:hanging="360" w:left="2160"/></w:pPr></w:lvl></w:abstractNum>...</w:编号>

例如 3 级十进制编号.

这个 XML 在我看来是自我解释的.每个编号级别都有一个 lvl 定义,定义了它的外观和缩进.

对于项目符号编号,XML 将是类似的,但所使用的项目符号字符的字形将使用 Font 定义额外定义.例如,黑色立方体"是来自 Wingdings 字体的字形.

<预><代码>...<w:lvl w:ilvl="0"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJcw:val="left"/><w:pPr><w:ind w:hanging="360" w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/></w:rPr></w:lvl>...

知道了这一点,我们就可以编码了:

import java.io.File;导入 java.io.FileOutputStream;导入 org.apache.poi.xwpf.usermodel.*;导入 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;导入 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumbering;导入 java.math.BigInteger;公共类 CreateWordBulletOrDecimalList {静态字符串 cTAbstractNumBulletXML ="<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"+ ""+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr></w:lvl>"+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"-\"/><w:lvlJc w:val=\"left\"/><w:pPr>;<w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/></w:rPr></w:lvl>"+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr>;<w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"符号\" w:hAnsi=\"符号\" w:hint=\"default\"/></w:rPr></w:lvl>"+ "</w:abstractNum>";静态字符串 cTAbstractNumDecimalXML ="<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"+ ""+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr></w:lvl>"+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2\"/><w:lvlJc w:val=\"left\"/><;w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr></w:lvl>"+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2.%3\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/</w:pPr></w:lvl>"+ "</w:abstractNum>";public static void main(String[] args) 抛出异常 {XWPFDocument 文档 = 新 XWPFDocument();XWPFParagraph 段落 = document.createParagraph();XWPFRun run=paragraph.createRun();run.setText("列表:");CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumBulletXML);//CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumDecimalXML);CTAbstractNum cTAbstractNum = cTNumbering.getAbstractNumArray(0);XWPFAbstractNum abstractNum = 新 XWPFAbstractNum(cTAbstractNum);XWPFNumbering 编号 = document.createNumbering();BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);BigInteger numID = numbering.addNum(abstractNumID);for (int i = 0; i <5; i++) {段落 = document.createParagraph();段落.setNumID(numID);运行 = 段落.createRun();run.setText("列表项" + (i+1));if (i <4) 段落.setSpacingAfter(0);如果(我== 0){for (int j = 0; j <2; j++) {段落 = document.createParagraph();段落.setNumID(numID);段落.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));运行 = 段落.createRun();run.setText("子列表项" + (i+1) + " " + (char)(97+j));段落.setSpacingAfter(0);}}如果 (i == 1 || i == 3) {段落 = document.createParagraph();段落.setNumID(numID);段落.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));运行 = 段落.createRun();run.setText("子列表项" + (i+1) + " a");段落.setSpacingAfter(0);}}段落 = document.createParagraph();运行=paragraph.createRun();run.setText("列表后面的段落.");FileOutputStream out = new FileOutputStream("CreateWordBulletOrDecimalList.docx");document.write(out);System.out.println("CreateWordBulletOrDecimalList 写入成功");}}

<小时>

在一个文档中使用两种列表的代码:

import java.io.File;导入 java.io.FileOutputStream;导入 org.apache.poi.xwpf.usermodel.*;导入 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;导入 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumbering;导入 java.math.BigInteger;公共类 CreateWordBulletAndDecimalList {静态字符串 cTAbstractNumBulletXML ="<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"+ ""+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr></w:lvl>"+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"-\"/><w:lvlJc w:val=\"left\"/><w:pPr>;<w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/></w:rPr></w:lvl>"+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr>;<w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"符号\" w:hAnsi=\"符号\" w:hint=\"default\"/></w:rPr></w:lvl>"+ "</w:abstractNum>";静态字符串 cTAbstractNumDecimalXML ="<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"1\">"+ ""+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr></w:lvl>"+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2\"/><w:lvlJc w:val=\"left\"/><;w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr></w:lvl>"+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2.%3\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/</w:pPr></w:lvl>"+ "</w:abstractNum>";public static void main(String[] args) 抛出异常 {XWPFDocument 文档 = 新 XWPFDocument();CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumBulletXML);CTAbstractNum cTAbstractNum = cTNumbering.getAbstractNumArray(0);XWPFAbstractNum abstractNum1 = 新 XWPFAbstractNum(cTAbstractNum);cTNumbering = CTNumbering.Factory.parse(cTAbstractNumDecimalXML);cTAbstractNum = cTNumbering.getAbstractNumArray(0);XWPFAbstractNum abstractNum2 = 新 XWPFAbstractNum(cTAbstractNum);XWPFNumbering 编号 = document.createNumbering();BigInteger abstractNumID1 = numbering.addAbstractNum(abstractNum1);BigInteger numID1 = numbering.addNum(abstractNumID1);BigInteger abstractNumID2 = numbering.addAbstractNum(abstractNum2);BigInteger numID2 = numbering.addNum(abstractNumID2);XWPFParagraph 段落 = document.createParagraph();XWPFRun run=paragraph.createRun();run.setText("列表:");段落 = document.createParagraph();段落 = document.createParagraph();运行=paragraph.createRun();run.setText("项目符号列表:");for (int i = 0; i <5; i++) {段落 = document.createParagraph();段落.setNumID(numID1);运行 = 段落.createRun();run.setText("列表项" + (i+1));if (i <4) 段落.setSpacingAfter(0);如果(我== 0){for (int j = 0; j <2; j++) {段落 = document.createParagraph();段落.setNumID(numID1);段落.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));运行 = 段落.createRun();run.setText("子列表项" + (i+1) + " " + (char)(97+j));段落.setSpacingAfter(0);}}如果 (i == 1 || i == 3) {段落 = document.createParagraph();段落.setNumID(numID1);段落.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));运行 = 段落.createRun();run.setText("子列表项" + (i+1) + " a");段落.setSpacingAfter(0);}}段落 = document.createParagraph();段落 = document.createParagraph();运行=paragraph.createRun();run.setText("十进制列表:");for (int i = 0; i <5; i++) {段落 = document.createParagraph();段落.setNumID(numID2);运行 = 段落.createRun();run.setText("列表项" + (i+1));if (i <4) 段落.setSpacingAfter(0);如果(我== 0){for (int j = 0; j <2; j++) {段落 = document.createParagraph();段落.setNumID(numID2);段落.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));运行 = 段落.createRun();run.setText("子列表项" + (i+1) + " " + (char)(97+j));段落.setSpacingAfter(0);}}如果 (i == 1 || i == 3) {段落 = document.createParagraph();段落.setNumID(numID2);段落.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));运行 = 段落.createRun();run.setText("子列表项" + (i+1) + " a");段落.setSpacingAfter(0);}}段落 = document.createParagraph();段落 = document.createParagraph();运行=paragraph.createRun();run.setText("列表后面的段落.");FileOutputStream out = new FileOutputStream("CreateWordBulletAndDecimalList.docx");document.write(out);System.out.println("CreateWordBulletAndDecimalList 写入成功");}}

everyone! first, I want to add list in my poi word(XWPF), second, I want to using black cube as the list symbol like picture as below. third, what I should to do if ordered number instead of the black cube symbol. Could someone give me some advice? Thanks so lot!

解决方案

Since for new adding a new AbstractNum in XWPFNumbering, XWPFAbstractNum is needed and this is not able to create without using underlaying low level objects until now, at least org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum is needed.

There are methods in CTAbstractNum for creating the single sub objects therein. But the resulting code would be very small part code and so much many code lines would be necessary. So the best way in my opinion is parsing XML for creating the AbstractNum. To get this XML one can create a simple Worddocument having numbering and then unzip the *.docx file and have a look at /word/numbering.xml. There you will find something like:

<w:numbering>
 <w:abstractNum w:abstractNumId="0">
  <w:multiLevelType w:val="hybridMultilevel"/>
  <w:lvl w:ilvl="0">
   <w:start w:val="1"/><w:numFmt w:val="decimal"/><w:lvlText w:val="%1"/><w:lvlJc w:val="left"/>
   <w:pPr>
    <w:ind w:hanging="360" w:left="720"/>
   </w:pPr>
  </w:lvl>
  <w:lvl w:ilvl="1" w:tentative="1">
   <w:start w:val="1"/><w:numFmt w:val="decimal"/><w:lvlText w:val="%1.%2"/><w:lvlJc w:val="left"/>
   <w:pPr>
    <w:ind w:hanging="360" w:left="1440"/>
   </w:pPr>
  </w:lvl>
  <w:lvl w:ilvl="2" w:tentative="1">
   <w:start w:val="1"/><w:numFmt w:val="decimal"/><w:lvlText w:val="%1.%2.%3"/><w:lvlJc w:val="left"/>
   <w:pPr>
    <w:ind w:hanging="360" w:left="2160"/>
   </w:pPr>
  </w:lvl>
 </w:abstractNum>
...
</w:numbering>

for a 3 level decimal numbering for example.

This XML is self explained in my opinion. There is a lvl definition for each numbering level having definitions for it's appearance and indention.

For a bullet numbering the XMLwill be similar but the glyphs for the bullet characters used will be additional defined using Font definition. The "black cube" for example is a glyph from font Wingdings.

...
<w:lvl w:ilvl="0">
 <w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/>
 <w:pPr>
  <w:ind w:hanging="360" w:left="720"/>
 </w:pPr>
 <w:rPr>
  <w:rFonts w:ascii="Wingdings" w:hAnsi="Wingdings" w:hint="default"/>
 </w:rPr>
</w:lvl>
...

Knowing this we can code:

import java.io.File;
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.CTNumbering;

import java.math.BigInteger;

public class CreateWordBulletOrDecimalList {

 static String cTAbstractNumBulletXML = 
  "<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"
+ "<w:multiLevelType w:val=\"hybridMultilevel\"/>"
+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr></w:lvl>"
+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"-\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/></w:rPr></w:lvl>"
+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/></w:rPr></w:lvl>"
+ "</w:abstractNum>";

 static String cTAbstractNumDecimalXML = 
  "<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"
+ "<w:multiLevelType w:val=\"hybridMultilevel\"/>"
+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr></w:lvl>"
+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr></w:lvl>"
+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2.%3\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr></w:lvl>"
+ "</w:abstractNum>";

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

  XWPFDocument document = new XWPFDocument();

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The List:");

  CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumBulletXML);
  //CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumDecimalXML);

  CTAbstractNum cTAbstractNum = cTNumbering.getAbstractNumArray(0);

  XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);

  XWPFNumbering numbering = document.createNumbering();

  BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);

  BigInteger numID = numbering.addNum(abstractNumID);

  for (int i = 0; i < 5; i++) {
   paragraph = document.createParagraph();
   paragraph.setNumID(numID);
   run = paragraph.createRun();
   run.setText("List item " + (i+1)); 
   if (i < 4) paragraph.setSpacingAfter(0);
   if (i == 0) {
    for (int j = 0; j < 2; j++) {
     paragraph = document.createParagraph();
     paragraph.setNumID(numID);
     paragraph.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));
     run = paragraph.createRun();
     run.setText("Sub list item " + (i+1) + " " + (char)(97+j));
     paragraph.setSpacingAfter(0);
    }
   }
   if (i == 1 || i == 3) {
    paragraph = document.createParagraph();
    paragraph.setNumID(numID);
    paragraph.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));
    run = paragraph.createRun();
    run.setText("Sub list item " + (i+1) + " a");
    paragraph.setSpacingAfter(0); 
   }
  }

  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("Paragraph after the list.");

  FileOutputStream out = new FileOutputStream("CreateWordBulletOrDecimalList.docx");    
  document.write(out);

  System.out.println("CreateWordBulletOrDecimalList written successully");
 }
}


Code for using both kind of lists in one document:

import java.io.File;
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.CTNumbering;

import java.math.BigInteger;

public class CreateWordBulletAndDecimalList {

 static String cTAbstractNumBulletXML = 
  "<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"0\">"
+ "<w:multiLevelType w:val=\"hybridMultilevel\"/>"
+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/></w:rPr></w:lvl>"
+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"-\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/></w:rPr></w:lvl>"
+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"bullet\"/><w:lvlText w:val=\"\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr><w:rPr><w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/></w:rPr></w:lvl>"
+ "</w:abstractNum>";

 static String cTAbstractNumDecimalXML = 
  "<w:abstractNum xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:abstractNumId=\"1\">"
+ "<w:multiLevelType w:val=\"hybridMultilevel\"/>"
+ "<w:lvl w:ilvl=\"0\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"720\" w:hanging=\"360\"/></w:pPr></w:lvl>"
+ "<w:lvl w:ilvl=\"1\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"1440\" w:hanging=\"360\"/></w:pPr></w:lvl>"
+ "<w:lvl w:ilvl=\"2\" w:tentative=\"1\"><w:start w:val=\"1\"/><w:numFmt w:val=\"decimal\"/><w:lvlText w:val=\"%1.%2.%3\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"2160\" w:hanging=\"360\"/></w:pPr></w:lvl>"
+ "</w:abstractNum>";

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

  XWPFDocument document = new XWPFDocument();

  CTNumbering cTNumbering = CTNumbering.Factory.parse(cTAbstractNumBulletXML);
  CTAbstractNum cTAbstractNum = cTNumbering.getAbstractNumArray(0);
  XWPFAbstractNum abstractNum1 = new XWPFAbstractNum(cTAbstractNum);


  cTNumbering = CTNumbering.Factory.parse(cTAbstractNumDecimalXML);
  cTAbstractNum = cTNumbering.getAbstractNumArray(0);
  XWPFAbstractNum abstractNum2 = new XWPFAbstractNum(cTAbstractNum);

  XWPFNumbering numbering = document.createNumbering();

  BigInteger abstractNumID1 = numbering.addAbstractNum(abstractNum1);
  BigInteger numID1 = numbering.addNum(abstractNumID1);

  BigInteger abstractNumID2 = numbering.addAbstractNum(abstractNum2);
  BigInteger numID2 = numbering.addNum(abstractNumID2);

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("The lists:");
  paragraph = document.createParagraph();

  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("The bullet list:");

  for (int i = 0; i < 5; i++) {
   paragraph = document.createParagraph();
   paragraph.setNumID(numID1);
   run = paragraph.createRun();
   run.setText("List item " + (i+1)); 
   if (i < 4) paragraph.setSpacingAfter(0);
   if (i == 0) {
    for (int j = 0; j < 2; j++) {
     paragraph = document.createParagraph();
     paragraph.setNumID(numID1);
     paragraph.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));
     run = paragraph.createRun();
     run.setText("Sub list item " + (i+1) + " " + (char)(97+j));
     paragraph.setSpacingAfter(0);
    }
   }
   if (i == 1 || i == 3) {
    paragraph = document.createParagraph();
    paragraph.setNumID(numID1);
    paragraph.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));
    run = paragraph.createRun();
    run.setText("Sub list item " + (i+1) + " a");
    paragraph.setSpacingAfter(0); 
   }
  }

  paragraph = document.createParagraph();
  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("The decimal list:");

  for (int i = 0; i < 5; i++) {
   paragraph = document.createParagraph();
   paragraph.setNumID(numID2);
   run = paragraph.createRun();
   run.setText("List item " + (i+1)); 
   if (i < 4) paragraph.setSpacingAfter(0);
   if (i == 0) {
    for (int j = 0; j < 2; j++) {
     paragraph = document.createParagraph();
     paragraph.setNumID(numID2);
     paragraph.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));
     run = paragraph.createRun();
     run.setText("Sub list item " + (i+1) + " " + (char)(97+j));
     paragraph.setSpacingAfter(0);
    }
   }
   if (i == 1 || i == 3) {
    paragraph = document.createParagraph();
    paragraph.setNumID(numID2);
    paragraph.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1));
    run = paragraph.createRun();
    run.setText("Sub list item " + (i+1) + " a");
    paragraph.setSpacingAfter(0); 
   }
  }

  paragraph = document.createParagraph();
  paragraph = document.createParagraph();
  run=paragraph.createRun();  
  run.setText("Paragraph after the lists.");

  FileOutputStream out = new FileOutputStream("CreateWordBulletAndDecimalList.docx");    
  document.write(out);

  System.out.println("CreateWordBulletAndDecimalList written successully");
 }
}

这篇关于如何在 poi 单词、有序数字或其他符号中为列表符号添加列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆