Java Word Appache POI - Вертикальное выравнивание содержимого ячейки / удаление пробела после текста - PullRequest
0 голосов
/ 23 февраля 2020

Моя таблица выглядит следующим образом: Таблица POI для слов

Как видно, текст выравнивается по верху ячейки. Я хочу, чтобы он был центрирован по вертикали или выровнен по низу ячейки. Я пытался добиться этого с помощью cell.setVerticalAlignment(XWPFVertAlign.CENTER);, но это ничего не меняет. Мне удалось добавить поля в ячейках с помощью table.setCellMargin (). Это добавило поле сверху ячейки, но пустое пространство под текстом делает ячейку слишком большой. Может быть, есть ли способ, чтобы ширина ячейки соответствовала высоте текста? Мой предполагаемый результат будет выглядеть так: желаемый результат

А вот часть моего кода: `

XWPFTable table = document.createTable();
CTTblWidth tableIndentation = table.getCTTbl().getTblPr().addNewTblInd();
tableIndentation.setW(BigInteger.valueOf(720));
tableIndentation.setType(STTblWidth.DXA);

XWPFTableRow tableRowOne = table.getRow(0);
XWPFParagraph paragraphTable = tableRowOne.getCell(0).addParagraph();
table.setCellMargins(0, 50, 0, 0);
XWPFRun runT = paragraphTable.createRun();

runT.setBold(true);
runT.setColor("ffffff");
runT.setText("REFERENCE ACTIVITIES PROVIDED: " + String.valueOf(def.format(c.getEarnedSum())) + " POINTS EARNED");
runT = tableRowOne.addNewTableCell().addParagraph().createRun();
runT = tableRowOne.addNewTableCell().addParagraph().createRun();

tableRowOne.getCell(0).getCTTc().addNewTcPr().addNewShd().setFill("8dc63f");
tableRowOne.getCell(1).getCTTc().addNewTcPr().addNewShd().setFill("8dc63f");
tableRowOne.getCell(2).getCTTc().addNewTcPr().addNewShd().setFill("8dc63f");
tableRowOne.getCell(0).removeParagraph(0);
tableRowOne.getCell(1).removeParagraph(0);
tableRowOne.getCell(2).removeParagraph(0);`

1 Ответ

2 голосов
/ 23 февраля 2020

XWPFTableCell.setVerticalAlignment работает. Но нужно знать, что каждый абзац имеет интервал по умолчанию 10pt после него. Таким образом, высота абзаца равна высоте текста плюс 10pt. И эта высота будет выровнена по вертикали.

Таким образом, чтобы XWPFTableCell.setVerticalAlignment работал так, как вы ожидаете, вам нужно установить интервал после абзацев равным 0.

Полный пример:

import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;

public class CreateWordTableVerticalAlign {

 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 the table
  XWPFTable table = document.createTable(3,3);
  table.setWidth("100%");
  for (int r = 0; r < 3; r++) {
   XWPFTableRow row = table.getRow(r);

   row.setHeight(1440/2); // 1/2inch; 1440Twip = 1440/20 == 72pt = 1inch 

   for (int c = 0; c < 3; c++) {
    XWPFTableCell cell = row.getCell(c);
    cell.setText("row " + r + ", col " + c);

    // get first paragraph in cell - this contains the content set above by cell.setText
    XWPFParagraph firstParagraphInCell = cell.getParagraphArray(0);
    // set spacing after to 0 (defaults to 10pt)
    firstParagraphInCell.setSpacingAfter(0);

    if (r == 0) {
     // default vertical align
    } else if (r == 1) {
     cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
    } else if (r == 2) {
     cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTTOM);
    }
   }
  }

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

Результат:

enter image description here

...