提问者:小点点

ApachePOI有序列表


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

考虑到apache-poi有我见过的最糟糕的留档类型(基本上根本没有留档),而且它们的类和方法有绝对疯狂的名字,我很难理解如此复杂的例子。

问:有人能提供一个简洁的代码片段来在Word文档中创建这样MS列表吗?

提前谢谢。


共1个答案

匿名用户

首先,我认为在你的问题中链接的代码有问题,因为apache poi处于高度开发阶段,有时在早期版本中工作的代码在当前版本中不再工作。但是简单的副本

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

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文件,其中包含一个目录结构,其中包含XML文件。所以,如果我需要创建一个特殊的Word文档,我所做的就是使用Word本身创建该文档的最简单形式。然后我解压缩*.docx文件,并在/word/文档.xml中找到主要故事。我在那里找到编号(列表):

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

在段落中。这是对/word/number. xmlmumIds的引用。好吧,看看这个,我发现类似的东西:

<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 poiXWPF基于org. openxmlformats.schemas.word处理ml.x2006.main.*。所以我们有XWPFNumbering和XWPFAbstractNum,但是XWPFAbstractNum只能使用org.openxmlformats.schemas.word处理ml.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