excel 操作参考 链接
HWPF Microsoft Word 97(-2007) --.doc XWPF Microsoft Word 2007 --.docx
doc只能使用模板(替换内容就可以简单) docx可以创建 下面为docx操作
POI word 官方代码参考 官方
POI word 原生表格代码
public static void main(String[] args) {
try (XWPFDocument document = new XWPFDocument()) {
//源代码
XWPFTable table = document.createTable();
XWPFTableRow tableRowOne = table.getRow(0);
tableRowOne.getCell(0).setText("col one, row one");
tableRowOne.addNewTableCell().setText("col two, row one");
tableRowOne.addNewTableCell().setText("col three, row one");
//create second row
XWPFTableRow tableRowTwo = table.createRow();
tableRowTwo.createCell().setText("col one, row two");
tableRowTwo.getCell(1).setText("col two, row two");
tableRowTwo.getCell(2).setText("col three, row two");
//create third row
XWPFTableRow tableRowThree = table.createRow();
tableRowThree.getCell(0).setText("col one, row three");
tableRowThree.getCell(1).setText("col two, row three");
tableRowThree.getCell(2).setText("col three, row three");
try (
OutputStream out = new FileOutputStream("C:\\test\\test.docx")) {
document.write(out);
}
} catch (
IOException e) {
e.printStackTrace();
}
}
}
进行样式封装
(poi使用源生代码)
public class WordUtils {
//创建表格默认包含一行一列和列段落
//表格默认参考第一行
//单元格宽度在tableStyle里
private WordUtils() {
}
/**
* 创建段落标题
*
* @param document 文档
*/
public static XWPFParagraph createParagraphTitle(XWPFDocument document, String title) {
XWPFParagraph paragraph = document.createParagraph();
//设置对齐
paragraph.setAlignment(ParagraphAlignment.CENTER);
//设置垂直对齐
paragraph.setVerticalAlignment(TextAlignment.CENTER);
paragraph.setBorderTop(Borders.THICK);
//配置一组公共属性的文本区域
XWPFRun run = paragraph.createRun();
run.setText(title);
//@see https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oi29500/aef3c9a6-5d6c-434b-90b7-85e761fd8e62
run.setFontFamily("Latin Extended-A");
//y轴
run.setTextPosition(-20);
run.setBold(true);
return paragraph;
}
/**
* 设置自定义表格样式
*
* @param table table
* @param cellWidth cellWidth
*/
private static void setTableStyle(XWPFTable table, int cellWidth) {
CTTblBorders borders = table.getCTTbl().getTblPr().addNewTblBorders();
CTBorder hBorder = borders.addNewInsideH();
//边框样式 参考STBorder.class
hBorder.setVal(STBorder.THICK);
//边框粗细
hBorder.setSz(BigInteger.valueOf(1));
//边框颜色
hBorder.setColor("8EAADB");
CTBorder vBorder = borders.addNewInsideV();
vBorder.setVal(STBorder.THICK);
vBorder.setSz(BigInteger.valueOf(1));
vBorder.setColor("8EAADB");
CTBorder lBorder = borders.addNewLeft();
lBorder.setVal(STBorder.THICK);
lBorder.setSz(BigInteger.valueOf(1));
lBorder.setColor("8EAADB");
CTBorder rBorder = borders.addNewRight();
rBorder.setVal(STBorder.THICK);
rBorder.setSz(BigInteger.valueOf(1));
rBorder.setColor("8EAADB");
CTBorder tBorder = borders.addNewTop();
tBorder.setVal(STBorder.THICK);
tBorder.setSz(BigInteger.valueOf(1));
tBorder.setColor("8EAADB");
CTBorder bBorder = borders.addNewBottom();
bBorder.setVal(STBorder.THICK);
bBorder.setSz(BigInteger.valueOf(1));
bBorder.setColor("8EAADB");
CTTbl ttbl = table.getCTTbl();
CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
CTJc cTJc = tblPr.addNewJc();
cTJc.setVal(STJc.CENTER);
//单元格宽
tblWidth.setW(BigInteger.valueOf(cellWidth));
//单元宽度操作 DXA可自定义(可修改)
tblWidth.setType(STTblWidth.DXA);
}
/**
* 创建表格
*
* @param document document
* @param cellWidth cellWidth
* @return XWPFTable
*/
public static XWPFTable createTable(XWPFDocument document, int cellWidth) {
XWPFTable table = document.createTable();
setTableStyle(table, cellWidth);
return table;
}
/**
* 设置默认行高
*
* @param row row
*/
private static void setRowStyle(XWPFTableRow row) {
// 获取表行属性(trPr)
CTTrPr trPr = row.getCtRow().addNewTrPr();
// set row height; units = twentieth of a point, 360 = 0.25"
//设置行高; units =一个点的二十分之一,360 = 0.25
CTHeight ht = trPr.addNewTrHeight();
ht.setVal(BigInteger.valueOf(360));
}
/**
* 只能创建第一行以后的行,第一行为模型行作为参考
*
* @param table XWPFTable
* @return XWPFTableRow
*/
public static XWPFTableRow createTableRow(XWPFTable table) {
XWPFTableRow row = table.createRow();
//默认表格有一个初始单元格
//跨页表格每页顶部的标题行是否重复
row.setRepeatHeader(true);
//如果为true,则不允许拆分行
row.setCantSplitRow(false);
setRowStyle(row);
return row;
}
/**
* 获取行 表格默认创建一行一列
*
* @param table 表格
* @param rowIndex 行下标
* @return XWPFTableRow
*/
public static XWPFTableRow getTableRow(XWPFTable table, int rowIndex) {
XWPFTableRow row = table.getRow(rowIndex);
//默认表格有一个初始单元格
//跨页表格每页顶部的标题行是否重复
row.setRepeatHeader(true);
//如果为true,则不允许拆分行
row.setCantSplitRow(false);
setRowStyle(row);
return row;
}
/**
* 设置单元格样式
*
* @param cell cell
* @return 返回CTShd 自定义颜色
*/
public static CTShd setCell(XWPFTableCell cell) {
cell.setWidthType(TableWidthType.AUTO);
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
CTTc ctTc = cell.getCTTc();
// 获取表格单元格属性元素 (tcPr)
CTTcPr ctPr = ctTc.addNewTcPr();
// 将垂直对齐设置为 "center"
CTVerticalJc va = ctPr.addNewVAlign();
//水平居中
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
ctTc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
va.setVal(STVerticalJc.BOTH);
// 创建单元格颜色元素
CTShd ctshd = ctPr.addNewShd();
ctshd.setColor("auto");
//清除默认样式
ctshd.setVal(STShd.CLEAR);
return ctshd;
}
/**
* 单元格段落
*
* @param paragraph paragraph
* @param fontSize fontSize
*/
public static void setParagraph(XWPFParagraph paragraph, int fontSize) {
paragraph.setAlignment(ParagraphAlignment.CENTER);
//设置垂直对齐
paragraph.setVerticalAlignment(TextAlignment.CENTER);
//配置一组公共属性的文本区域
XWPFRun run = paragraph.createRun();
//字体样式@see https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oi29500/aef3c9a6-5d6c-434b-90b7-85e761fd8e62
run.setFontFamily("Latin Extended-A");
run.setBold(true);
run.setFontSize(fontSize);
}
/**
* 行样式和单元格样式
*
* @param cell cell
* @param row row
*/
private static void setCellStyle(int row, XWPFTableCell cell, XWPFParagraph paragraph, int fontSize) {
CTShd ctShd = setCell(cell);
if (row == 0) {
// 标题行
ctShd.setFill("4472C4");
} else if (row % 2 == 0) {
// 奇数行
ctShd.setFill("D9E2F3");
} else {
// 偶数行
ctShd.setFill("FFFFFF");
}
//段落
setParagraph(paragraph, fontSize);
}
/**
* 创建单元格 在当前行最后一列追加
* 例如:当前行5列在后面追加
* 不使用word模板或手绘表格不要使用
*
* @param tableRow XWPFTableRow
* @param content String
* @param rowIndex rowIndex
* @return XWPFTableCell
*/
public static XWPFTableCell createTableCell(int rowIndex, XWPFTableRow tableRow, String content, int fontSize) {
XWPFTableCell cell = tableRow.createCell();
XWPFParagraph paragraph = cell.addParagraph();
if (Objects.nonNull(content)) {
paragraph.createRun().setText(content);
}
setCellStyle(rowIndex, cell, paragraph, fontSize);
return cell;
}
/**
* 添加新单元格 在一行使用 作为其它行的参考
*
* @param tableRow XWPFTableRow
* @param content String
* @return XWPFTableCell
*/
public static XWPFTableCell createTableFirstRowCell(XWPFTableRow tableRow, String content, int fontSize) {
XWPFTableCell cell = tableRow.addNewTableCell();
return setFirstRowContent(content, cell, fontSize);
}
/**
* 第一行第一列单元格使用
*
* @param tableRow XWPFTableRow
* @param content String
* @return XWPFTableCell
*/
public static XWPFTableCell getTableFirstRowTitle(XWPFTableRow tableRow, String content, int fontSize, int totalCol) {
XWPFTableCell cell = tableRow.getCell(0);
for (int i = 1; i < totalCol; i++) {
createTableFirstRowCell(tableRow, "", fontSize);
}
return setFirstRowContent(content, cell, fontSize);
}
/**
* 第一行单元格设置内容和颜色
*
* @param content content
* @param cell cell
* @param fontSize fontSize
* @return XWPFTableCell
*/
private static XWPFTableCell setFirstRowContent(String content, XWPFTableCell cell, int fontSize) {
XWPFParagraph paragraph = cell.getParagraphArray(0);
XWPFRun run = paragraph.createRun();
run.setColor("FFFFFF");
if (Objects.nonNull(content)) {
run.setText(content);
}
setCellStyle(0, cell, paragraph, fontSize);
return cell;
}
/**
* 获取单元格
* 或直接使用原生方法 tableRow.getCell(columnIndex)
*
* @param tableRow XWPFTableRow
* @param columnIndex columnIndex
* @return XWPFTableCell
*/
public static XWPFTableCell getTableCell(XWPFTableRow tableRow, int columnIndex) {
return tableRow.getCell(columnIndex);
}
/**
* 其它行(第一行除外)通过设置getCell设置单元格的内容
*
* @param tableRow XWPFTableRow
* @param columnIndex columnIndex
* @return XWPFTableCell
*/
public static XWPFTableCell getTableCell(XWPFTableRow tableRow, int rowIndex, int columnIndex, String content, int fontSize) {
XWPFTableCell cell = tableRow.getCell(columnIndex);
/*单元格默认的段落ell.setText();
*无法提供字体颜色和字体选择
* 采用段落就是普通文本
*/
//单元格默认有一个段落
XWPFParagraph paragraph = cell.getParagraphArray(0);
XWPFRun run = paragraph.createRun();
if (Objects.nonNull(content)) {
run.setText(content);
}
setCellStyle(rowIndex, cell, paragraph, fontSize);
return cell;
}
/**
* 合并列
*
* @param table table
* @param currentRow currentRow
* @param firstCell firstCell
* @param endCell endCell
*/
public static void mergeCell(XWPFTable table, int currentRow, int firstCell, int endCell) {
for (int i = firstCell; i <= endCell; i++) {
XWPFTableCell cell = table.getRow(currentRow).getCell(i);
if (i == firstCell) {
//保留的列
// The first merged cell is set to the RESTART merge value
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
//其它为合并列(指定的endCell)
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
/**
* 合并行
*
* @param table table
* @param currentCol currentCol
* @param firstRow firstRow
* @param endRow endRow
*/
public static void mergeRow(XWPFTable table, int currentCol, int firstRow, int endRow) {
for (int i = firstRow; i <= endRow; i++) {
XWPFTableCell cell = table.getRow(i).getCell(currentCol);
if (i == firstRow) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
}
}
}
(poi提供的方法优化代码)
public class WordUtils {
//创建表格默认包含一行一列和列段落
//表格默认参考第一行
//单元格宽度在tableStyle里
private WordUtils() {
}
/**
* 创建段落标题
*
* @param document 文档
*/
public static XWPFParagraph createParagraphTitle(XWPFDocument document, String title) {
XWPFParagraph paragraph = document.createParagraph();
//设置对齐
paragraph.setAlignment(ParagraphAlignment.CENTER);
//设置垂直对齐
paragraph.setVerticalAlignment(TextAlignment.CENTER);
paragraph.setBorderTop(Borders.THICK);
//配置一组公共属性的文本区域
XWPFRun run = paragraph.createRun();
run.setText(title);
//@see https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oi29500/aef3c9a6-5d6c-434b-90b7-85e761fd8e62
run.setFontFamily("Latin Extended-A");
//y轴
run.setTextPosition(-20);
run.setBold(true);
return paragraph;
}
/**
* 创建空段落换行
*
* @param document 文档
*/
public static XWPFParagraph createSpace(XWPFDocument document) {
XWPFParagraph paragraph = document.createParagraph();
//设置对齐
paragraph.setAlignment(ParagraphAlignment.CENTER);
//设置垂直对齐
paragraph.setVerticalAlignment(TextAlignment.CENTER);
//配置一组公共属性的文本区域
XWPFRun run = paragraph.createRun();
run.setText("");
//@see https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oi29500/aef3c9a6-5d6c-434b-90b7-85e761fd8e62
run.setFontFamily("Latin Extended-A");
//y轴
run.setTextPosition(-20);
return paragraph;
}
/**
* 设置自定义表格样式
*
* @param table table
* @param width cellWidth
*/
private static void setTableStyle(XWPFTable table, int width) {
//表格宽度 PCT(百分比)
table.setWidthType(TableWidthType.PCT);
//表格宽度%
table.setWidth(width);
table.setTableAlignment(TableRowAlign.CENTER);
table.setTopBorder(XWPFTable.XWPFBorderType.THICK, 1, 0, "8EAADB");
table.setBottomBorder(XWPFTable.XWPFBorderType.THICK, 1, 0, "8EAADB");
table.setLeftBorder(XWPFTable.XWPFBorderType.THICK, 1, 0, "8EAADB");
table.setRightBorder(XWPFTable.XWPFBorderType.THICK, 1, 0, "8EAADB");
}
/**
* 创建表格
*
* @param document document
* @param width width
* @return XWPFTable
*/
public static XWPFTable createTable(XWPFDocument document, int width) {
XWPFTable table = document.createTable();
setTableStyle(table, width);
return table;
}
/**
* 设置默认行高
*
* @param row row
*/
private static void setRowStyle(XWPFTableRow row) {
row.setHeight(360);
//默认表格有一个初始单元格
//跨页表格每页顶部的标题行是否重复
row.setRepeatHeader(true);
//如果为true,则不允许拆分行
row.setCantSplitRow(false);
}
/**
* 只能创建第一行以后的行,第一行为模型行作为参考
*
* @param table XWPFTable
* @return XWPFTableRow
*/
public static XWPFTableRow createTableRow(XWPFTable table) {
XWPFTableRow row = table.createRow();
setRowStyle(row);
return row;
}
/**
* 获取行 表格默认创建一行一列
*
* @param table 表格
* @param rowIndex 行下标
* @return XWPFTableRow
*/
public static XWPFTableRow getTableRow(XWPFTable table, int rowIndex) {
XWPFTableRow row = table.getRow(rowIndex);
setRowStyle(row);
return row;
}
/**
* 设置单元格样式
*
* @param cell cell
*/
public static void setCell(XWPFTableCell cell) {
XWPFTableRow tableRow = cell.getTableRow();
int size = tableRow.getTableCells().size();
int width = tableRow.getTable().getWidth();
//宽度 PCT(百分比)
cell.setWidthType(TableWidthType.PCT);
//宽度
cell.setWidth(String.valueOf(width / size));
cell.setColor("auto");
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
}
/**
* 单元格段落
*
* @param paragraph paragraph
* @param fontSize fontSize
*/
public static void setParagraph(XWPFParagraph paragraph, int fontSize) {
paragraph.setAlignment(ParagraphAlignment.CENTER);
//设置垂直对齐
paragraph.setVerticalAlignment(TextAlignment.CENTER);
//配置一组公共属性的文本区域
XWPFRun run = paragraph.createRun();
//字体样式@see https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oi29500/aef3c9a6-5d6c-434b-90b7-85e761fd8e62
run.setFontFamily("Latin Extended-A");
run.setBold(true);
run.setFontSize(fontSize);
}
/**
* 行样式和单元格样式
*
* @param cell cell
* @param row row
*/
private static void setCellStyle(int row, XWPFTableCell cell, XWPFParagraph paragraph, int fontSize) {
setCell(cell);
if (row == 0) {
// 标题行
cell.setColor("4472C4");
} else if (row % 2 == 0) {
// 奇数行
cell.setColor("D9E2F3");
} else {
// 偶数行
cell.setColor("FFFFFF");
}
//段落
setParagraph(paragraph, fontSize);
}
/**
* 创建单元格 在当前行最后一列追加
* 例如:当前行5列在后面追加
* 不使用word模板或手绘表格不要使用
*
* @param tableRow XWPFTableRow
* @param content String
* @param rowIndex rowIndex
* @return XWPFTableCell
*/
public static XWPFTableCell createTableCell(int rowIndex, XWPFTableRow tableRow, String content, int fontSize) {
XWPFTableCell cell = tableRow.createCell();
XWPFParagraph paragraph = cell.addParagraph();
if (Objects.nonNull(content)) {
paragraph.createRun().setText(content);
}
setCellStyle(rowIndex, cell, paragraph, fontSize);
return cell;
}
/**
* 添加新单元格 在一行使用 作为其它行的参考
*
* @param tableRow XWPFTableRow
* @param content String
* @return XWPFTableCell
*/
public static XWPFTableCell createTableFirstRowCell(XWPFTableRow tableRow, String content, int fontSize) {
XWPFTableCell cell = tableRow.addNewTableCell();
return setFirstRowContent(content, cell, fontSize);
}
/**
* 第一行第一列单元格使用
*
* @param tableRow XWPFTableRow
* @param content String
* @return XWPFTableCell
*/
public static XWPFTableCell getTableFirstRowTitle(XWPFTableRow tableRow, String content, int fontSize, int totalCol) {
XWPFTableCell cell = tableRow.getCell(0);
for (int i = 1; i < totalCol; i++) {
createTableFirstRowCell(tableRow, "", fontSize);
}
return setFirstRowContent(content, cell, fontSize);
}
/**
* 第一行单元格设置内容和颜色
*
* @param content content
* @param cell cell
* @param fontSize fontSize
* @return XWPFTableCell
*/
private static XWPFTableCell setFirstRowContent(String content, XWPFTableCell cell, int fontSize) {
XWPFParagraph paragraph = cell.getParagraphArray(0);
XWPFRun run = paragraph.createRun();
run.setColor("FFFFFF");
if (Objects.nonNull(content)) {
run.setText(content);
}
setCellStyle(0, cell, paragraph, fontSize);
return cell;
}
/**
* 获取单元格
* 或直接使用原生方法 tableRow.getCell(columnIndex)
*
* @param tableRow XWPFTableRow
* @param columnIndex columnIndex
* @return XWPFTableCell
*/
public static XWPFTableCell getTableCell(XWPFTableRow tableRow, int columnIndex) {
return tableRow.getCell(columnIndex);
}
/**
* 其它行(第一行除外)通过设置getCell设置单元格的内容
*
* @param tableRow XWPFTableRow
* @param columnIndex columnIndex
* @return XWPFTableCell
*/
public static XWPFTableCell getTableCell(XWPFTableRow tableRow, int rowIndex, int columnIndex, String content, int fontSize) {
XWPFTableCell cell = tableRow.getCell(columnIndex);
/*单元格默认的段落cell.setText();
*无法提供字体颜色和字体选择
* 采用段落就是普通文本
*/
//单元格默认有一个段落
XWPFParagraph paragraph = cell.getParagraphArray(0);
XWPFRun run = paragraph.createRun();
if (Objects.nonNull(content)) {
run.setText(content);
}
setCellStyle(rowIndex, cell, paragraph, fontSize);
return cell;
}
/**
* 合并列
*
* @param table table
* @param currentRow currentRow
* @param firstCell firstCell
* @param endCell endCell
*/
public static void mergeCell(XWPFTable table, int currentRow, int firstCell, int endCell) {
for (int i = firstCell; i <= endCell; i++) {
XWPFTableCell cell = table.getRow(currentRow).getCell(i);
if (i == firstCell) {
//保留的列
// The first merged cell is set to the RESTART merge value
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
//其它为合并列(指定的endCell)
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
/**
* 合并行
*
* @param table table
* @param currentCol currentCol
* @param firstRow firstRow
* @param endRow endRow
*/
public static void mergeRow(XWPFTable table, int currentCol, int firstRow, int endRow) {
for (int i = firstRow; i <= endRow; i++) {
XWPFTableCell cell = table.getRow(i).getCell(currentCol);
if (i == firstRow) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
}
}
}
word 只支持string类型
//导入静态包
import static com.my.utils.WordUtils.*;
public static void test(XWPFDocument document, List<MyTest> data) {
int fontSize = 15;
int column=5;
createParagraphTitle(document, "标题");
//第一个表格
XWPFTable table = createTable(document,6 * 100000);
//第一行
XWPFTableRow tableRow = getTableRow(table, 0);
getTableFirstRowTitle(tableRow, "标题", fontSize, column);
mergeCell(table, 0, 0, column - 1);
//第二行
XWPFTableRow tableRow1 = createTableRow(table);
String[] title = {"标题", "标题", "标题","标题","标题"};
for (int i = 0; i < title.length; i++) {
getTableCell(tableRow1, 1, i, title[i], fontSize);
}
//第3行遍历内容
if (Objects.nonNull(data)) {
int rowStyle=3;
for (int i = 0; i < data.size(); i++) {
XWPFTableRow tableRow2 = createTableRow(table);
//word都是文本类型只支持string
getTableCell(tableRow2, rowStyle, 0, String.valueOf(i + 1), fontSize);
getTableCell(tableRow2, rowStyle, 1, data.get(i).getTitle1(), fontSize);
getTableCell(tableRow2, rowStyle, 2, data.get(i).getTitle2(), fontSize);
getTableCell(tableRow2, rowStyle, 3, data.get(i).getTitle3(), fontSize);
getTableCell(tableRow2, rowStyle, 4, data.get(i).getTitle4(), fontSize);
rowStyle++;
}
}
}
public static void main(String[] args) {
try (XWPFDocument document = new XWPFDocument()) {
//数据不提供了
test(XWPFDocument document,data);
try (
OutputStream out = new FileOutputStream("C:\\test\\test.docx")) {
document.write(out);
}
} catch (
IOException e) {
e.printStackTrace();
}
}
}
效果