PowerPoint 文件显示的表格行高比使用 Apache POI 的代码应用的计算高度要高

问题描述 投票:0回答:2

我正在使用 Apache POI 5.2.1 库创建 PowerPoint 文件。 如果使用 API XSLFTableRow.setHeight() 设置高度,则无法在 PowerPoint 上正确设置高度。 如果打开文件,我们可以在布局选项卡中看到行的高度不同。 在布局选项卡中的 PowerPoint 文件中看到的高度大于通过代码应用的高度。

例如,我通过代码将行高应用为 26 点。但在 PowerPoint 文件的布局选项卡中看到的高度是 0.45 英寸,即 32.4 点。

有人遇到过这样的问题,应用的高度更多吗?

如果有很多列,文本会换行并且幻灯片中的表格会溢出。选中后,PowerPoint 文件中的行高比计算值高。

代码中应用的行高应与 PowerPoint 布局选项卡中的行高相同。因此,表格不应从幻灯片中溢出。

apache-poi powerpoint
2个回答
3
投票

在 PowerPoint 中,表格行高不能小于所需的文本行高。默认字体大小为 18pt。因此,默认文本行高为 18pt 加上升部分加下降部分加上顶部边距加上底部边距,并且大于 26pt。因此 PowerPoint 将表格行渲染得更大以适合字体大小。

下面的例子说明了这一点。中间表格行的高度将恰好为 26pt,因为其使用的字体大小仅为 12pt。

import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.TableCell.BorderEdge;

import java.awt.Rectangle;
import java.awt.Point;
import java.awt.Color;

public class CreatePPTXTable {
    
 static void setAllCellBorders(XSLFTableCell cell, Color color) {
  cell.setBorderColor(BorderEdge.top, color);
  cell.setBorderColor(BorderEdge.right, color);
  cell.setBorderColor(BorderEdge.bottom, color);
  cell.setBorderColor(BorderEdge.left, color);
 }
 
 public static void main(String[] args) throws Exception {

  XMLSlideShow slideShow = new XMLSlideShow();

  XSLFSlide slide = slideShow.createSlide();
  
  XSLFTable tbl;
  XSLFTableRow row;
  XSLFTableCell cell;  
  
  String[][] data = {
   {"R1C1", "R1C2", "R1C3"},
   {"R2C1", "R2C2", "R2C3"},
   {"R3C1", "R3C2", "R3C3"}
  };
  
  tbl = slide.createTable(data.length, data[0].length);
  tbl.setAnchor(new Rectangle(new Point(100, 100)));

  for (int r = 0; r < data.length; r++) {
   //tbl.setRowHeight(r, 26d);
   row = tbl.getRows().get(r);
   row.setHeight(26d);
   String[] dataRow = data[r];
   for (int c = 0; c < dataRow.length; c++) {
    tbl.setColumnWidth(c, 120d);
    String value = dataRow[c];
    cell = tbl.getCell(r, c);
    setAllCellBorders(cell, Color.BLACK);
    cell.setText(value);
    if (r == 1) {
     for (XSLFTextParagraph par : cell.getTextParagraphs()) {
      for (XSLFTextRun run : par.getTextRuns()) {
       run.setFontSize(12d);
      }      
     }
    }
   }
  }

  
  FileOutputStream out = new FileOutputStream("./CreatePPTXTable.pptx");
  slideShow.write(out);
  out.close();
  slideShow.close();
 }
}

0
投票

我也有同样的问题。你能解决这个问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.