|
|
|
|
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) {
|
|
|
|
|
// 一、关闭各种日志输出信息
|
|
|
|
|
// 禁用 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<String, Map<String, Map<String, Integer>>> 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));
|
|
|
|
|
|
|
|
|
|
// 最后统一输出所有结果
|
|
|
|
|
printAllResults(allResults);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 通用方法:处理指定 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 统一输出所有处理结果
|
|
|
|
|
*
|
|
|
|
|
* @param allResults 所有处理结果的Map
|
|
|
|
|
*/
|
|
|
|
|
private static void printAllResults(Map<String, Map<String, Map<String, Integer>>> allResults) {
|
|
|
|
|
System.out.println("=== 2019年基础教育学校统计结果 ===");
|
|
|
|
|
|
|
|
|
|
// 按学校类型输出
|
|
|
|
|
for (Map.Entry<String, Map<String, Map<String, Integer>>> schoolTypeEntry : allResults.entrySet()) {
|
|
|
|
|
String schoolType = schoolTypeEntry.getKey();
|
|
|
|
|
System.out.println("\n【" + schoolType + "】");
|
|
|
|
|
|
|
|
|
|
int totalSchools = 0; // 统计该类型学校总数
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, Map<String, Integer>> cityEntry : schoolTypeEntry.getValue().entrySet()) {
|
|
|
|
|
String city = cityEntry.getKey();
|
|
|
|
|
System.out.println(" " + city + ":");
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, Integer> districtEntry : cityEntry.getValue().entrySet()) {
|
|
|
|
|
int count = districtEntry.getValue();
|
|
|
|
|
totalSchools += count;
|
|
|
|
|
System.out.printf(" %s:%d所%n",
|
|
|
|
|
districtEntry.getKey(),
|
|
|
|
|
count);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
System.out.printf(" %s总数:%d所%n", schoolType, totalSchools);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|