个人记录使用
1.表格居中与左对齐缩进二选一
2.边框设置可参考 POI 设置Word表格边框、表格文字水平居中
package com.gsafety.anjian.analysis.util;
/**
* 设置poi-tl生成嵌套子模板中的表格垂直居中
*
*/
import com.deepoove.poi.NiceXWPFDocument;
import com.deepoove.poi.XWPFTemplate;
import org.apachemons.collections.CollectionUtils;
import org.apachemons.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.csdn/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模板引擎http://deepoove/poi-tl/
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.4.0</version>
</dependency>
补充:由于表格边框采取双边框样式,左上与右下的边框样式会存在差别,右下边框需要使用与左上相反的边框样式,整个表格边框样式才会完整,以上代码块样式已调整
更多推荐
poi word 表格设置居中、左对齐缩进、边框、字体
发布评论