我正在试着做一张桌子。我需要减少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);
}
}
}
要在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下面显示错误消息。所以,我遵循了这个答案。 这就是我的风格: 这是我的代码:
我一直试图创建一个宏来格式化从特定外部源复制的表,问题是,一些单元格似乎从右向左填充,剩余的空间向左填充空格: