poi word 表格设置居中、左对齐缩进、边框、字体

这篇博客主要介绍了如何在Java中利用POI库来操作Word表格,包括设置表格内容居中、左对齐缩进以及添加边框。作者提到了在使用POI-tl模板引擎时的依赖,并且指出为了实现完整的双边框样式,需要注意左右上角和右下角边框样式的匹配问题。

 个人记录使用

        1.表格居中与左对齐缩进二选一

        2.边框设置可参考 POI 设置Word表格边框、表格文字水平居中

package com.gsafety.anjian.analysis.util;
/**
 * 设置poi-tl生成嵌套子模板中的表格垂直居中
 *
 */

import com.deepoove.poi.NiceXWPFDocument;
import com.deepoove.poi.XWPFTemplate;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.math.BigInteger;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PoilUtil {
    private static String notpath = "/evn_ets_rescueprogramme/moduleflag-1/";

    public static void setExcelVertical(XWPFTemplate template, String dirPath) {
        NiceXWPFDocument document = template.getXWPFDocument();
        List<XWPFTable> tables = document.getTables();
        if (tables!=null && tables.size()>1) {
            for (int z = 1; z < tables.size(); z++) {
                XWPFTable table = tables.get(z);
                CTTblLayoutType type = table.getCTTbl().getTblPr().addNewTblLayout();
                type.setType(STTblLayoutType.FIXED);
                //设置表格居中
                CTJc jc = table.getCTTbl().getTblPr().getJc();
                if(jc == null){
                    jc = table.getCTTbl().getTblPr().addNewJc();
                }
                jc.setVal(STJc.CENTER);
                table.getCTTbl().getTblPr().setJc(jc);

                //设置表格左对齐缩进
                /*CTTblWidth tblInd = table.getCTTbl().getTblPr().getTblInd();
                if(null == tblInd){
                    tblInd = table.getCTTbl().getTblPr().addNewTblInd();
                }
                //缩进距离
                tblInd.setW(BigInteger.valueOf(170));
                table.getCTTbl().getTblPr().setTblInd(tblInd);*/
                /**************设置表格样式*****************/
                if("/evn_ets_rescueprogramme/moduleflag-3/".equals(dirPath)){
                    List<CTTblGridCol> gridColList = table.getCTTbl().getTblGrid().getGridColList();
                    if (CollectionUtils.isNotEmpty(gridColList)) {
						//根据不同列长度,设置不同列宽,具体宽度以提供的模板为准
                        if (gridColList.size() == 5) {
                            CTTblGrid ctTblGrid = table.getCTTbl().addNewTblGrid();
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(1222));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(1609));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(2210));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(1927));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(1255));
                            table.getCTTbl().setTblGrid(ctTblGrid);
                        }else{
                            CTTblGrid ctTblGrid = table.getCTTbl().addNewTblGrid();
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(1211));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(875));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(2493));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(821));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(1578));
                            ctTblGrid.addNewGridCol().setW(BigInteger.valueOf(1257));
                            table.getCTTbl().setTblGrid(ctTblGrid);
                        }
                    }
					
                    //参考博客:https://blog.youkuaiyun.com/qq_31189355/article/details/80438506
                    CTTblBorders borders = table.getCTTbl().getTblPr().addNewTblBorders();
                    //表格内部横向表格
                    CTBorder hBorder = borders.addNewInsideH();
                    // 线条类型(格式参考:创建word文档,参入最终需要的结果表格,另存xml文件,查看xml文件中的具体格式)
                    hBorder.setVal(STBorder.Enum.forString("single"));
                    // 线条大小
                    hBorder.setSz(new BigInteger("6"));
                    // 设置颜色
                    hBorder.setColor("auto");
                    // 表格内部纵向表格
                    CTBorder vBorder = borders.addNewInsideV();
                    vBorder.setVal(STBorder.Enum.forString("single"));
                    vBorder.setSz(new BigInteger("6"));
                    vBorder.setColor("auto");
                    //表格最左边一条线的样式
                    CTBorder lBorder = borders.addNewLeft();
                    lBorder.setVal(STBorder.Enum.forString("thinThickSmallGap"));
                    lBorder.setSz(new BigInteger("12"));
                    lBorder.setColor("auto");
                    //表格最上边一条线(顶部)的样式
                    CTBorder tBorder = borders.addNewTop();
                    tBorder.setVal(STBorder.Enum.forString("thinThickSmallGap"));
                    tBorder.setSz(new BigInteger("12"));
                    tBorder.setColor("auto");
                    //表格最右边一条线的样式
                    CTBorder rBorder = borders.addNewRight();
                    rBorder.setVal(STBorder.Enum.forString("thickThinSmallGap"));
                    rBorder.setSz(new BigInteger("12"));
                    rBorder.setColor("auto");
                    //表格最下边一条线(底部)的样式
                    CTBorder bBorder = borders.addNewBottom();
                    bBorder.setVal(STBorder.Enum.forString("thickThinSmallGap"));
                    bBorder.setSz(new BigInteger("12"));
                    bBorder.setColor("auto");
                }
                /**************设置表格样式**************/
                List<XWPFTableRow>  rows = table.getRows();
                if (rows!=null && rows.size()>0) {
                    for (int i = 0; i < rows.size(); i++) {
                        XWPFTableRow row = rows.get(i);
                        //for (XWPFTableRow row : rows) {
                        //设置表格内容不允许跨页换行
                        row.setCantSplitRow(true);
                        if (i==0) {
                            //设置表格标题在每一页显示
                            row.setRepeatHeader(true);
                        }
                        if(notpath.indexOf(dirPath)<0){
                            List<XWPFTableCell> cells = row.getTableCells();
                            if (cells!=null && cells.size()>0) {
                                for (XWPFTableCell cell : cells) {
                                    if (StringUtils.isNotBlank(cell.getText())) {
										//垂直居中
                                        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); 
                                    }
                                }
                            }
                        }
                        //字体处理
                        if(("/evn_ets_rescueprogramme/moduleflag-3/".equals(dirPath)) && i > 0){
                            List<XWPFTableCell> cells = row.getTableCells();
                            if (cells!=null && cells.size()>0) {
                                for (XWPFTableCell cell : cells) {
                                    List<XWPFParagraph> paragraphs = cell.getParagraphs();
                                    for (int j = 0; j < paragraphs.size(); j++) {
                                        XWPFParagraph xwpfParagraph = paragraphs.get(j);
                                        List<XWPFRun> runs = xwpfParagraph.getRuns();
                                        for (int k = 0; k < runs.size(); k++) {
                                            XWPFRun xwpfRun = runs.get(k);
                                            CTFonts font = xwpfRun.getCTR().addNewRPr().addNewRFonts();
                                            //中文
                                            font.setEastAsia("仿宋_GB2312"); //改变中文字体设置这个
                                            // ASCII
                                            font.setAscii("Times New Roman"); //改变数字或者英文字体需要设置这个
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

 项目中使用的poi-tl进行渲染模板,mavne依赖如下,poi-tl网址:Poi-tl Documentationword模板引擎icon-default.png?t=M3K6http://deepoove.com/poi-tl/

<dependency>
	 <groupId>com.deepoove</groupId>
	 <artifactId>poi-tl</artifactId>
	 <version>1.4.0</version>
</dependency>

补充:由于表格边框采取双边框样式,左上与右下的边框样式会存在差别,右下边框需要使用与左上相反的边框样式,整个表格边框样式才会完整,以上代码块样式已调整

在使用 Apache POI 操作 Word 文档时,若需要设置表格单元格中段落的首行缩进,可以通过操作 `XWPFParagraph` 对象来实现。Apache POI 提供了对段落格式的支持,包括设置段前、段后间距以及首行缩进等。 要设置首行缩进,可以使用 `CTPPr`(段落属性)对象中的 `textIndent` 方法,并传入缩进值。该值以“twip”为单位,1 twip 等于 1/20 pt,而 1 pt 约等于 1.333 像素(取决于 DPI)。通常情况下,一个中文字符宽度约为 200 twip(即 10 pt),因此两个字符的缩进可设为 400 twip[^2]。 以下是一个示例代码片段,展示如何设置 Word 表格单元格中段落的首行缩进: ```java import org.apache.poi.xwpf.usermodel.*; public class WordUtils { public static void setFirstLineIndent(XWPFTableCell cell, int twipValue) { // 获取或创建段落 XWPFParagraph paragraph; if (cell.getParagraphs().isEmpty()) { paragraph = cell.addNewParagraph(); } else { paragraph = cell.getParagraphs().get(0); } // 设置段落首行缩进 CTPPr ppr = paragraph.getCTP().isSetPPr() ? paragraph.getCTP().getPPr() : paragraph.getCTP().addNewPPr(); ppr.addNewTextIndent().setVal(BigInteger.valueOf(twipValue)); } public static void main(String[] args) throws Exception { XWPFDocument document = new XWPFDocument(); XWPFTable table = document.createTable(1, 1); XWPFTableCell cell = table.getRow(0).getCell(0); // 设置首行缩进为两个字符宽度(约400 twip) setFirstLineIndent(cell, 400); // 写入内容 cell.setText("这是一个设置了首行缩进的段落示例。"); // 保存文档 try (FileOutputStream out = new FileOutputStream("WordWithIndent.docx")) { document.write(out); } } } ``` 上述代码首先检查单元格是否已有段落,如果没有则新建一个。然后通过获取或创建段落的 `CTPPr` 对象,并调用 `addNewTextIndent()` 方法设置首行缩进值。最后将文本写入单元格并保存文档。 需要注意的是,Apache POI 的 API 并不总是提供直接的方法来设置某些格式选项,因此有时需要直接操作底层 XMLBeans 对象(如 `CTPPr`)来完成特定需求[^2]。 ### 相关问题 1. 如何使用 Apache POI 设置 Word 文档段落的行间距? 2. Apache POI 是否支持设置 Word 表格单元格中文本的对齐方式? 3. 如何在 Apache POI 中为 Word 文档添加页眉和页脚? 4. 使用 Apache POI 创建 Word 表格时,如何合并多个单元格? 5. Apache POI 能否设置 Word 文档中字体的颜色和大小?
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值