博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌
技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。
感兴趣的可以先关注收藏起来,在工作中、生活上等遇到相关问题都可以给我留言咨询,希望帮助更多的人。
一、背景描述
使用Java代码编写,在XWPFDocument对象中写入一个5行6列的表格,其中第一行合并6行做为表头;第二行为标题行,从左向右每个单元格内容分别是序号、车间、报警总数、新报警数、确认数、恢复数,第三行及以后行为数据行,最后保存到本地磁盘中。需求是Java代码实现数据导出为Word文档,文档中包含表格内容。
二、代码实现
2.1 代码实现
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
public class CreateTableExample {
public static void main(String[] args) throws IOException {
// 创建新文档
XWPFDocument document = new XWPFDocument();
// 创建表格(初始为 2 行 6 列,表头和标题行)
XWPFTable table = document.createTable(2, 6);
// 设置表格宽度为页面宽度的 100%
CTTblWidth tableWidth = table.getCTTbl().addNewTblPr().addNewTblW();
tableWidth.setType(STTblWidth.PCT); // 宽度类型为百分比
tableWidth.setW(BigInteger.valueOf(5000)); // 5000 = 100% (5000 / 50 = 100%)
// 合并第一行的 6 列作为表头
mergeCellsHorizontally(table, 0, 0, 5); // 从第 0 列到第 5 列合并
XWPFTableRow headerRow = table.getRow(0);
headerRow.getCell(0).setText("报警统计表"); // 设置表头内容
// 设置第二行为标题行
XWPFTableRow titleRow = table.getRow(1);
String[] titles = {"序号", "车间", "报警总数", "新报警数", "确认数", "恢复数"};
for (int i = 0; i < titles.length; i++) {
titleRow.getCell(i).setText(titles[i]);
}
// 填充数据行(动态添加行)
String[][] data = {
{"1", "车间A", "10", "2", "8", "7"},
{"2", "车间B", "15", "3", "12", "10"},
{"3", "车间C", "8", "1", "6", "5"},
{"4", "车间D", "20", "5", "15", "12"}
};
for (int i = 0; i < data.length; i++) {
XWPFTableRow dataRow = table.createRow(); // 动态添加新行
for (int j = 0; j < data[i].length; j++) {
dataRow.getCell(j).setText(data[i][j]);
}
}
// 保存文档到本地磁盘
try (FileOutputStream out = new FileOutputStream("TableExample.docx")) {
document.write(out);
}
// 关闭文档
document.close();
System.out.println("表格已创建并保存到 TableExample.docx");
}
/**
* 合并表格中的单元格(水平合并)
*
* @param table 表格对象
* @param row 行索引
* @param startCol 起始列索引
* @param endCol 结束列索引
*/
private static void mergeCellsHorizontally(XWPFTable table, int row, int startCol, int endCol) {
for (int i = startCol; i <= endCol; i++) {
XWPFTableCell cell = table.getRow(row).getCell(i);
if (i == startCol) {
// 第一个单元格设置合并范围
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
// 后续单元格设置为继续合并
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
}
2.2 代码说明
-
创建表格:使用 document.createTable(5, 6) 创建一个 5 行 6 列的表格。
-
合并表头单元格:使用 mergeCellsHorizontally 方法合并第一行的 6 列,作为表头。
-
设置标题行:第二行的每个单元格分别设置为 “序号”、“车间”、“报警总数”、“新报警数”、“确认数”、“恢复数”。
-
填充数据行:从第三行开始填充数据,数据内容为二维数组 data 中的值。
-
保存文档:使用 FileOutputStream 将文档保存到本地磁盘,文件名为 TableExample.docx。
三、运行结果
生成的 TableExample.docx 文件内容如下:
好了,今天分享到这里。希望你喜欢这次的探索之旅!不要忘记 “点赞” 和 “关注” 哦,我们下次见!🎈
本文完结!
祝各位大佬和小伙伴身体健康,万事如意,发财暴富,扫下方二维码与我一起交流!!!