当前位置: 首页 > 知识库问答 >
问题:

需要减少apache poi word中2个单元格之间的空间

楮庆
2023-03-14

我正在试着做一张桌子。我需要减少2行之间的空间,但我不能使用row.setheight()实现结果。

代码如下:

import eu.europa.ec.fisheries.quotaprepservice.constants.StrConstants;
import eu.europa.ec.fisheries.quotaprepservice.report.bean.Annexe1ATacBeanQuotaItem;
import eu.europa.ec.fisheries.quotaprepservice.report.bean.TacBean;
import org.apache.logging.log4j.util.Strings;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.List;

import static eu.europa.ec.fisheries.quotaprepservice.constants.StrConstants.*;

public class WordBuilder1 {
    public static void main(String[] args) throws Exception {
        XWPFDocument document = new XWPFDocument();
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        run.setText("The table:");
        XWPFTable table = document.createTable(4, 8);
        prepareQuotaList(table);
        CTSectPr sectPr = document.getDocument().getBody().getSectPr();
        if (sectPr == null) sectPr = document.getDocument().getBody().addNewSectPr();
        CTPageSz pageSz = sectPr.addNewPgSz();
        pageSz.setOrient(STPageOrientation.PORTRAIT);
        pageSz.setW(BigInteger.valueOf(11900)); //12240 Twips = 12240/20 = 612 pt = 612/72 = 8.5"
        pageSz.setH(BigInteger.valueOf(16840)); //15840 Twips = 15840/20 = 792 pt = 792/72 = 11"

        FileOutputStream out = new FileOutputStream("C:\\Users\\mishrne\\example.docx");
        document.write(out);
        out.close();
    }

    private static void prepareQuotaList(XWPFTable table) {
        int count = 0;
        for (int row = 0; row < 4; row++) {
            XWPFTableRow tableRow = table.getRow(row);
            tableRow.setHeight((short) 0);
            for (int col = 0; col < 3; col++) {
                setCellBorders(tableRow.getCell(col), new STBorder.Enum[]{STBorder.NIL, STBorder.NIL, STBorder.NIL, STBorder.NIL});
            }
            setCellBorders(tableRow.getCell(3), new STBorder.Enum[]{STBorder.NIL, STBorder.NIL, STBorder.NIL, STBorder.NIL});
            setCellBorders(tableRow.getCell(4), new STBorder.Enum[]{STBorder.NIL, STBorder.NIL, STBorder.NIL, STBorder.NIL});
            for (int col = 5; col < 8; col++) {
                setCellBorders(tableRow.getCell(col), new STBorder.Enum[]{STBorder.NIL, STBorder.NIL, STBorder.NIL, STBorder.NIL});
            }
            if (count == 2) {
                createCell(tableRow.getCell(0), TAC, ParagraphAlignment.LEFT, 9);
                createCell(tableRow.getCell(2), "80", "(2)", ParagraphAlignment.RIGHT);
            } else {
                createCell(tableRow.getCell(0), "Belgium", ParagraphAlignment.LEFT, 9);
                mergeCellHorizontally(table, row, 2, 3);
                createCell(tableRow.getCell(2), "80", "(2)", ParagraphAlignment.RIGHT);
            }
            count++;
        }
    }

    private static void createCell(XWPFTableCell cell, String text, ParagraphAlignment paragraphAlignment, int fontSize) {
        XWPFParagraph paragraph = (cell.getParagraphs().size() > 0) ? cell.getParagraphs().get(0) : cell.addParagraph();
        paragraph.setIndentationLeft(5 * 20); // 10pt left indentation
        paragraph.setAlignment(paragraphAlignment);
        paragraph.setWordWrapped(true);
        XWPFRun run = (paragraph.getRuns().size() > 0) ? paragraph.getRuns().get(0) : paragraph.createRun();
        run.setText(text);
        run.setFontFamily(TIMES_NEW_ROMAN);
        run.setFontSize(fontSize);
        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
    }

    private static void createCell(XWPFTableCell cell, String text, String superscriptText, ParagraphAlignment left) {
        XWPFRun run;
        XWPFParagraph paragraph = (cell.getParagraphs().size() > 0) ? cell.getParagraphs().get(0) : cell.addParagraph();
        paragraph.setIndentationLeft(5 * 20); // 10pt left indentation
        paragraph.setAlignment(ParagraphAlignment.LEFT);
        paragraph.setSpacingBefore(0);
        paragraph.setSpacingBeforeLines(0);
        run = (paragraph.getRuns().size() > 0) ? paragraph.getRuns().get(0) : paragraph.createRun();
        run.setFontFamily(TIMES_NEW_ROMAN);
        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
        run.setFontSize(9);
        run.setText(text);
        run = paragraph.createRun();
        run.setText(StrConstants.BLANK_SPACE + StrConstants.BLANK_SPACE + StrConstants.BLANK_SPACE + superscriptText);
        run.setFontSize(9);
        run.setFontFamily(TIMES_NEW_ROMAN);
        run.setSubscript(VerticalAlign.SUPERSCRIPT); // superscript (2)
    }

