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

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