#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 根据模板文件生成1000条个人中介黑名单测试数据 """ import openpyxl from openpyxl.styles import Font, PatternFill, Alignment import random from datetime import datetime # 配置 TEMPLATE_FILE = "doc/个人中介黑名单模板_1769667622015.xlsx" OUTPUT_FILE = "doc/个人中介黑名单测试数据_1000条_第2批.xlsx" ROW_COUNT = 1000 # 姓氏和名字库 SURNAMES = ['王', '李', '张', '刘', '陈', '杨', '黄', '赵', '周', '吴', '徐', '孙', '马', '朱', '胡', '郭', '何', '高', '林', '罗'] GIVEN_NAMES = ['伟', '芳', '娜', '敏', '静', '丽', '强', '磊', '军', '洋', '勇', '艳', '杰', '娟', '涛', '明', '超', '秀英', '霞', '平', '刚', '桂英', '玉兰', '萍', '毅', '浩', '宇', '轩', '然', '梓'] # 人员类型 INDIV_TYPES = ['中介', '职业背债人', '房产中介', '贷款中介', '其他'] # 人员子类型 INDIV_SUB_TYPES = ['本人', '配偶', '父亲', '母亲', '儿子', '女儿'] # 性别 GENDERS = ['男', '女'] # 证件类型 CERT_TYPES = ['身份证', '护照', '军官证', '其他'] # 关联关系 RELATIONS = ['配偶', '父母', '子女', '兄弟姐妹', '同事', '朋友', '合伙人', '其他'] # 公司类型 COMPANIES = ['中原地产', '链家地产', '我爱我家', '21世纪不动产', 'Q房网', '安居客', '房天下', '麦田房产', '鑫置地产', '嘉业地产'] # 职位 POSITIONS = ['经纪人', '高级经纪人', '店长', '区域经理', '业务员', '顾问', '总监', '助理', '专员'] # 城市和区域数据 CITIES = { '北京': ['朝阳区', '海淀区', '东城区', '西城区', '丰台区', '通州区'], '上海': ['浦东新区', '黄浦区', '徐汇区', '长宁区', '静安区', '普陀区'], '广州': ['天河区', '越秀区', '海珠区', '荔湾区', '白云区', '番禺区'], '深圳': ['福田区', '南山区', '罗湖区', '宝安区', '龙岗区', '盐田区'], '杭州': ['西湖区', '上城区', '下城区', '江干区', '拱墅区', '滨江区'], '成都': ['武侯区', '锦江区', '青羊区', '金牛区', '成华区', '高新区'], '武汉': ['武昌区', '江岸区', '江汉区', '硚口区', '汉阳区', '洪山区'], '南京': ['玄武区', '秦淮区', '建邺区', '鼓楼区', '浦口区', '栖霞区'] } def generate_id_number(cert_type): """生成证件号码""" if cert_type == '身份证': # 生成18位身份证号码 area_code = f"{random.randint(110000, 659000)}" birth = f"{random.randint(1960, 2000)}{random.randint(1, 12):02d}{random.randint(1, 28):02d}" sequence = f"{random.randint(100, 999)}" id_num = f"{area_code}{birth}{sequence}" # 计算校验码 weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] total = sum(int(id_num[i]) * weights[i] for i in range(17)) check_code = check_codes[total % 11] return id_num + check_code elif cert_type == '护照': return f"E{random.randint(10000000, 99999999)}" elif cert_type == '军官证': return f"军字第{random.randint(1000000, 9999999)}号" else: return f"QT{random.randint(100000000, 999999999)}" def generate_phone(): """生成手机号码""" prefixes = ['130', '131', '132', '133', '134', '135', '136', '137', '138', '139', '150', '151', '152', '153', '155', '156', '157', '158', '159', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189'] return f"{random.choice(prefixes)}{random.randint(10000000, 99999999)}" def generate_wechat(): """生成微信号""" return f"wx_{random.randint(10000000, 99999999)}" def generate_address(): """生成联系地址""" city = random.choice(list(CITIES.keys())) district = random.choice(CITIES[city]) street = random.choice(['中山路', '解放路', '人民路', '建设路', '文化路', '和平路', '友谊路', '光明路']) number = random.randint(1, 999) building = random.choice(['A座', 'B座', '1号楼', '2号楼', '东苑', '西苑', '南区', '北区']) room = random.randint(101, 2606) return f"{city}{district}{street}{number}号{building}{room}室" def generate_name(): """生成姓名""" surname = random.choice(SURNAMES) if random.random() > 0.3: # 70%概率两个字的名字 return surname + random.choice(GIVEN_NAMES) else: # 30%概率三个字的名字 return surname + random.choice(GIVEN_NAMES) + random.choice(GIVEN_NAMES) def main(): """主函数""" print(f"正在读取模板文件: {TEMPLATE_FILE}") try: # 读取模板文件 wb = openpyxl.load_workbook(TEMPLATE_FILE) ws = wb.active # 获取表头 headers = [] for cell in ws[1]: if cell.value: headers.append(cell.value) print(f"模板表头: {headers}") print(f"开始生成 {ROW_COUNT} 条测试数据...") # 清除除表头外的所有数据行 for row in range(2, ws.max_row + 1): for col in range(1, ws.max_column + 1): ws.cell(row=row, column=col).value = None # 生成数据行 for i in range(2, ROW_COUNT + 2): indiv_type = random.choice(INDIV_TYPES) gender = random.choice(GENDERS) cert_type = random.choice(CERT_TYPES) # 根据表头索引填充数据 row_data = { '姓名': generate_name(), '证件号码': generate_id_number(cert_type), '人员类型': indiv_type, '人员子类型': random.choice(INDIV_SUB_TYPES), '性别': gender, '证件类型': cert_type, '手机号': generate_phone(), '微信号': generate_wechat(), '联系地址': generate_address(), '所在公司': random.choice(COMPANIES), '职位': random.choice(POSITIONS), '关联人员ID': str(random.randint(1000, 9999)) if random.random() > 0.8 else '', '关联关系': random.choice(RELATIONS) if random.random() > 0.5 else '', '备注': f'测试数据{i-1}' } # 写入行数据 for col_idx, header in enumerate(headers, start=1): if header in row_data: ws.cell(row=i, column=col_idx, value=row_data[header]) if (i - 1) % 100 == 0: print(f"已生成 {i-1} 条数据...") # 保存文件 print(f"\n正在保存文件到: {OUTPUT_FILE}") wb.save(OUTPUT_FILE) print(f"✓ 成功生成 {ROW_COUNT} 条测试数据") print(f"✓ 文件已保存至: {OUTPUT_FILE}") print(f"✓ 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # 输出前3条数据示例 print("\n前3条数据示例:") print("-" * 100) for i in range(2, 5): row_data = [] for col_idx in range(1, len(headers) + 1): val = ws.cell(row=i, column=col_idx).value row_data.append(str(val) if val else "") print(f"第{i-1}行: {', '.join([f'{h}:{v}' for h, v in zip(headers[:6], row_data[:6])])}") except FileNotFoundError: print(f"✗ 错误:找不到模板文件 {TEMPLATE_FILE}") print("请确保模板文件存在于正确的路径") except Exception as e: print(f"✗ 错误:{str(e)}") import traceback traceback.print_exc() if __name__ == "__main__": main()