簡體   English   中英

如何在 Apache POI Java 中垂直居中段落?

[英]How to center a paragraph vertically in Apache POI Java?

我目前正在構建一個字格式化工具,但在使用 Apache POI 時遇到了一些問題。

我正在使用 org.apache.poi 版本 5.2.0

看看這張照片:

在此處輸入圖像描述

我需要它水平和垂直居中。

目前它只是水平居中而不是垂直居中。

我不知道為什么。 這是我正在使用的代碼:

for (XWPFParagraph p : docx.getParagraphs()) {
        System.out.println(p.getText());

        boolean setBold = false;
        boolean setItalic = false;
        int fontSizeToSet = 16;

        if (counter == 0) {
            p.setAlignment(ParagraphAlignment.CENTER);
            p.setVerticalAlignment(TextAlignment.CENTER);
        }

        if (counter == 1) {
            p.setPageBreak(true);
        }

        List<XWPFRun> runs = p.getRuns();
        if (runs != null) {
            for (XWPFRun r : runs) {
                if (counter == 0) {
                    r.setFontSize(14);
                    r.setBold(true);
                    r.setFontFamily("Bookman Old Style");
                }
                
            }
        }

        counter++;
    }

我究竟做錯了什么?

XWPFParagraph.setVerticalAlignment不適用於垂直對齊頁面上的段落。 它在文本行中設置垂直 alignment。 這類似於vertical-align在 CSS 中的作用。它僅在文本行高於該行中的單個元素時才生效。 例如,如果在一個文本行中存在具有各種字體大小的文本。

TextAlignment具有以下枚舉常量:

AUTO
指定父 object 中的所有文本在顯示時應自動對齊。

BASELINE
指定父 object 中的所有文本在顯示時應與每個字符的基線對齊。

BOTTOM
指定父 object 中的所有文本在顯示時應與每個字符的底部對齊。

CENTER
指定父 object 中的所有文本在顯示時應與每個字符的中心對齊。

TOP
指定父 object 中的所有文本在顯示時應與每個字符的頂部對齊。

以下完整代碼示例顯示了不同文本 alignment 設置的效果。

要在頁面上垂直居中放置一個(或多個)段落,這些段落必須位於單個頁面上。 並且必須為此頁面設置部分屬性。 在部分屬性中,然后可以為上面的部分設置VAlign

不幸的是, apche poi到目前為止還沒有提供設置部分屬性。 因此必須使用低級org.openxmlformats.schemas.wordprocessingml.x2006.main.*類來實現相同的目的。

下面的完整示例也顯示了這一點。 它在上一節的下一頁放置一個帶有分節符的段落。 所以第一段在它自己的頁面上。 然后它將頁面垂直對齊設置為上面頁面的中心(上面的部分)。

import java.io.*;

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

public class CreateWordParagraphAndPageAlignment {
    
 static void createSomeRichTextContent(XWPFParagraph paragraph) {
  XWPFRun run = paragraph.createRun();  
  run.setText("Aligned ");
  run.setFontSize(11);
  run = paragraph.createRun();  
  run.setText("paragraph ");
  run.setFontSize(22);
  run = paragraph.createRun();  
  run.setText("having ");
  run.setFontSize(33);
  run = paragraph.createRun();  
  run.setText("various ");
  run.setFontSize(22);
  run = paragraph.createRun();  
  run.setText("font sizes");
  run.setFontSize(11);
 }

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

  XWPFDocument document = new XWPFDocument();
  
  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun();  
  run.setText("Default paragraph in first page, which has page vertical alignment set.");
  run.setFontSize(44);
  paragraph = document.createParagraph();

  //paragraph with section break next page for section above
  paragraph = document.createParagraph();
  org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr ctSectPr = paragraph.getCTP().addNewPPr().addNewSectPr();
  ctSectPr.addNewType().setVal(org.openxmlformats.schemas.wordprocessingml.x2006.main.STSectionMark.NEXT_PAGE);
  //set page vertical align center for page above (section above)
  ctSectPr.addNewVAlign().setVal(org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc.CENTER);
  //page size setting (A4) for the section above
  org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageSz ctPageSz = ctSectPr.addNewPgSz();
  ctPageSz.setW(java.math.BigInteger.valueOf(Math.round(8.27d*72d*20d))); //A4 = 8.27" * 72 * 20 = Twips
  ctPageSz.setH(java.math.BigInteger.valueOf(Math.round(11.69d*72d*20d))); //A4 = 11.69" * 72 * 20 = Twips


  paragraph = document.createParagraph();
  run = paragraph.createRun();  
  run.setText("Default paragraph");

  paragraph = document.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.CENTER);
  paragraph.setVerticalAlignment(TextAlignment.AUTO);
  createSomeRichTextContent(paragraph);

  paragraph = document.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.CENTER);
  paragraph.setVerticalAlignment(TextAlignment.BASELINE);
  createSomeRichTextContent(paragraph);
  
  paragraph = document.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.CENTER);
  paragraph.setVerticalAlignment(TextAlignment.BOTTOM);
  createSomeRichTextContent(paragraph);

  paragraph = document.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.CENTER);
  paragraph.setVerticalAlignment(TextAlignment.CENTER);
  createSomeRichTextContent(paragraph);
  
  paragraph = document.createParagraph();
  paragraph.setAlignment(ParagraphAlignment.CENTER);
  paragraph.setVerticalAlignment(TextAlignment.TOP);
  createSomeRichTextContent(paragraph);
  
  paragraph = document.createParagraph();
  
  // page size setting (A4) for the last section above must be at last in body
  ctSectPr = document.getDocument().getBody().addNewSectPr();
  ctPageSz = ctSectPr.addNewPgSz();
  ctPageSz.setW(java.math.BigInteger.valueOf(Math.round(8.27d*72d*20d))); //A4 = 8.27" * 72 * 20 = Twips
  ctPageSz.setH(java.math.BigInteger.valueOf(Math.round(11.69d*72d*20d))); //A4 = 11.69" * 72 * 20 = Twips

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

 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM