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

4 months ago
package com.dsideal.base.Tools.Excel;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
4 months ago
import cn.idev.excel.*;
4 months ago
import com.dsideal.base.Tools.Excel.Bean.BeanSchool2019_CZ;
4 months ago
import com.dsideal.base.Tools.Excel.Bean.BeanSchool2019_GZ;
4 months ago
import com.dsideal.base.Tools.Excel.Bean.BeanSchool2019_XX;
4 months ago
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
4 months ago
public class School2019 {
4 months ago
public static void main(String[] args) {
// 设置 com.alibaba.excel 的日志级别为 INFO
4 months ago
Logger excelLogger = (Logger) LoggerFactory.getLogger("cn.idev.excel");
4 months ago
excelLogger.setLevel(Level.INFO);
String filePath = "D:/dsWork/2025年收集的人口与教育数据库20250328/2015-2020年的数据/基础教育/2019.xlsx";
4 months ago
4 months ago
// 处理小学数据
processSheet(filePath, "基教小学", 7, BeanSchool2019_XX.class);
4 months ago
4 months ago
// 处理初中数据
processSheet(filePath, "基教初中", 7, BeanSchool2019_CZ.class);
4 months ago
// 处理高中数据
processSheet(filePath, "基教高中", 7, BeanSchool2019_GZ.class);
4 months ago
}
/**
* 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)
4 months ago
.sheet(sheetName)
4 months ago
.headRowNumber(skipRows) // 跳过前 skipRows 行
4 months ago
.doReadSync();
// 使用 Map 进行分组统计
Map<String, Map<String, Integer>> cityDistrictMap = new HashMap<>();
4 months ago
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);
4 months ago
4 months ago
if (count > 0) {
// 如果市不存在,创建新的 Map
cityDistrictMap.putIfAbsent(city, new HashMap<>());
4 months ago
4 months ago
// 累加区对应的学校数量
cityDistrictMap.get(city).merge(district, count, Integer::sum);
}
} catch (Exception e) {
throw new RuntimeException("处理数据时发生错误", e);
4 months ago
}
}
// 输出分组统计结果
4 months ago
System.out.println("Sheet: " + sheetName);
4 months ago
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());
}
}
}
}