1·、引入pom文件:
<!-- POI-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.3</version>
</dependency>
2、写一个实体类Table1
@Data
public class Table1 {
private String name;
private String age;
private String high;
private String edBackground;
}
3、进行简单输出每一行和每一列数据
public static void main(String[] args) {
//使用java代码读取Word表格数据,封装到user实体类中
try {
XWPFDocument document = new XWPFDocument(new FileInputStream("d:/test12.docx"));
// 获取所有表格
List<XWPFTable> tables = document.getTables();
// 遍历每个表格
for (XWPFTable table : tables) {
// 读取表格每一行
table.getRows().forEach(row -> {
// 读取每行的每个单元格
row.getTableCells().forEach(cell -> {
// 获取单元格文本
String text = cell.getText();
System.out.print(text + "\t");
});
System.out.println();
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
4、输出的数据进行封装到实体中。docx 类型
public static void main(String[] args) {
//使用java代码读取Word表格数据,封装到user实体类中
try {
/*
docx文件将表格输出。
*/
XWPFDocument document = new XWPFDocument(new FileInputStream("d:/test12.docx"));
System.out.println("=====>" + document.getTables());
// 获取所有表格
List<XWPFTable> tables = document.getTables();
/**
* 遍历Word中所有表格。将表格中的数据进行输出。
*/
//遍历所有表
for (XWPFTable table : tables) {
System.out.println(table.getText());
System.out.println("------------------------>");
//获取Word表格中的第二行。====>数据。 第一行为字段名,第二行字段名的值
List<XWPFTableCell> tableCells1 = table.getRows().get(1).getTableCells();
Table1 table11 = new Table1();
//将读取的值进行记录。
String data = "";
//遍历第二行的每一列
for (int i = 0; i < tableCells1.size(); i++) {
System.out.println("=获取数据===" + tableCells1.get(i).getText());
System.out.println("------------------------>");
//最后一个不用添加 逗号分割
if (i + 1 == tableCells1.size()) {
data += tableCells1.get(i).getText();
} else {
//全部放到一个list中使用,进行分割
data += tableCells1.get(i).getText() + ",";
}
}
//输出
System.out.println("data======>" + data);
//将data进行分割以逗号进行隔开
String[] split = data.split(",");
table11.setName(split[0]);
table11.setAge(split[1]);
table11.setHigh(split[2]);
table11.setEdBackground(split[3]);
System.out.println("打印table11====》" + table11);
} catch (Exception e) {
e.printStackTrace();
}
}
5、输出的数据进行封装到实体中。doc 类型
public static void main(String[] args) {
//使用java代码读取Word表格数据,封装到user实体类中
try {
FileInputStream fis = new FileInputStream(("d:/test.doc"));
HWPFDocument hwpfDocument = new HWPFDocument(fis);
//遍历表格
TableIterator tableIterator = new TableIterator(hwpfDocument.getRange());
while (tableIterator.hasNext()){
Table table = tableIterator.next();
System.out.println("获取table的所有内容=====>"+table.text());
System.out.println("获取table 一共有这么多行=====>"+table.numRows());
// for (int i = 0; i <table.numRows() ; i++) {
TableRow row = table.getRow(1);
String data="";
for (int j = 0; j < row.numCells(); j++) {
//获取每一列的值
TableCell cell = row.getCell(j);
//如果存在 字符去掉
String tableText = cell.text().replaceAll("\u0007", "");
//判断是否为最后一列
if (j+1!=row.numCells()){
data+=tableText+",";
}else {
data+=tableText;
}
}
System.out.println("第data的值===》"+data);
String[] split = data.split(",");
//往实体类中进行赋值操作
Table1 table1 = new Table1();
table1.setName(split[0]);
table1.setAge(split[1]);
table1.setHigh(split[2]);
table1.setEdBackground(split[3]);
System.out.println("第table1===》"+table1);
}
// }
} catch (Exception e) {
e.printStackTrace();
}
}
跨行合并,读取Word内容 .docx文件
下面是跨行图示
:
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("d:/test12.docx")) {
XWPFDocument document = new XWPFDocument(fis);
for (XWPFTable table : document.getTables()) {
//初始化二维数组
String[][] strs = new String[0][];
if (table.getNumberOfRows()>0) {
System.out.println("==========>" + table.getNumberOfRows() + "======" + table.getRow(0).getTableCells().size());
strs= new String[table.getNumberOfRows()][table.getRow(0).getTableCells().size()];
//将数组初始化
for (int i = 0; i < strs.length; i++) {
for (int j = 0; j < strs[i].length; j++) {
strs[i][j] = "";
}
}
}
//行
for (int rowIndex = 0; rowIndex < table.getNumberOfRows(); rowIndex++) {
XWPFTableRow row = table.getRow(rowIndex);
//列
for (int cellIndex = 0; cellIndex < row.getTableCells().size(); cellIndex++) {
XWPFTableCell cell = row.getCell(cellIndex);
// 检查是否有vMerge属性,并且其值为RESTART,表示这是跨行合并的开始
if (cell.getCTTc().getTcPr() != null && cell.getCTTc().getTcPr().getVMerge() != null &&
cell.getCTTc().getTcPr().getVMerge().getVal().equals(STMerge.RESTART)) {
//如果有单元格合并 就从起始的地方开始放入值,到合并最后一个单元格结束,中间不会在进到这个方法。
System.out.println("获取属性值----->"+cell.getCTTc().getTcPr().getVMerge().getVal());
// 处理跨行合并的起始单元格
System.out.println("Start of a vertical merge at (" + rowIndex + ", " + cellIndex + "): " + cell.getText());
// 查找合并的结束位置(需要遍历接下来的行)
int mergeEndRow = findMergeEndRow(table, rowIndex, cellIndex);
//将合并单元格的值进行保存
for (int i = rowIndex; i <=mergeEndRow; i++) {
strs[i][cellIndex] = cell.getText();
System.out.println("-----"+strs[i][cellIndex]);
}
// 输出合并单元格的范围和内容(这里假设你已经处理了内容合并)
System.out.println("Vertical merge spans from row " + rowIndex + " to row " + mergeEndRow);
} else {
if (StringUtils.isNotBlank(strs[rowIndex][cellIndex])){
System.out.println("Cell (" + rowIndex + ", " + cellIndex + "): " + strs[rowIndex][cellIndex]);
}else {
// 处理非合并单元格
System.out.println("Cell (" + rowIndex + ", " + cellIndex + "): " + cell.getText());
}
}
}
//将二维数组输出
// printf(strs);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//将二维数组输出
private static void printf(String[][] strs) {
System.out.println("-----------------------------------");
//将初始化的二维数组进行输出
for (int i = 0; i < strs.length; i++) {
for (int j = 0; j < strs[i].length; j++) {
System.out.println(strs[i][j]);
}
}
System.out.println("-----------------------------------");
}
private static int findMergeEndRow(XWPFTable table, int startRow, int startColumn) {
// 假设表格的列数是固定的,并且合并不会跨越多个列
for (int rowIndex = startRow + 1; rowIndex < table.getNumberOfRows(); rowIndex++) {
XWPFTableCell cell = table.getRow(rowIndex).getCell(startColumn);
if (cell.getCTTc().getTcPr() != null && cell.getCTTc().getTcPr().getVMerge() != null &&
cell.getCTTc().getTcPr().getVMerge().getVal().equals(STMerge.CONTINUE)) {
// 找到合并继续的单元格,继续向下查找
continue;
} else {
// 合并结束,返回上一行的索引(因为当前行不是合并的一部分)
return rowIndex - 1;
}
}
// 如果到达表格底部都没有找到合并的结束,则返回表格的最后一行
return table.getNumberOfRows() - 1;
}