【问题标题】:Apache poi bullets and numberingApache poi 项目符号和编号
【发布时间】:2021-08-06 23:54:30
【问题描述】:

我正在使用 apache POI 将 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); 
  }

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

【问题讨论】:

    标签: java apache-poi


    【解决方案1】:

    已经有多个创建XWPFNumbering 的示例。在我看来,它们中的大多数都是不必要的复杂。所以让我们有一个最简单的解决方案:

    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.setIlvl(BigInteger.valueOf(0)); // set indent level 0
      cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);
      cTLvl.addNewLvlText().setVal("\u2022");
    //*/
    
    /* 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) {
          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");
     }
    }
    

    我的例子总是完整的例子。我已经用你的代码和我的补充标记了这部分。

    【讨论】:

      【解决方案2】:

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

      类 CTLvlText 有一点问题,从方法 cTLvl.addNewLvlText() 返回的对象,无法在 apache-poi jars 中找到它。

      我通过不引入下一个级别来处理它,而是在每次创建新段落时将 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);
          }
      }
      

      希望对某人有用!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多