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.

140 lines
5.7 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.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); // 防止日志向上传递
}
//初始化数据库连接
LocalMysqlConnectUtil.Init();
//二、业务逻辑
String filePath = "D:/dsWork/2025年收集的人口与教育数据库20250328/2015-2020年的数据/基础教育/2019.xlsx";
// 创建一个Map来存储所有处理结果
Map<String, Map<String, Map<String, Integer>>> allResults = new HashMap<>();
//跳过的行数
int skipRows = 7;
// 处理小学数据
allResults.put("小学", processSheet(filePath, "基教小学", skipRows, BeanSchool2019_XX.class));
// 处理初中数据
allResults.put("初中", processSheet(filePath, "基教初中", skipRows, BeanSchool2019_CZ.class));
// 处理高中数据
allResults.put("高中", processSheet(filePath, "基教高中", skipRows, BeanSchool2019_GZ.class));
// 保存统计结果到数据库
saveToDatabase(allResults, 2019);
}
/**
* 将统计结果保存到数据库
*
* @param allResults 所有处理结果
* @param year 年份
*/
private static void saveToDatabase(Map<String, Map<String, Map<String, Integer>>> allResults, int year) {
// 先删除该年份的旧数据
Db.delete("DELETE FROM t_yn_school_count WHERE year = ?", year);
// 遍历所有结果并保存
for (Map.Entry<String, Map<String, Map<String, Integer>>> schoolTypeEntry : allResults.entrySet()) {
String schoolType = schoolTypeEntry.getKey();
for (Map.Entry<String, Map<String, Integer>> cityEntry : schoolTypeEntry.getValue().entrySet()) {
String city = cityEntry.getKey();
for (Map.Entry<String, Integer> 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 <T> Map<String, Map<String, Integer>> processSheet(String filePath, String sheetName, int skipRows,
Class<T> beanClass) {
// 从指定行开始读取
List<T> dataList = FastExcel.read(filePath)
.head(beanClass)
.sheet(sheetName)
.headRowNumber(skipRows) // 跳过前 skipRows 行
.doReadSync();
// 使用 Map 进行分组统计
Map<String, Map<String, Integer>> 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;
}
}