繁体   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