Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache poi项目符号和编号_Java_Apache Poi - Fatal编程技术网

Java Apache poi项目符号和编号

Java Apache poi项目符号和编号,java,apache-poi,Java,Apache Poi,我正在使用ApachePOI将word文档转换为pdf。我正在用动态数据填充表行。一切正常,但我想做一些增强,就是在每行数据之前添加一个项目符号。下面是我用来填充表中行数据的for循环: for (String string : documentList) { XWPFTableRow lnewRow = ltable.createRow(); XWPFTableCell lnewCell = lnewRow.getCell(0); XWPFP

我正在使用ApachePOI将word文档转换为pdf。我正在用动态数据填充表行。一切正常,但我想做一些增强,就是在每行数据之前添加一个项目符号。下面是我用来填充表中行数据的for循环:

  for (String string : documentList) {
        XWPFTableRow lnewRow = ltable.createRow();
        XWPFTableCell lnewCell = lnewRow.getCell(0);
        XWPFParagraph lnewPara =lnewCell.getParagraphs().get(0);
        XWPFRun lnewRun = lnewPara.createRun();
        lnewRun.setText(string); 
  }

有谁能告诉我如何在每行数据之前添加一个项目符号吗?

已经有多个创建XWPF编号的示例。在我看来,大多数都是不必要的复杂。因此,让我们有一个最简单的解决方案:

import java.io.File;
import java.io.FileOutputStream;

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

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;

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 CreateWordTableWithBulletList {
 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument();

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

  XWPFTable ltable = document.createTable(1,1);

  ltable.getCTTbl().addNewTblGrid().addNewGridCol().setW(BigInteger.valueOf(5000));
  CTTblWidth tblWidth = ltable.getRow(0).getCell(0).getCTTc().addNewTcPr().addNewTcW();
  tblWidth.setW(BigInteger.valueOf(5000));
  tblWidth.setType(STTblWidth.DXA);

  ltable.getRow(0).getCell(0).getParagraphs().get(0).createRun().setText("The list:");

  ArrayList<String> documentList = new ArrayList<String>(
   Arrays.asList(
    new String[] {
     "documentList item 1",
     "documentList item 2",
     "documentList item 3"
    }));


//your code with supplements

  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.addNewNumFmt().setVal(STNumberFormat.BULLET);
  cTLvl.addNewLvlText().setVal("\u2022");
//*/

/* Decimal list
  CTLvl cTLvl = cTAbstractNum.addNewLvl();
  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) {
      XWPFTableRow lnewRow = ltable.createRow();
      XWPFTableCell lnewCell = lnewRow.getCell(0);
      XWPFParagraph lnewPara = null;
      if (lnewCell.getParagraphs().size() > 0) {
          lnewPara = lnewCell.getParagraphs().get(0);
      } else {
          lnewPara = lnewCell.addParagraph();
      }
      lnewPara.setNumID(numID);
      XWPFRun lnewRun = lnewPara.createRun();
      lnewRun.setText(string); 
  }

//your code end

  paragraph = document.createParagraph();

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

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

我的例子总是完整的例子。我已经用您的代码和我对它的补充标记了该部分。

可能有点晚了,但我应用了Axel提出的解决方案,效果很好

只是类CTLvlText有点问题,从方法cTLvl.addNewLvlText返回的对象无法在ApachePOIjars中找到它

我不是通过引入下一个级别来处理它,而是每次创建新的段落时都将NumId设置为该段落

private void generateVarios(XWPFDocument doc1, List<VariosDTO> varios) {
    CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
    cTAbstractNum.setAbstractNumId(BigInteger.valueOf(0));
    CTLvl cTLvl = cTAbstractNum.addNewLvl();
    cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);
    //CTLevelText a = cTLvl.addNewLvlText();

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

    for (VariosDTO item : varios){
        XWPFParagraph bulletedPara = doc1.createParagraph();
        XWPFRun run = bulletedPara.createRun();
        run.setFontFamily(ARIAL);
        run.setFontSize(10);
        run.setText(item.getComentario());
        bulletedPara.setNumID(numID);
    }
}
希望能对别人有用