You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.dsideal.base.Tools;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class Step5_ReaderExcel {
public static void main(String[] args) throws IOException {
String filePath = "D:\\dsWork\\YunNanDsBase\\Doc\\全省及州市县区人口与教育报告集20241023\\133个县区报告2022\\县区研究报告\\楚雄州各县市报告10\\1.楚雄市人口变化趋势对基础教育的影响分析报告\\附件2 楚雄市教育发展规模数据收集表2024.06.13.xlsx";
//第一个表格的宽度=23
int firstTableWidth = 23;
//第二个表格的宽度=11
int secondTableWidth = 11;
FileInputStream fis = new FileInputStream(filePath);
Workbook workbook = new XSSFWorkbook(fis);
//遍历前4个工作表
for (int i = 0; i < 4; i++) {
Sheet sheet = workbook.getSheetAt(i);
System.out.println("Sheet Name: " + sheet.getSheetName());
// 创建FormulaEvaluator对象
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
int rowIndex;
for (rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
Row row = sheet.getRow(rowIndex);
if (row == null) break;
if (row.getRowNum() == 0) continue; // 跳过标题行, 本项目中有标题行
// 读取表格数据
for (int j = 0; j < firstTableWidth; j++) {
Cell cell = row.getCell(j);
// 如果单元格是公式类型
if (cell.getCellType() == CellType.FORMULA) {
// 计算公式结果
cell.setCellType(CellType.NUMERIC);
cell.setCellValue(evaluator.evaluate(cell).getNumberValue());
}
// 打印单元格数据
System.out.print(cell + "\t");
}
System.out.println();
}
//之所以减1是因为是在判断为空时才停止也就是过了真实数据一行后所以要减1
System.out.println("第一个表格开始行索引=2,结束行索引=" + (rowIndex - 1));
//第二个表格
//从rowIndex开始向下面查找直到第一列中出现文字“自动计算招生数、在校生数”此行的再下一行就是真正的第二个表格的开始位置
int secondTableStartRowIndex = -1, secondTableEndRowIndex = -1;
//找到开始行
for (; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
Row row = sheet.getRow(rowIndex);
if (row != null && row.getCell(0) != null
&& row.getCell(0).toString().contains("自动计算招生数、在校生数")) {
if (secondTableStartRowIndex == -1)
secondTableStartRowIndex = rowIndex;
}
if (secondTableStartRowIndex > 0 && row == null) {
secondTableEndRowIndex = rowIndex - 1;
break;
}
}
//表头有两行需要加2
secondTableStartRowIndex += 2;
//输出第二个表格的开始行索引和结束行索引
System.out.println("第二个表格开始行索引=" + secondTableStartRowIndex + ",结束行索引=" + secondTableEndRowIndex);
//输出第二个表格的数据
for (rowIndex = secondTableStartRowIndex; rowIndex <= secondTableEndRowIndex; rowIndex++) {
Row row = sheet.getRow(rowIndex);
if (row == null) break;
for (int j = 0; j < secondTableWidth; j++) {
Cell cell = row.getCell(j);
// 如果单元格是公式类型
if (cell.getCellType() == CellType.FORMULA) {
// 计算公式结果
cell.setCellType(CellType.NUMERIC);
}
// 打印单元格数据
System.out.print(cell + "\t");
}
System.out.println();
}
break;//先调试第一个Sheet
}
workbook.close();
fis.close();
}
}