package com.dsideal.base.Tools.Excel; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import cn.idev.excel.*; import com.dsideal.base.Tools.Excel.Bean.BeanSchool2019_CZ; import com.dsideal.base.Tools.Excel.Bean.BeanSchool2019_GZ; import com.dsideal.base.Tools.Excel.Bean.BeanSchool2019_XX; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.List; import java.util.Map; public class School2019 { public static void main(String[] args) { // 设置 com.alibaba.excel 的日志级别为 INFO Logger excelLogger = (Logger) LoggerFactory.getLogger("cn.idev.excel"); excelLogger.setLevel(Level.INFO); String filePath = "D:/dsWork/2025年收集的人口与教育数据库(20250328)/2015-2020年的数据/基础教育/2019.xlsx"; // 处理小学数据 processSheet(filePath, "基教小学", 7, BeanSchool2019_XX.class); // 处理初中数据 processSheet(filePath, "基教初中", 7, BeanSchool2019_CZ.class); // 处理高中数据 processSheet(filePath, "基教高中", 7, BeanSchool2019_GZ.class); } /** * 通用方法:处理指定 Sheet 表的数据 * * @param filePath 文件路径 * @param sheetName Sheet 表名称 * @param skipRows 跳过的行数 * @param beanClass Bean 类 */ private static void processSheet(String filePath, String sheetName, int skipRows, Class beanClass) { // 从指定行开始读取 List dataList = FastExcel.read(filePath) .head(beanClass) .sheet(sheetName) .headRowNumber(skipRows) // 跳过前 skipRows 行 .doReadSync(); // 使用 Map 进行分组统计 Map> cityDistrictMap = new HashMap<>(); for (T data : dataList) { try { // 通过反射获取字段值 String city = (String) beanClass.getMethod("getCity").invoke(data); String district = (String) beanClass.getMethod("getDistrict").invoke(data); int count = (int) beanClass.getMethod("getSchoolCount").invoke(data); if (count > 0) { // 如果市不存在,创建新的 Map cityDistrictMap.putIfAbsent(city, new HashMap<>()); // 累加区对应的学校数量 cityDistrictMap.get(city).merge(district, count, Integer::sum); } } catch (Exception e) { throw new RuntimeException("处理数据时发生错误", e); } } // 输出分组统计结果 System.out.println("Sheet: " + sheetName); for (Map.Entry> cityEntry : cityDistrictMap.entrySet()) { String city = cityEntry.getKey(); System.out.println("市: " + city); for (Map.Entry districtEntry : cityEntry.getValue().entrySet()) { System.out.printf(" 区: %s, 学校总数: %d%n", districtEntry.getKey(), districtEntry.getValue()); } } } }