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 com.dsideal.base.Tools.Util.LocalMysqlConnectUtil; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Record; 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) { // 一、关闭各种日志输出信息 // 禁用 logback 的状态输出 System.setProperty("logback.statusListenerClass", "ch.qos.logback.core.status.NopStatusListener"); // 设置所有相关日志级别 Logger root = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); root.setLevel(Level.ERROR); // 设置特定包的日志级别 String[] packages = { "org.ehcache", "org.ehcache.core", "org.ehcache.impl", "org.terracotta", "ch.qos.logback", "org.slf4j" }; for (String pkg : packages) { Logger logger = (Logger) LoggerFactory.getLogger(pkg); logger.setLevel(Level.ERROR); logger.setAdditive(false); // 防止日志向上传递 } //二、业务逻辑开始 String filePath = "D:/dsWork/2025年收集的人口与教育数据库(20250328)/2015-2020年的数据/基础教育/2019.xlsx"; // 创建一个Map来存储所有处理结果 Map>> allResults = new HashMap<>(); // 处理小学数据 allResults.put("小学", processSheet(filePath, "基教小学", 7, BeanSchool2019_XX.class)); // 处理初中数据 allResults.put("初中", processSheet(filePath, "基教初中", 7, BeanSchool2019_CZ.class)); // 处理高中数据 allResults.put("高中", processSheet(filePath, "基教高中", 7, BeanSchool2019_GZ.class)); // 保存统计结果到数据库 LocalMysqlConnectUtil.Init(); saveToDatabase(allResults, 2019); } /** * 将统计结果保存到数据库 * * @param allResults 所有处理结果 * @param year 年份 */ private static void saveToDatabase(Map>> allResults, int year) { // 先删除该年份的旧数据 Db.delete("DELETE FROM t_yn_school_count WHERE year = ?", year); // 遍历所有结果并保存 for (Map.Entry>> schoolTypeEntry : allResults.entrySet()) { String schoolType = schoolTypeEntry.getKey(); for (Map.Entry> cityEntry : schoolTypeEntry.getValue().entrySet()) { String city = cityEntry.getKey(); for (Map.Entry districtEntry : cityEntry.getValue().entrySet()) { String district = districtEntry.getKey(); int count = districtEntry.getValue(); // 创建记录 Record record = new Record(); record.set("school_type", schoolType) .set("city", city) .set("district", district) .set("school_count", count) .set("year", year); // 保存到数据库 Db.save("t_yn_school_count", record); } } } System.out.println("数据已成功保存到数据库"); } /** * 通用方法:处理指定 Sheet 表的数据 * * @param filePath 文件路径 * @param sheetName Sheet 表名称 * @param skipRows 跳过的行数 * @param beanClass Bean 类 * @return 处理结果Map */ private static Map> 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); } } return cityDistrictMap; } }