    private static void mergeCellHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
        XWPFTableCell cell = table.getRow(row).getCell(fromCol);
        CTTcPr tcPr = cell.getCTTc().getTcPr();
        if (tcPr == null) tcPr = cell.getCTTc().addNewTcPr();
        if (tcPr.isSetGridSpan()) {
            tcPr.getGridSpan().setVal(BigInteger.valueOf(toCol - fromCol + 1));
        } else {
            tcPr.addNewGridSpan().setVal(BigInteger.valueOf(toCol - fromCol + 1));
        }
        for (int colIndex = toCol; colIndex > fromCol; colIndex--) {
            table.getRow(row).getCtRow().removeTc(colIndex);
            table.getRow(row).removeCell(colIndex);
        }
    }

    private static void setCellBorders(XWPFTableCell cell, STBorder.Enum[] borderTypesLTRB) {
        CTTcBorders borders = CTTcBorders.Factory.newInstance();
        borders.addNewLeft().setVal(borderTypesLTRB[0]);
        borders.addNewTop().setVal(borderTypesLTRB[1]);
        borders.addNewRight().setVal(borderTypesLTRB[2]);
        borders.addNewBottom().setVal(borderTypesLTRB[3]);
        CTTcPr tcPr = cell.getCTTc().getTcPr();
        if (tcPr != null) {
            tcPr.setTcBorders(borders);
        } else {
            tcPr = CTTcPr.Factory.newInstance();
            tcPr.setTcBorders(borders);
            cell.getCTTc().setTcPr(tcPr);
        }
    }

}

共有1个答案

朱浩大
2023-03-14

要在XWPFTable table中设置表格行高度,还必须在高度本身之外设置高度规则。例如:

table.getRow(0).setHeight(12*20); // row height in twentieth pt
table.getRow(0).getCtRow().getTrPr().getTrHeightArray(0).setHRule(STHeightRule.EXACT); // height rule exact

有以下可能的高度规则:

至少_:至少达到给定高度。如有需要,可调高,但不可调低。

AUTO:默认值。一个默认段落的默认高度,包括前后的行间距。根据需要高依赖于内容。

EXACT:精确给定的高度。内容可能会被剪掉。

请注意,XWPFTableRow.setHeight的0值与精确的高度规则结合使用将不被接受。这会回到默认的AUTO高度。

根据您的代码示例:

...
    private static void prepareQuotaList(XWPFTable table) {
        int count = 0;
        for (int row = 0; row < 4; row++) {
            XWPFTableRow tableRow = table.getRow(row);
            tableRow.setHeight(12*20); // row height = 12 pt
            tableRow.getCtRow().getTrPr().getTrHeightArray(0).setHRule(STHeightRule.EXACT); // height rule exact
            for (int col = 0; col < 3; col++) {
                setCellBorders(tableRow.getCell(col), new STBorder.Enum[]{STBorder.NIL, STBorder.NIL, STBorder.NIL, STBorder.NIL});
            }
...
    }
...

如上所述,只有三个高度规则是可能的。因此,如果目标是使表行与其内容一样高,但不能多或少,则必须使用高度规则AUTO。然后段落的高度决定行的高度。注意XWPFParagraph可能在文本行之前、之间和之后设置了间距。因此,您可能必须设置:

...
paragraph.setSpacingAfter(0);
paragraph.setSpacingBetween(1); // don't set this 0
paragraph.setSpacingBefore(0);
...

必须为已包含段落的每个表格单元格设置此选项。因此,如果整个表格需要,那么:

XWPFTable table = document.createTable(4, 8);
for (XWPFTableRow row : table.getRows()) {
 for (XWPFTableCell cell : row.getTableCells()) {
  for (XWPFParagraph p : cell.getParagraphs()) {
   p.setSpacingAfter(0);
   p.setSpacingBetween(1); // don't set this 0
   p.setSpacingBefore(0);
  }
 }
}

 类似资料:
  • 我有一个字符串数组,通过它映射使用CheckboxListTile小部件作为标签不同的复选框,但我需要减少这些复选框之间的空间。

  • 问题内容: 我这里有两个div: 有没有办法在这两个div之间分隔空间? 问题答案: 您可以使用属性: HTML: CSS: 还有其他选择吗? 好吧 ,不是真的。 为什么? 属性不适用于元素。 属性不会在单元格的边缘之间创建空间。 属性破坏了能够与其父元素一样高的元素的预期行为。

  • 问题内容: 我使用的是条形码字体“ 9个常规中的3个免费字体”,在某些情况下,打印输出需要有多个空格,以匹配字段中的字符数。例: (项目编号后跟四个空格,以形成12个字符。如果字符数少,条形码阅读器会给我一个错误。 将强制使用多个空格,但是IE和Firefox都将它们显示为标准字体空间,并且不使用条形码字体。条形码在非空格字符之间显示为细分。(顺便说一句,只有IE 6才以正确的字体显示。)如果我使

  • 问题内容: 我正在尝试创建一个表格,其中每个单元格具有背景颜色,并且它们之间具有空白。但我似乎在执行此操作时遇到了麻烦。 我尝试设置边距,但似乎没有效果。 如果我对填充执行相同的操作,则可以,但是在单元格之间没有间距。 有人可以帮我吗? 问题答案: 使用元素上的属性设置单元格之间的间距。 确保设置为(否则每个单元格之间将有一个单独的边框,而不是每个单元格之间可能会有间隔的单独边框)。

  • 我想在EditText下面显示错误消息。所以,我遵循了这个答案。 这就是我的风格: 这是我的代码:

  • 我一直试图创建一个宏来格式化从特定外部源复制的表,问题是,一些单元格似乎从右向左填充,剩余的空间向左填充空格: