Нужно вставить текст в конце страницы, но таблица все еще продолжается на следующей странице - PullRequest
0 голосов
/ 07 ноября 2019

Я создаю таблицу, которая расширяется до следующих 4 страниц в слове POI Apache, и когда таблица расширяется до следующей страницы, мне нужно вставить текст в конце первой страницы, и это должно произойти только дляна первой странице и на остальной странице текст вставлять не нужно

enter image description here

 private static void addFootnoteReference() throws IOException {
        XWPFDocument document = new XWPFDocument();
    document.createParagraph().createRun().setText("This is test");
    // check to add footnotes in case of empty
    if (document.getFootnotes().isEmpty()) {
        document.createFootnotes();
    }
    // add footnote
    CTFtnEdn ctfInstance = CTFtnEdn.Factory.newInstance();
    BigInteger id = new BigInteger("0");
    ctfInstance.setId(id);
    CTP ctp = ctfInstance.addNewP();
    ctp.addNewPPr().addNewPStyle().setVal("FootnoteText");
    CTR ctr = ctp.addNewR();
    ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
    ctr.addNewFootnoteRef();
    CTText cttext = ctp.addNewR().addNewT();
    cttext.setStringValue("Council Regulation (EC) No 1224/2009 of 20 November 2009 establishing a Community control system for ensuring compliance with the rules of the common fisheries policy, amending Regulations (EC) No 847/96, (EC) No 2371/2002, (EC) No 811/2004, (EC) No 768/2005, (EC) No 2115/2005, (EC) No 2166/2005, (EC) No 388/2006, (EC) No 509/2007, (EC) No 676/2007, (EC) No 1098/2007, (EC) No 1300/2008, (EC) No 1342/2008 and repealing Regulations (EEC) No 2847/93, (EC) No 1627/94 and (EC) No 1966/2006 (OJ L 343, 22.12.2009, p. 1).");
    cttext.setSpace(SpaceAttribute.Space.PRESERVE);
    // add footnote to document
    document.addFootnote(ctfInstance);
    ctr = document.getParagraphArray(0).getCTP().addNewR();
    ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
    ctr.addNewFootnoteReference().setId(id);

    // if styles dont already exist then create them
    if (document.getStyles()==null){
        document.createStyles();
    }

    CTStyle style = CTStyle.Factory.newInstance();
    style.setType(STStyleType.PARAGRAPH);

    CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
    indentNumber.setVal(BigInteger.valueOf(100));
    style.setStyleId("FootnoteText");
    style.addNewName().setVal("footnote text");
    style.addNewBasedOn().setVal("Normal");
    style.addNewLink().setVal("FootnoteTextChar");
    style.addNewUiPriority().setVal(new BigInteger("99"));
    style.addNewSemiHidden();
    style.addNewUnhideWhenUsed();
    CTRPr rpr = style.addNewRPr();

    rpr.addNewSz().setVal(new BigInteger("20"));
    rpr.addNewSzCs().setVal(new BigInteger("20"));

    // add style
    document.getStyles().addStyle(new XWPFStyle(style));

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

Приведенный выше код выдает результат в следующем формате: Extra 1 appearing on the top

1 Ответ

1 голос
/ 12 ноября 2019

То, что показывает ваш скриншот, является сноской. См. XWPFFootnote : «Создайте новую сноску, используя XWPFDocument.createFootnote() или XWPFFootnotes.createFootnote().»И: «Чтобы создать ссылку на сноску в абзаце, вы создаете прогон с CTFtnEdnRef, который указывает идентификатор целевого абзаца. Метод XWPFParagraph.addFootnoteReference(XWPFAbstractFootnoteEndnote) делает это за вас».

In Word сноска появляется только в нижней части той страницы, которая содержит абзац, к которому применена ссылка на сноску. Таким образом, если вы хотите стать сноской на странице 2, тогда вам нужно применить ссылку на сноску к абзацу на странице 2. За этим абзацем будет стоять номер (ссылка на сноску), который ссылается на сноску, которая появляется на ноге. страницы.

Полный пример того, как это может выглядеть в таблице, которая распространяется на несколько страниц:

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

import java.math.BigInteger;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFFootnote;

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

public class CreateWordTableMultiplePagesFootnote {

 static void setColumnWidth(XWPFTable table, int row, int col, int width) {
  CTTblWidth tblWidth = CTTblWidth.Factory.newInstance();
  tblWidth.setW(BigInteger.valueOf(width));
  tblWidth.setType(STTblWidth.DXA);
  CTTcPr tcPr = table.getRow(row).getCell(col).getCTTc().getTcPr();
  if (tcPr != null) {
   tcPr.setTcW(tblWidth);
  } else {
   tcPr = CTTcPr.Factory.newInstance();
   tcPr.setTcW(tblWidth);
   table.getRow(row).getCell(col).getCTTc().setTcPr(tcPr);
  }
 }

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

  XWPFDocument document= new XWPFDocument();

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

  // create footnote; will be referenced later
  XWPFFootnote footnote = document.createFootnote(); // apache poi 4.1.1
  paragraph = footnote.createParagraph();
  run=paragraph.createRun();  
  run.setText("The content of the footnote... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor...");

  //create table
  //2 rows 3 columns
  XWPFTable table = document.createTable(2, 3);

  for (int row = 0; row < 2; row++) {
   for (int col = 0; col < 3; col++) {
    table.getRow(row).getCell(col).setText("row " + row + ", col " + col);
    if (row < 1) { // header row
     table.getRow(row).getCell(col).setColor("D9D9D9"); // header row color
     table.getRow(row).setRepeatHeader(true); // header row shall repeat on new pages
    }
   }
  }

  //defining the column widths for the grid
  //column width values are in unit twentieths of a point (1/1440 of an inch)
  int defaultColWidth = 1*1440*6/3; // 3 columns fits to 6 inches 
  int[] colunmWidths = new int[] {
   defaultColWidth, defaultColWidth, defaultColWidth 
  };

  //create CTTblGrid for this table with widths of the columns. 
  //necessary for Libreoffice/Openoffice to accept the column widths.
  //first column
  table.getCTTbl().addNewTblGrid().addNewGridCol().setW(BigInteger.valueOf(colunmWidths[0]));
  setColumnWidth(table, 0, 0, colunmWidths[0]);
  //other columns
  for (int col = 1; col < colunmWidths.length; col++) {
   table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(colunmWidths[col]));
   setColumnWidth(table, 0, col, colunmWidths[0]);
  }

  //add more rows to fill the pages
  for (int row = 2; row < 100; row++) {
   XWPFTableRow tableRow = table.createRow();
   for (int col = 0; col < 3; col++) {
    tableRow.getCell(col).setText("row " + row + ", col " + col);
   }
   if (row == 35) { // 36th row should be in page 2
    if (tableRow.getCell(1).getParagraphs().size() > 0 ) // get the paragraph of second cell
     paragraph = tableRow.getCell(1).getParagraphs().get(0); 
    else paragraph = tableRow.getCell(1).addParagraph();
    //set footnote reference
    paragraph.addFootnoteReference(footnote); // apache poi 4.1.1
   }
  }

  paragraph = document.createParagraph();

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

 }
}

