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.

83 lines
3.3 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 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 <T> void 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);
}
}
// 输出分组统计结果
System.out.println("Sheet: " + sheetName);
for (Map.Entry<String, Map<String, Integer>> cityEntry : cityDistrictMap.entrySet()) {
String city = cityEntry.getKey();
System.out.println("市: " + city);
for (Map.Entry<String, Integer> districtEntry : cityEntry.getValue().entrySet()) {
System.out.printf(" 区: %s, 学校总数: %d%n",
districtEntry.getKey(),
districtEntry.getValue());
}
}
}
}