简介这是一份面向数据分析人员、Excel 使用者及 .NET 开发者的省市区三级联动数据资源核心解决中国行政区划数据在表格与程序中按省、市、区逐级筛选联动的需求可用于数据管理、统计分析和下拉选择框开发。压缩包共 21 个文件约 2.1MB以 9 个 dll 类库、6 个 pdb 调试文件、2 个 exe 程序、2 个 xml 配置及 1 个 xls 表格为主其中 NPOI 负责读写 ExcelIonic.Zip.Reduced 处理压缩其余组件支撑数据获取与测试运行。资源内含完整的全国省市区数据源与演示程序读者可直接查看三级联动效果也能借助类库在自有项目中填充数据、设置样式并验证层级关系。目前已有 3934 人学习下载适合需要快速获取行政区划数据或搭建联动功能的开发者参考使用。1. 省市区三级联动 Excel 表格一份能直接塞进后台的行政编码底表做过后台系统的人多半遇到过这种场景前端要一个省市区三级联动下拉框产品经理说“很简单网上找一个现成的数据就行”结果你搜出来的要么是缺街道的、要么是编码对不上的、要么是某个省下面少了好几个地级市。更麻烦的是有些表格看着全实际用的时候发现字段名是中文、层级靠缩进、合并单元格满天飞根本没法直接导入数据库。这份“最全省市区三级联动 Excel 表格”解决的就是这个前置问题——它把省、市、区县三级行政区域整理成结构化表格字段清晰、层级明确适合直接作为后台系统的地址库底表也适合做数据清洗、地址解析、物流分单等场景。如果你正在搭管理后台、做用户地址模块或者需要一份能直接跑 SQL 的行政区划数据这份表格能省掉你至少半天到一天的整理时间。它不涉及任何复杂算法价值全在“数据规整”这四个字上但恰恰是这种基础数据翻车率最高。2. 拆开这份表格字段设计、层级逻辑与选型理由拿到一份 Excel 表格第一件事不是急着导入而是先看清楚它的字段结构和层级表达方式。很多人在这一步偷懒后面就会遇到“省市区串位”“编码重复”“层级断裂”这类玄学问题。这份表格的设计思路是典型的扁平化存储每一行代表一个最小行政单位通常是区县同时冗余存储它的上级省市信息这样查询时不需要递归直接 WHERE 就能出结果。2.1 字段清单与含义常见做法是至少包含以下字段我一般会按这个顺序排列字段名类型说明province_code字符串省级行政区划代码通常 6 位province_name字符串省/直辖市/自治区名称city_code字符串市级行政区划代码通常 6 位city_name字符串地级市/自治州/盟名称district_code字符串区县代码通常 6 位district_name字符串市辖区/县/县级市名称level整数层级标识1 省 2 市 3 区县有些版本还会加parent_code或full_name前者用于构建树形结构后者用于直接展示“省市区”拼接后的全称。如果你的系统需要做级联查询parent_code很有用如果只是做下拉框full_name能省掉前端拼接。选型时先确认你的业务需不需要街道/乡镇级这份表格通常到区县为止街道级需要另外补充。2.2 层级表达与编码规则行政区划代码不是随便编的它遵循 GB/T 2260 标准前两位是省级中间两位是市级后两位是区县级。比如110101代表北京市东城区110000是北京市110100是市辖区。这份表格的编码字段如果严格按照这个规则你就能用字符串截取快速做层级判断# 根据区县代码反推省市代码 district_code 110101 province_code district_code[:2] 0000 # 110000 city_code district_code[:4] 00 # 110100逻辑说明前两位加四个零得到省级代码前四位加两个零得到市级代码。参数上要注意直辖市和特殊行政区如省直辖县级行政区的市级代码可能不是标准截取结果需要以表格实际数据为准。我一般会先用LEN和LEFT在 Excel 里做一次校验确认没有异常长度再入库。2.3 为什么不用 JSON 或 CSV 而用 ExcelExcel 的优势在于肉眼可查、方便非技术人员核对。你让运营同事确认“这个市下面是不是少了某个区”给他 Excel 比给他 JSON 文件靠谱得多。而且 Excel 可以直接做筛选、排序、去重导入数据库前能快速做一轮人工校验。CSV 虽然轻量但编码问题UTF-8 BOM、GBK经常导致中文乱码Excel 在保存时可以明确选择编码格式反而少一层坑。当然最终入库时还是建议转成 CSV 或直接走数据库导入工具Excel 只作为中间校对层。3. 从 Excel 到数据库导入流程与字段映射实战表格看懂了下一步就是把它变成系统能用的数据。这一步的核心是“字段映射”和“数据清洗”顺序不能反。先清洗再映射否则脏数据会污染目标表结构。我一般会走四步Excel 预处理、导出 CSV、建目标表、批量导入并校验。3.1 Excel 预处理去合并单元格与补全空值合并单元格是导入的头号杀手。如果省市字段是合并的导入后只有第一行有值后面全是空。处理方法是选中整列取消合并然后定位空值批量填充。具体操作选中 A 列取消合并单元格按CtrlG定位条件选“空值”输入A2后按CtrlEnter批量填充。市级字段同理。这一步做完每一行都应该是完整的省市区三级信息。提示操作前先复制一份原始表格避免改坏后无法恢复。3.2 导出 CSV 与编码选择Excel 另存为 CSV 时默认可能是 GBK 编码而数据库和程序通常用 UTF-8。建议在“另存为”对话框里选择“CSV UTF-8逗号分隔”或者用 Python 的 pandas 直接读取 Excel 再写出 CSVimport pandas as pd # 读取 Excel指定 sheet 名 df pd.read_excel(行政区划表.xlsx, sheet_name省市区, dtypestr) # 去除首尾空格避免“北京市 ”这种带空格的脏数据 df df.apply(lambda col: col.str.strip() if col.dtype object else col) # 写出 UTF-8 无 BOM 的 CSV方便后续导入 df.to_csv(region.csv, indexFalse, encodingutf-8)逻辑说明dtypestr强制所有列按字符串读取防止区县代码被当成数字丢掉前导零。str.strip()处理肉眼看不见的空格。encodingutf-8不带 BOM避免某些数据库导入时第一列字段名带隐藏字符。参数上如果你的 Excel 有多个 sheetsheet_name要写对如果表格有表头行不在第一行用skiprows跳过。3.3 建表 SQL 与导入命令目标表结构要和 CSV 字段一一对应建议加一个自增主键和索引CREATE TABLE region ( id INT AUTO_INCREMENT PRIMARY KEY, province_code VARCHAR(6) NOT NULL, province_name VARCHAR(50) NOT NULL, city_code VARCHAR(6) NOT NULL, city_name VARCHAR(50) NOT NULL, district_code VARCHAR(6) NOT NULL, district_name VARCHAR(50) NOT NULL, level TINYINT NOT NULL DEFAULT 3, INDEX idx_province (province_code), INDEX idx_city (city_code), INDEX idx_district (district_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;导入用LOAD DATA最快LOAD DATA LOCAL INFILE region.csv INTO TABLE region FIELDS TERMINATED BY , ENCLOSED BY LINES TERMINATED BY \n IGNORE 1 ROWS (province_code, province_name, city_code, city_name, district_code, district_name, level);逻辑说明IGNORE 1 ROWS跳过 CSV 表头。ENCLOSED BY 处理字段里可能出现的逗号。如果导入后中文乱码检查数据库连接字符集和 CSV 编码是否一致。参数上level字段如果 CSV 里没有可以在导入时用SET level3固定赋值。3.4 导入后校验三查三对导入完成不代表结束我一般会跑三条校验 SQL-- 查总数和 Excel 行数对比 SELECT COUNT(*) FROM region; -- 查省级去重数量正常应该是 34 左右含港澳台 SELECT COUNT(DISTINCT province_code) FROM region; -- 查有没有区县代码重复 SELECT district_code, COUNT(*) FROM region GROUP BY district_code HAVING COUNT(*) 1;如果省级数量明显偏少说明有省份在清洗时被合并或丢失如果区县代码重复说明数据源本身有重复行需要去重。这三步做完基本能确认数据完整可用。4. 避坑与排查三级联动数据最常见的五个翻车点这份表格本身质量不错但使用过程中还是有几个高频坑我按“现象 → 原因 → 解决”整理出来你遇到问题时可以直接对号入座。4.1 导入后区县代码前导零消失现象110101变成110101看着正常但010101这类代码变成10101位数不对。原因Excel 或数据库把代码字段当成了数字类型。解决Excel 里先把该列格式设为“文本”数据库建表时用VARCHAR而不是INT导入时 pandas 指定dtypestr。4.2 直辖市层级错乱现象北京市下面的“市辖区”被当成一个市级单位导致前端下拉框出现“北京市 → 市辖区 → 东城区”这种奇怪层级。原因直辖市的行政编码里市级代码110100对应的名称是“市辖区”不是真正的城市名。解决在数据清洗时把直辖市和特殊行政区的市级名称统一替换为省级名称或者在前端做特殊判断跳过市级直接展示区县。4.3 省直辖县级行政区没有市级归属现象某些省下面的县级市如省直辖在表格里city_code为空或等于省级代码。原因行政区划调整后这些县级单位由省直接管辖没有地级市代管。解决在数据库里给这类记录补一个虚拟市级或者在前端级联逻辑里允许市级为空时直接展示区县。4.4 同名区县导致查询串数据现象搜索“城关区”出来好几个不同省份的结果前端只显示名称时用户无法区分。原因全国同名区县很多仅靠名称查询会命中多条。解决查询时强制带上province_code或city_code作为条件展示时用full_name拼接全称。4.5 Excel 行数虚高或虚低现象Excel 显示几万行导入后只有几千条。原因表格末尾有大量空行或者中间有隐藏行被误删。解决导入前用df.dropna(howall)去掉全空行用df.drop_duplicates()去重再和原始行数对比确认。5. 进阶用法用 Python 做地址解析与级联查询接口数据入库后真正的价值在于怎么用。除了前端下拉框这份表格还能支撑地址解析、物流分单、用户地域统计等场景。我一般会封装两个函数一个做地址字符串解析一个做级联查询。5.1 从一段地址文本反查三级编码用户填的地址是“广东省深圳市南山区科技园”你需要拆出省市区并匹配编码。思路是用省市区的名称去数据库做前缀匹配优先匹配最长的名称。import pymysql def parse_address(address): conn pymysql.connect(hostlocalhost, userroot, password, dbtest, charsetutf8mb4) cursor conn.cursor() # 先查省级 cursor.execute(SELECT province_code, province_name FROM region WHERE %s LIKE CONCAT(province_name, %%) LIMIT 1, (address,)) province cursor.fetchone() if not province: return None # 再查市级限定在已匹配的省内 cursor.execute(SELECT city_code, city_name FROM region WHERE province_code%s AND %s LIKE CONCAT(city_name, %%) LIMIT 1, (province[0], address)) city cursor.fetchone() # 最后查区县 cursor.execute(SELECT district_code, district_name FROM region WHERE city_code%s AND %s LIKE CONCAT(district_name, %%) LIMIT 1, (city[0] if city else province[0], address)) district cursor.fetchone() conn.close() return { province: province, city: city, district: district }逻辑说明LIKE CONCAT(province_name, %)用地址文本去匹配名称开头LIMIT 1防止同名干扰。参数上如果地址里省市区顺序不标准需要先做分词或正则提取这个函数只适合标准顺序的地址。实际项目中我还会加一层缓存避免每次查询都打数据库。5.2 级联查询接口的 SQL 写法前端下拉框的典型请求是先查所有省再根据省查市再根据市查区。对应 SQL 很简单-- 查所有省 SELECT DISTINCT province_code, province_name FROM region ORDER BY province_code; -- 根据省代码查市 SELECT DISTINCT city_code, city_name FROM region WHERE province_code 440000 ORDER BY city_code; -- 根据市代码查区县 SELECT district_code, district_name FROM region WHERE city_code 440300 ORDER BY district_code;注意DISTINCT不能省因为扁平化存储下同一个省会出现很多行。如果数据量大建议在province_code和city_code上建索引查询速度会明显提升。5.3 一个我踩过的坑编码更新滞后行政区划代码不是一成不变的每年都可能有个别区县撤并或更名。我早期做项目时直接拿了一份三年前的表格结果上线后用户反馈“某某区”选不到一查才发现该区已经合并到另一个区了。从那以后我每次用这类表格都会先确认数据版本并在数据库里加一个updated_at字段记录导入时间。如果你的系统对地址准确性要求高建议每半年核对一次官方发布的行政区划代码或者至少留一个手动修正的入口。希望帮到你。本文还有配套的精品资源点击获取