Тот же пример, подготовленный для использования с apache poi 3.14:

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

import java.math.BigInteger;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFFootnote;
import org.apache.poi.xwpf.usermodel.XWPFFootnotes;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFtnEdn;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;

import java.math.BigInteger;

public class CreateWordTableMultiplePagesFootnote {

 static void setColumnWidth(XWPFTable table, int row, int col, int width) {
  CTTblWidth tblWidth = CTTblWidth.Factory.newInstance();
  tblWidth.setW(BigInteger.valueOf(width));
  tblWidth.setType(STTblWidth.DXA);
  CTTcPr tcPr = table.getRow(row).getCell(col).getCTTc().getTcPr();
  if (tcPr != null) {
   tcPr.setTcW(tblWidth);
  } else {
   tcPr = CTTcPr.Factory.newInstance();
   tcPr.setTcW(tblWidth);
   table.getRow(row).getCell(col).getCTTc().setTcPr(tcPr);
  }
 }

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

  XWPFDocument document= new XWPFDocument();

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

  // create footnote; will be referenced later
  XWPFFootnotes footnotes = document.createFootnotes();
  CTFtnEdn ctFtnEdn = CTFtnEdn.Factory.newInstance();
  BigInteger footnoteId = BigInteger.valueOf(footnotes.getFootnotesList().size());
  ctFtnEdn.setId(footnoteId);
  XWPFFootnote footnote = footnotes.addFootnote(ctFtnEdn);
  paragraph = footnote.addNewParagraph(CTP.Factory.newInstance());
  run=paragraph.createRun();
  run.getCTR().addNewFootnoteRef(); 
  run=paragraph.createRun();  
  run.setText("The content of the footnote... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor... Lorem ipsum semit dolor...");

  //create table
  //2 rows 3 columns
  XWPFTable table = document.createTable(2, 3);

  for (int row = 0; row < 2; row++) {
   for (int col = 0; col < 3; col++) {
    table.getRow(row).getCell(col).setText("row " + row + ", col " + col);
    if (row < 1) { // header row
     table.getRow(row).getCell(col).setColor("D9D9D9"); // header row color
     table.getRow(row).setRepeatHeader(true); // header row shall repeat on new pages
    }
   }
  }

  //defining the column widths for the grid
  //column width values are in unit twentieths of a point (1/1440 of an inch)
  int defaultColWidth = 1*1440*6/3; // 3 columns fits to 6 inches 
  int[] colunmWidths = new int[] {
   defaultColWidth, defaultColWidth, defaultColWidth 
  };

  //create CTTblGrid for this table with widths of the columns. 
  //necessary for Libreoffice/Openoffice to accept the column widths.
  //first column
  table.getCTTbl().addNewTblGrid().addNewGridCol().setW(BigInteger.valueOf(colunmWidths[0]));
  setColumnWidth(table, 0, 0, colunmWidths[0]);
  //other columns
  for (int col = 1; col < colunmWidths.length; col++) {
   table.getCTTbl().getTblGrid().addNewGridCol().setW(BigInteger.valueOf(colunmWidths[col]));
   setColumnWidth(table, 0, col, colunmWidths[0]);
  }

  //add more rows to fill the pages
  for (int row = 2; row < 100; row++) {
   XWPFTableRow tableRow = table.createRow();
   for (int col = 0; col < 3; col++) {
    tableRow.getCell(col).setText("row " + row + ", col " + col);
   }
   if (row == 35) { // 36th row should be in page 2
    if (tableRow.getCell(1).getParagraphs().size() > 0 ) // get the paragraph of second cell
     paragraph = tableRow.getCell(1).getParagraphs().get(0); 
    else paragraph = tableRow.getCell(1).addParagraph();
    //set footnote reference
    paragraph.createRun().getCTR().addNewFootnoteReference().setId(footnoteId);
   }
  }

  paragraph = document.createParagraph();

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

 }
}
...