From f788335ba219b5be7934e44fbd70e1c900a4884d Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Wed, 10 Sep 2025 13:19:03 +0800 Subject: [PATCH] 'commit' --- ...南省教育决策研究服务系统需求规格说明书.docx | Bin 0 -> 22169 bytes Tools/T4_8_SchoolMianJi.py | 262 +++++++++++++++++- 2 files changed, 254 insertions(+), 8 deletions(-) create mode 100644 Doc/云南省教育决策研究服务系统需求规格说明书.docx diff --git a/Doc/云南省教育决策研究服务系统需求规格说明书.docx b/Doc/云南省教育决策研究服务系统需求规格说明书.docx new file mode 100644 index 0000000000000000000000000000000000000000..b5ce95575ba4a182c4163b520a309fb5b26682f1 GIT binary patch literal 22169 zcmaI71CS_7vo1QeZQHhO+qP}nSYz9^ZOfkB`E{%PTI`vU)5|GPo{y)m&jR&cU+aHd!I%ZBoo0P!!|@gmxXH6Q?h4-fzV z!vAJ7ba0^au(ioa5|lq+KnT5|zVeT7lFv>rEwHd!f}OG)QM1YyH{tv}O4LBRLGXT) zp`g;Z+B4%_#N(Tb-tLPZehBM3zf%31iGC3zwlRlo%=LY3+kDj$sgNZHr+UEEYcOFu zDv#gbqDB~>H7tZkMx)F(<~pn)-wVfd+|t&KHK{&ubUu@-XX%Cm0o-Dk(mY>yZz-!k_cR4B{stZ+4@thiigU$Su7?qwid-sW* zIj>yl+~58Q&U$yt558|7QLBBKG4$%Pt?iYaHp*%|)Rm=LD666aS+MnGYyvT{Rzk$I8WB)sQqNM3}h zCP@Ks6(uDJ61b%CUe_X#Gs!CDg{0{Kpl;OxC$S4mE+vFOlh}^g$+FM&-#;rI?_sqd zmQKlMAQ%T8ktSSb5?uW=%`cYQAOo4228GlN8eDp|Cpb+#DGi&}SuLOqIqFPeN>PW@ z+}K)(f!!Mvl+n-m3mLtHF5R_6Z$IkJyA=cnk!b)_gDl;&9q?UMUIbU^7EhD+v>Oy6 zjxZeP7b^#h(C1Z4KJ;^S^QPYD>*kXi;ab9+NN+Kh!JO!aU<91i)H(0xI z3YV|H_qT`7n~#^R&6nK+2`97LwVpkpV76WO=#CM7!ztExA|nYVXCX=9-W|aKUIH5; zOSS1k)*{2`P-BgsU&bT!e*%Ge^t74!7l`Y>Kp_7I5U$QH_O|~((ULR}m&Je(c9ZfB zH|`$fD1$^aP9;#jMq9j*P@NYXm zEJG`uL|g;SInTH{q1WtM@YuquVbo_HA{LZwJ(&_pfTMXxlTto&j1Jd*UyA5`MiFf()S;Fu0aO-wRySfktd_ zTewogU!97jof`=?TTR8@ynGs+sWzitv5px8$7IVg&x}KGNU+-E7oO|t{3@QcH$w)= zZl8;P;BmNKw6H0LAx;NpgfnKiTga%_?h(|x_Uw;1$WF+co4q2dT7Cil+f7yH)LcqL zyZ5emt7px(JU2Pnz_QPE(I>X8Y>U!cN-?bQ#8d^Z?aR22yTl`_E?m=Z{v_KM=EgRN zZR`9jkyi6Q>3Dde&@=5xGSA`kr-JjM6RIwn>jUr~82`WhA?RNi-R+%B{x4tXQ!D|x z`L{=?4FCZAf3rBdc-ojc|AX?C?v&d>JL1+!_9rmB`oy4p8_(76b56TIxG#}c9Emxa z!Xze+nItHDG+q9LQ*ZH~g5P8h_{ts$g``NdD4Loxqm2~z+d>8BNC1GhL-F*Im%I-& z@giK$@z3zS@nwM!MUR%3{Cqy!9|JG{NH!*_-ZGfcUTXbzyU1$ z@<9!K6j4WS1A=%o9)tJ34TqGU9O#;ZP_LQ1xFj?mT68Z!i8PvsGld*fdhl`Z@Z!CJ zh{k=>i_X9eX(EDTPK@-2q$fsv@j!NbmDG*89#1K0L=?!mXijPx864vR3Gc<*(c3+3hK)Ub1kf5n} zxMhD>?l?GGH0-viD(Xp|Z6lisTis~(1sdawS~G}%u&pT{rQ=WuI?VyA?q#c%KCR;q zL91!IrS*jgz|ZF1@t36C&naapCbnoo4t4ReZ}Es}1&}nK*~#|tqt#13X8jrVr#sDJ z(d(L7O+1l>HU9`Ch-2>F`)@)duvy(4db-8#FZ9{_eWLjObN!!(o1d>2bWgVg`(PZO zPlx>1s<|-SsdXyfm9PbbY=lbX9OD4G$!3g?F=7b?3WB_!ucpbW27O!)8Fa;Qf34d` z#uLKBMo!1c!y{R02{G8bKimjUbnK zTH+h%O}0g&*Np|82qIL_7pQL`fH@@q^)D(Spg(T=n6dg44o_D*&97QB+ZL+!Y{IU| zj0Tm6+feh;E6{&j?}scHu z(1bYtBT}6vv?;i$cxK&ib5y&pt^THo_|Wj zvRBbF9Z0UmXWWMj} znAui3ThZ+{@6?*|XezWk9}LF!zC4l76Q0DoCM%1kxMIZ`$R|>XDSnze4}b@-d?`rE z7m6^Oy|h3Hm@DM^Q@(oF1)7&}i{VXv}tT9V9B(GDLNwFOuRW6>BpD4fQ0%L3%-iX{un?N%Q#S9(P` zur7@r>aEEmT|(s1?xAvMH&8h=+o)Wc-PC^{@OM1E`oLZJ4t{t92h%)b|M-OJvdGWYmRgBoE`BeOH z%*DhV?Q>CcY+n^2L%-6(7co`n1kaQ%oL!@gXJhqz@P&2)5@&@FYv^ohf{sc<;amUw zdAUEWiSD$MP=h!5UG;+WYVA-Zl*Y}o;;#PnKik-YEOr>k!EdP zb0yu}boxxXuIc-MbVW1d8|k)kkSo#!>8y{GMYVKqhSEu&CW~!V3n+3rO$N`pfWUP~ zv%Mx3P?Om@f<0wam2Z1D+PG#_Cf(hjgK;ATqljOX`GXPm|c>K^(a` zj4f@X9IAD~HjF)G`a3MMigH_nD2r!FMD|V$>59)maqA_4w;ETR;k|K<%0j!l!L(sn zF3rQZgJD1R=>HL89GN|WE&W%$29f#SULBF_sUXDL8gyA~OPT8^e>KVCSrwN4qiqEH zO=m^1yMd+^YW=SX(KT+JfAxkU+S8;pdHjc%QKY{HCymQ?H<0{e{h#K7m8H_ZEH?KF z$gCsSl81ELRK{ zTT0pf8f=mro>@-0EkWddCpJsv^4HMlnxOxhyd1i}It~AtcJyC^`hUgzJAEWh$o4dl zVt*%=&9OO{Cu4*BRTZL%qxE40u|c%3%3;OF^;@Z>p-Eu~_*9xvp3O%EmB88e0m;>2O%!yAI_hl>RTcG_hV9EvHA&MSeO7FX(cKat|Eeh?8hJzeqDd*| z@e-j2Qs~3yPX(BcFwGvf{BI{kw83lxp{N;dcSo=i@5;Y0Sy6jBoCVWpidQIoYS$;N7KaY6~zyR~k2%AU;Hg zMNB|4JNLMNwujXeXg_!;h`ZT*2CBBWNMz!Nne_6wFMea8KG_mk)aml~S;mH3y~^%e z?}*RB8?2V7)7>>*k+>P7GP4MkF$*CQjs6+FgbkJeIk(LVacv@_4J&(Qiu0VhK!Gh7 zRU?<3NvIY?;WpNr)@nxV_VOn_u{4S=g0&FU<~+qsajJKCwkqfiYX{_b%} z*`>wU!rM?w8&BZHK0MsY(bv(Nd6mF6d{_OviV;|-URVH}-z;MODPnHkm$JAk>_1Jk z{Ib|t7`BJ)iKRIxTg~0Y_kpt5u*s8?p9l8;nexn^RT{{G008*?4Tk^8J^ziBolRX_ zEbYwy4TVe8w3RnFQ2cf>zTh$Y!iOa#+VF(HohX|NOc`kA{;o6D3nRo6jC-p$i6$d| z0vmIlC+<6ZPW+0ShL*^mp%oQzVQeeQi=mU{`iKr3AHzh_Q2lQKT9SU>LEAyoF5QUj1 z%m2WO4eha586MJ9rbuW-@RfBWY1zf7N*5C2_OaU}{(?{T%3)V)4-$=IZu_>W~$L2ZCQK?8B=d+?kFyqsatKb;yPf+Iz zSIRRi1KWEW6e#fGbt<29nAJV*l(*LHXPQM(=$qLD5Ytof*0m)12*PmgvdTIys=Sk+ z*C30lMvnoTxJoI;pG-WdNr*CqUHutOKE?5V5S7}tPJ&X2I~pC03t#AG3NTkF_O=bE zD`r?nWQIW!Hz4ejOkR-Ze6fLWpdsyi2wm2Cj{RJ z03QZoD>ggMHK|BcWnjl_0fQFBqS-SSjqVe~%tTIABN10Zh?OtnYYaM%O8iPuc?2aU zwplo%a~ymDkNp`3U;9Z!yKhD7sMzZF0VR#oy$$e`M44bjuL*a46p}=nUQbkCOBCm* z$=v{L<-igSPEmok)<+wR7$+1}hM{`_Lu(wR+W1XOD{~eCrQOV$fUA@ADal+o1>IGN z(`5D%rI5xX@31&^0)?)nwHVt09K10)k+hG0Il_wS0P3QhX&oqPC~g%WrSfuXgI7VR zi;(jL4l7+a6Iv>wLq#C(&I-Jv-4eF!B>UXRCbwp=`1k)TTL zg%MS+vpyZI8+;Z%oFV@Dy^(uoE-yM2R&%@RqUW~U&ndi!G$Ns*9z=g{b1bud*pn`fzMCaoGU84$fLR0ZT@6M zId?7kTrDT>Et%Fo{$nKrIhRt(i~X5Om^Rns{46P|e+~d01IKxh3wqjbhna;urp5so zBuv|sr{TjA5F32TE@IuSy(YvfISTuJ3UJEKSs~9+SbbY7SomxTYkDMEGFluojv3xX z*W7X*$paU+!C}jPhZ36Obn!O{m_DN&&r0z|8^Jq#g{`^;xF1^2udg@us@T{86)Svx z2jR-ex^WxqIU+N5DVt@OZ`4-^C;mTfOZQ@N;r^*7eiC-UqG!(rpr42(>%!vL;Op&0 zd#E=@WVlx>^K#tlEc3UBDoD%{V-NoSKY2RzfBPO63sYOu|0`SHYQegP0s{c(!T;9xxmLUBInQ*oUS( zC}QmT3>zhp*W9icylk3bKt$eSD5f5$aSRc4cYoc9r_HCzIEDcy%#EN~g;xAZu8DafkcZd)6_J58Bs(Vr3}o zu4CCJHSkeU%o~w$p@5G=v<=PYHX{f2(GLR@6&egz!#LA#Z}7DQwnY_EsZDG-bbG2x zpa$75s?1F$A97mMs?oE){PoTnFsZ6j_s9AXtAr0$pa`+u(#Fxnj?Fs9EwDx4c%i7P zO|#~j%R~An6gA7e>ME!Fe3y0nw6111>&dO{c%OBA_k#KrT9Mpp73T}f2-O8e6}!hPkdDw;?4|qGtgf-^H|;JoN_|0bYNpY&(;2B&*fnD>v_5JS zk>tI=ESX1)n7{^Hp~<*py?l~NCFeYv*or$d3lg=kRi{7W=ZiEy z0+so}Y;=A8w}U^)=sP~&C-Ct+x43a(Y(4@^G(i`yB<&MS4l?2+EjaLR7m_eaA~umZ zJctzHR%r3xxiYwqPnd<{!Pds?L2aBa2>7>?kGaMU{71@?JXm!l8NfUSF|C*{VtbjH zQ&0~EndILSZ%dY4EY6Yj{_z}bP@iuvlf-!(*sR0=E^e*!3z z$EeS%6i$~p1u$8G``}M3nVa~JinG;{lbCP~`~vO4fZj{)7#Pr}K3mNXeEsbwV4e|u zn1u7@a!ovHW0HpJs`N|NXN_+{8T%uW11PF+H$f8rGoS;taGMaGLO<(z1BCmGuM2xK zXxlQYnIPhw=_pr6Z(w@Q-d}7C;zAABck65ob7IbB$1JREwY@;K_w~79?ApD>^u}So zCZnfBtOu@bGnYGN>~QO5R+nW4o)KmE9O85L%IGYiBs0N^E#mSKzK z;hseRMO;c`XvkIg*JmbQiL%bSORZM8^DFm$YT<~|pru_|-thpWjzT#^=m3PQ)*gnO z@ol;+ft=8lGJ@0sz3QDSDbHC4tkAu-ZJKvFfTT_#S(@Vt)lQ4iB~ zA4;rnedh6M_K@k!H@vIz-O>#95t_%@Jwp7L2Z^nj7I75xaf=134OH`4*_|Xqv9cdB zpenUuNdX5AGNAd77l?}zy@R@H9qMu)fm44*x3I~&`~t`|_Ux%fgq)H|Ika+h#pNPN z4%n2I!}3Mcv+D?R+!zWF;A)rye|r&*BJ$voAq+iw)R^$HS&O=}f7RrKssBhdYA&^w zx#Ea0M-c6Y9o2O#Egi1@Vc~Z5(v*q{o!Ie_tCHc)Mg>HGGnI-P83BeVBu0CjkL9eU zr^AC1f^~X%$$V)+({)OV*;>7uFORl_CvckHB1LEUq77G}zDcABj4jMd+*s$t0j*ckGPG0^xb!0deeNPV}2N?Vf`!Cj-+ zHCksr7@n0o>WQU zPHS|p+35(_WU@B2;Mw`MY(4!!x%}{F>ju{?g?_0~rV2d+z-s=2|IY|FGS69{oe}_G zG#l`LBHX_vGFMwuJC}bK4qt6$?A6w%j|#4zzRe0 zTQ`Qn1e_$EKwC#}!>nl7HJ#}Z#~21SFhaW@Q~a9i73J?i_T$W&QqVZdH=v{*J)0%1 zo+a9+?pV%~bpMY!eY@7xug&!o8)+Av3U~jj$~x;S3%TZISDikkpE>{GUZ~|&Qsuk2 zR1fdMq9>`Zx|)gipZ8<_p9A}?G;O4rHoI20;`4e@@p~tC^M{mo>{8m6c7e3hsqvr-=inu0#DC-N@q=6Qn%!NcT@1`IW4V zEuJ3j!loABJXhKUSLR$Pzns%fzcaJ$i!$vTeZ!YokIE}6ZEx*!^~)=$U#*fl6@AOg zj(@uI>#Cs(mFXTpGk#KLPq|#t?ca3xnkGKM4$1Y-t!&3wNw|{O*SX^D4}9H+XtybJ z7w2v|BlGNA(^g#FJAKRe<~mKu`vjHMyRrF4?!wAiy{FO^2FbT2W4Ca=6!)2#R~T?ohU&-h)hZa(dJ@84Q|O~^&gg+UHCYKLp& zE}XbF_-xv4xcnNQi6&}yCv^gq+fu77f|VP84q`pbt6VvACdO+_s2rOpbEC9B+}z#$ zx3)4qJ3EF{NZ8Jtz3KOA4wBC=?AY|buf4}~45Ic$=ZgiXX^=DkS(){Dv^egPcYOSv-`$WXMUT11G z3W-yOgRpIJE2y7p?o6n%ZK78XBzXR8hUrU~ghPYFpZ3Q(h&NseShn~oGWUuv}u%){|RLeg3lH-#&}4+}GNcn(GYD|IXji>gKoe zE?w!e=IZm>x51@F+rSX-K3dnt=GHRmZ)Fn-Y-nrNyRo&BbQ&j+-i35U&TexdLFU&< z3Yu^^@Z&bZeH0C{S!#V1dEK{jZXq{8Tp>d4+sxx&l=fPqvOhNK;cTs}LdWa()#Kya zQd4quNJ;w>g!Wl*^&Y$Aj!WyL+DN?p7C+pkYkMqh17RKeP&=6gbs(JNb1B8k!)Z}q zt)N*3-*!M%x8x1%1l#kvhgKokN%4)Q{Ax6GWxL8<9BfXNe$X~IPv%pT+ISx#M@`Kq zh9r~u%Vce-9Ip8y@~Y?9UZWKHsA2J0spZh?yRJ#3Vn;#yV~!kOvHL|=`s~c{x9i?)4YJ=m68>&0+`G`acHIEYgK``{G5fwQ zL;d|zOKYu3R57aAjiU#%N!H^shpum!J~S zEI+d2+=1u?^rp*ft7Q6?1)ICOr03U&Ev1NLj7;`xocbGJXXDz$T7;fU&8F?;RdCUF zS4Sf1_eG+vkCSf+!n70LVZZqC&7vp!u-I71L`K} z5!pRGs18hzO&|JKf<)gSQ&aBgP1g6k=mPWg%T%_fq}E9r3~OH_lc<;B6!agDa#^^D zz@4W^^JYnZvF>j5@sp9+sAq#_2Zl1(7;9(x@4Ay#VA;b5F&;p78k1F#quv6h$6}T@9ghO5f@}2L`oq z*dY$|vZj%e@Oo*6snK<10madUA|b!j_~Z`0K-Jh1L!qZXIMtnOOGPub5s%P`6Ol)l zS0jbv-2tlfmvb1JOzZ1wNr|DXrO^vyZNsksbiuYBhChUV=B5+QxFvpsE{|d_32B;I zIRx-~+6rf8tmUuwJqTBc)k^M6s&3W--0B1{YHT!%vI`IhlJVAK%3$b|1b>1y;VXw7M7bfyL`G$WE(h3n*zy zpnzPWBB=x-Ij=G7g}RrfWQ6z~PBJqqMrtxnU&AE5pZCFRI!J*mM`jlL!{_>3hr}n4SryG(v;Xfpvpe5|j5a#6K{*tpz7jN&&18oC)gxQz!FwHe?!`A#KA2w`A* zF!u$>_zm9E)eDt2%pns^72L z<4cNvd_SF$K`LB!RgMpLwi`X390$q+n;wKiRZ6RLRBHD}^Q~42Ck0DkQC-?D+>*N% zPaQH{oJx^4g%B4XwyKAU5n1P5^72r|A;X1`xIwjGl>fSp(B6)u2DZsGt-=F`9j(RGiy8}S z1!l=l>qCassF2;9#uX@;D^_msT(l1|XX;D9MWS|P-4->UmeE*T{17h+rhuQZ8JXO^ zT}b{Pgq}q>IVLqa|8aC1r|>JO8k~NmWtqI*%(GpzK!y4PLX1^z?_7)dX~0A*?Hk#U=uNYxQY4i1SD9eidzp z#CXb^Qc)VU5XPfq=MJNRQ_{7fS`{Qnndl)+wl`G8)&Nwqz`<95L<;I_vm%E!94*U) z*!U^DDG}_#gZlDa3ou^fq(~_uUYE&}_~?LCGBLx7-a1Z7^IywKq%g%ZILgG#M7J0w z=7Btqc=gjn)$dsrgVX+t!EsI9BLM1YX)X z!&X2JOe{**0;FU_>Ney#f~CC~4djs^_%TO zF?~7`6Jto}sPS?z33Tc&F0g@HiD)l>=iu4v2TNT&5$Gd;OJ8^j~*>D6}4^xuVD0>%gD=rdF4ybvxCS<&2eJeNoVPMBesrc zC+q!+H(ikrZ{>ZPRFSOKYB`u2fzh92XY0ad#_q=sJTxXIr$=PqZLg-;ll|!;y#!ZbaOa;<26*9A%2!*6=Qp<_T z+8t{X1f56#35d~g#XY_+MmG`EPhj77GDlLNWdaTpuP%-r(@P#sPjDDd5!bjXYyfCdEn1#T>y zgN>TiAL#`S9MWU|dS;Ln4RH}L5(Qs^q1~G74(M6~0-);-CWNQ%rJ$%DQr5z#o|2=q zA0391rlx0C$8pbJm-)1GC>iFVL?u{*zI%@V9Tr5^E`f}(kHmxa69Eo z1$i!SEmp5S^G(92lS#Xn#tahcqwdS=`YOUT6s2pz-V7`&Sk-Go*UoUW;rGhR@Yln{^yij3kR%67yyaAUw2MZry83(m< z(I%$afRKKc;q#DlWRm2#-q*tVHrtcM0=nGgjr>o<_zz8NMaWsoQbNoKI4kA|w!G-e zi1f}2nQ~scHu7W3&IAl4(zNZY5b-y-TLLV*kfO$>DW@l<;3^@dL@eBX3%-B&L=#H79z~Sx2Hz3}p#{UFuD54% zF|=Nxy^Oh^iNH!JyYg}vrTZ_s@%^43(B!5`q9{v{^b&Ql3|07g&Ke>`)o|6gUtB+gIV!kb zMSJD!Sk>2<)`X_qySL?Ltf?|i0hJ9#k(a>eSMv~eNHT=?@XewzI6Gi51FRQ1N&qBM zKfLnQyh#~NNHW9-al^Z}DI=n);g%E`B_}EqHcwMD{i1*HqO9qkH>S!AyZobZvr z#reh+>|$5EN|{3y*9rn7PBC*!eHUxlv)2Z!206^|!RMtrOOuSt)C|#LnDJ%2)&|l^K@K4Y)TmFT8jW?~c{e&(Fn+i_WBQ zL>s6;(k1O&`8_dk!Pzpba!#$C+%<99%LDNFss2@JljUg=($GT1#BEe0uYVe9C>HCy zcRPOSFNZutDm4RH8Fg!^Pk?3vq5cBH7AlvMY8@)KjKwu#M7dZOyA4SN00Pycw_SYe zmOgm`87^EfdS2>pp&*JwMX2KhQ?>c1)EWWBUVH!}Y2q?Tmy7b$sGZ|UAyyjU^?HZ2 zI6V4Xk0G==N$4a@(TSh;1n?(tP)<>RUl|%C8 zf6_$Oc-XzR-MAv;l!{Ns)LwU;Qb|y4Vd!Q;`OE{?*y#%X|rbXCqzRUJYRijD~3OWmbmvEvWjzA+7C!TTG7L6cQu4 za`BcV>0hp@227vE=`+6)d8y>gTgKd@;zwH;W5(B4j_+SrnTmC`Va&j64Zy#kM{|Jr zM2p+rXdJMk{?PuCpV~JM8g#I`+oQJijpP^d_HE;Mnam({VHfS$Q>gDOup~WSq*IM9 zKQOYYsYg_SjX}Mk#|Vd?=PKsMW{We69YJhQl^A2H06v7UP;@klLyzt-2i@=@q7miJ zXDN&$EH+T)IJSgIdjd-J&ct)$nw{$POKgVwv7%!fR-U;dzrF7!y9mx{kB#riE0*x& zXJawBQ;z4r((K*n~>Dp-ap$#;35M9U*LS618cSE zHw_D%5V1VP8bV}8Raew3t*Dx$*q>|%RID8ETMyOA!)1y4Vw=ecnj0gwlt#{W?aR4( ziSG`6WwQ8_>0M_VAL++Qw+%hHNvhZzpIiVLNi@Ry!)S_}o-3#H7w)XIV;}T(@Wyf+t&T?b%#i# z<6KM<${FqNjn`FNiA7Md@5Yx9{-0eZjybwQ@mm^iY^=ICGeE8)7e#D+g>$gj;mSrN z@(_pbRI;a=8lbbMG{euJM6%Z!#=k{1w&*!DEslN&LI^2~R}h(rPaQJ|;*o?i0T;03 zO9v-fUsJpiap`b)@{MOCFP1-!xJ*3CW4F-XU_zk!dDE?9)7%p>M5ZOKMr3$sCHbSG zJ!yo!ku&3SBGu-%Q0yR7IW0@HIh&!1>3M;Zn0v_@Xc%9Ra7RoqO;6AI%bvV?3N&bx z)X?1YPz}^>JTy=sH#)sz41&zQr?>{y_ja05wy_8h3q20HYGbx_ZPDnU!y*k z0{OJEMX`JWxPBdSNFNLscU$9IRh*=~MsQa6-9XTL9`o3jT-jLJFYX=-Ax!1PIVraH zy$|znmG;j+oqSjOd8Q8R33&$ec@?142Cdc8@VXq`xWpOn;msZyN+Zy8gm)j zRHsvyFw3fEIde_+GGg3;@v7$5DRCV&kEnB%V7W@|Stwp?8KgsTm9+N>ydOP7U&*2s z+Wr0b#}OwaTXDzb z7)jZsY_3FXI@M?4k#O@kmg7t0+dL zQs-d@B6RSWDk=FABx1ohuS58OrOc%e)S!bvt2#wCB4&dp!t)8#rYS9CY=E4?-Awil z=`lvVjduU&m@C$kBgJ$KB{upA9s#iU(pP!awYD_poI1s~eO{+HSWG+l#>(DnKtKYmkDpj?yXZZ(h(*gEvi2DCf_mg+ zisUM(a-~-*|FULJ#IMaFpCc{|;O^b3q#zdPIB* zg-qI7A`A)iHz}Haa)*1q{LUt`=+`%dj-IjcM1f`uE9ho}LU|{0tJH2v|7uu&leZOQ zcY@E0PXamKka?&nnY-F(`)BI&d&X%n@kSN@Ix={2F$4)MUnXAEnIZ%~wnMh*$?$5J zdUJ>11H`6jg_=y1j|Jd!?h)UtOCb0BDI^P6WjBV_8Bhtdl`y)+Z|Z%E^+iyzXHt_a zP&}~B$GI8?b-H6U8f4_;>e54?U){hfaBTVk97>5$Wak2$XiE9n)Lj(U@ea1ljxGj= zx!lNpnLtO+YTkgQNPeWBErg%Lnztqx{cYm_OIS_K0c=d=Wvd#{3@zk!jGWv@numw+ z#Vvd2rPBO-WK8s)!cI7NafHC5cz~Wzi?hnuzoy-^m&T3Uv)*Zs!f?n=gMlr^8D6^i zgC?BT=Np-?cI_TVj0hcge;=63WzdMvE#1b+$9wwUH-MPSua?t1`2@ioUS3h!>Ws_J z8*eqKP29q@anB=I*py!{#fmFU>{2&NrKkqao%Cy|OB#xp0*OF2nmB7`iPi@Lvk&4< zGy>-ZC4&c#EmY2-qJrp5tlhgbfYPM*Yy+)KG#hVv7zn9}(D!ry%CFEfD{AF#BXb>} z4{~$>Ku53X_koo-Ln~thb`3HgRy41tiE0h&+Y|PL39wWlkAFph%7VvD4e$uw3)AR7 zYS?J2ocg4CBD{*6{9F+@PNQZ%6o5^4WMqLR74oN<3l;+b#o-wPW}U;B8K@jEA=J!8 z>|(h~R{{P8lb!hF`I$*hFvb2&eDF-o2i;&tn1`NGRwC*Ni*cRpJ}nN#Q@ z728ho-n2@@9o!C3IsC|EaXAvFaUBjITq7W5Yh4^t#}C@&BZwBQv2XhZy}LnfbXl|0 z!V?kdrHPB;ByHr0+$$W}Zh)3qxVAwLrguK)jX0eq2A-%Kyba@PFX!D8BE)=|Pu~mR z-NTkKx+~*mxEr~9u-h$AkS^Gsy&?z&svJdz*WeU@+ zL2w?e3z1chx{3YDNy@Zl7-_0sdhNegN!FP>5A(CN z;&_q9#au0DcP%@rfsGKKn*mMC-igGn-9Wdp63R89f2-bnD-SM{zSHu$lQZ`JG}b< zGBrp6ik$0id6@=?9QDYRu{nX5j|5Z9U2g9T-V?h}Uk5W*+sm<2vnG~krr_xJH1_7z zD!y^P3_ljbDr1#tXvxwT{ws7={3j@C%AEQs%ZUS!`GqZP zC^oj>yf*NT0<>UpR}C+iFxj&MugHJuF}tLO4zf}PDh3Aa#=HPs01K`Z zt{I&=CuVWGJ625RG9Au!38_KICa0LWgkZ4`7eI zUKg)Kc>xG0m80F(-l)O&214~UPM{L36zfu$)jXcmwf^Wsu@!@~nyENO7rX)37*h@Y z><9!j136-d4J|oXil7W(fgVGu2^kNy>eQ^!F9@xPS5lL0niN2+G*T%vy5hi>StA4Y;Vb9xD%@vvE1`KwKZ55E+CTsY|xR`(t z^|mt*)DX6Y>ew?(?WAnXM(#*0kE46czSVgsfrrSeY-CX3Loid?2Voc_O#zG+P>1OG z7MK0$l6HDZ6tj;(tLRn{ETL0ewkT|+^$pCKZ98=#ab%{CL16Q1=`L}xZ`hxE0@afZ zjGE?^Qm2!p(p2w7R@s?`VWmnCfw6%V{cESZSEW|)?8C2AX`xNki%Z%6)aIe#tPI^z zpJT-foYlfSANSz#(U)cI0HuW!IhBUJ+%oyo4tLa=!%G)_|IVkJ_Ui`8Rp3^{g1Z;Z z4Bc;Z)fwF*yG!!a{|)`_hgaeBo__{f+!z}RYo5w5KaT<;?T|rQ&4-{ziFHJ{8Ws+- zlkU_?Dmvt!9##5lx5a9Upw<-Az$Mb;S`ksN;vM#URPR%I-?uUyp02rPakO?_#?c*#l7R`RWT^K;G5x_c7ers@M%k;$UpNfel;D1OhY@A39wa zGwvRw2(e(D6TXRwM2LmVezC@SB`rjG;y&AKM$SB<83ci$r$hzs+}!)%BH|&zuLPe{ zIBt|N4Xhh`vQOJ1uG!+PiB<%qm1n^v2fDt3|lv*;>B3 zjG>5K+uwP4*do8QVK)E)L5vSsgr#AvYB~~7bF+gSKU!_#fWcd8$MJMm>$9J7P;KXy3oF>xUj*^{exG>LirRFY)R_U&`|h z-(!-IS3Yk>iS?r2H%f~!#Ls+0FvpW%Up!_Vqh+J~-lQ&#H{-!eDaYM(0$Lf8O*`nS zM)<6*#g$aq;sTJe13t&bfwP7<5&N!|WFcz`;ww2iT3jydv^V>cHfh-O6UV+!X>RP6 zT1viyY4uTL^zHJhVm6r)J)t8gpCd8eAb9nv;#o_IHD2@0p=ECAH6lFRh8Nc+%?Mo&F>|-qNPGt5NmDn;AWdhe1L36m7JrKJ|~D z6cze2F&HACW;vEiYVc3t1&sbsUxA(M!?Jd*`<`V_9XxehL<5+(poK(a*Ud9XcdP?G z+HL4pGPiB$xMsn(QD^^(9Wzrg@hZ>vmbHnfuZ>xui+u7hL5Wz^+zfRq&5EOSg(=X4 zZIh<;syCy#n37ak5*lVbj_lBc=xJyM0VG7wu>3$vYXhk{`~{GrFU(U=kY1!H zy-II#0g>K&l_pg>FR1r&~LD~bMj++{SkbOdP(tc*R=@f8zT^{5)i zM7aU;!I@BKIK>QAt!mfuek+A}kt|FoU!HyLTPvuBNbDdXqI(VIg7|xrT(l&`=g=h0 zFZDzjM_^PvMpI?fcBUK@6x(;>REgWz-c5i=cs<|bR!|wLemseVU68NhBrL1D8=#M( zGaKdJdKh2s!C6z#pC>ahKPWPnow!~2)>W#tMjkqE&bUO~8+s`1zIw4WE}~z1M0)~ZA1M{ zQ_1te?;g*I0#hnF0~}9j)XX#0>pL)!TPIo%a>wwQ48$PE_bCHJl%HzXs5qCltfF+% zPr&FfsElx({d47|bulx^cTLh3 zhhIrh7R@srKde8x`2Cn?@EQtJ4kFvXpBV`W|L+_D3tMwN#7eR-`f<)v{V$7oPJ&6o z6#*g?Lt^!T=E#uO=&=TOAEJwTWUZ)0tf~@yq=X#27@geHKE~LUJ@U~CEC%@&!lF=e9>@6LK#-p@MVwsfp=J0mcr)|cr0s&{Ik_no~PD_Nd znnXUW0G+&kDyeE{CpcjkQ-T0!JOuVCyufmCgPvaKkkw^X3A zSIlLibRy}^l8Q4YU=#ck-M)qnxqcc#p*hC$Glk^X=jk%{>aaIxj{0=IbU6DMek~2G zJ?QPoL-OuDGha5Ul%u7}izF~!KlYiPp}_Im22#ya=I#nIIE3?isK^R+(%~#|eSZc& zvBwMEa1X}YH(w;#33U?>oVXpR-RaPBRz3QNpv)vP+!C;L;93fetu`MmEO>Z_o-9rd z&$SIkHp&0uaKzW}?M;=i=Ov(?w0TJi%CUYzpmT4}j4AT=ZQc4C9M6}-nRe&sf{7>= zAdf95EG%)`TwAn|`xwv1YERtTx_94tQAv4Mpuygp!TVo(V~|t2)IzbkGXmF77bw~q zU7K}i{TwH`jaaMVXwXs_n^9Xh9o7J(1oz;|<}-H&a$PG_&sF*&B&t)>6D;0I84>sK zxZhgUDT@`&$uf-y4-9SrB=_=Deu8i6Ucc z-uhBWnSnNrMUF?hJJ;ROj8KL6j2lBmia+)UTU09oR zXVvEhk>?(pW;Uou;{fX~cJkqfo-=SmD|g>5CF^ZiTu1L zpY6yrzb^=T0*E~Kt-Dq9bPL8}mqy{ISUmtN-8c4x_A$N&XJ*KvjYM5KQWO-3=RKnyLHh!Tl&iP29`8lK!n6>vg;xg9|EU;0D|_ zp5YF>AWLcc>_X0{>G^qNU*?_$1&6W{$n7;{J^{be%)gO zObIBft(2TluPIAk~<|x^z*s?rXI0;A@OG@9jSoLBB?Ok#)pI zXj(P-RFgX8<@eoDI=4&{DChVxdf!a_&1RTVcaoJ$v;MwDwrUx`R!CCW*e0;CvE7() zRH#zDFs%ESJyRjv9GVO*om$-@@V3w9DB#NDL(6NO&BcL{WmVKu_^s~7IX%u(_^c&{ zxWG#%z)?pL=24JHAp~>IQYmaVIz~y;8n?#>3~S0VsJ-XoLo4Gq`N|=eO<99t>!~2< zVux26^XRzgL$Vbw%-jBn{`xaEjZ@Z;Q2{EA3&8Jj-3I7=n+kx0G=sOwhJPyFs2dQBfpJ`H;TAoukjfuE=(*3_!xSb=be*|^CQ0L?W0A)WEhvCF^y<@dv?e7oQ{R?fYb=i_2U+OqdyHlRQ^TpORmF1EHi9mT6v-S$-XWsLSM?rSDD`rAGU$To+P_#lb z<}$qBnvhwh@yiB9N$q$>n>AP|_juu^#@0)u<9q^%Q^kJaVokK7hwuqN+5Lj$S1=g% zSjX4H&De5%eIkhmNe;TKvXrM){XWJ!2F{dl5kInPw@DcYeajpxdPaFbLHnsk%F^P5vp6TUCPP2VNccKT!NOYU>rgbLL0b>{7t#rd$^-0ETZ^BchL*e zQjDZbzt1s0)j;lV@Tu`6&iuF?wpwV1)re(^4%mjASr}8Vlg;`(Nt3nWgyxIk z<(elB-4`S+W0D)?53|Rh+Y)C&#^wl~qta}$nKh4NM&4bw4mc60xY%@ka(aqsCnubK zgB=S^fpkCli2cccW9yOq?AZA|9{r8&6N%#K1(V=0b(9xG*Nl>#{| zrm~3-?rv?CI@yD_$$`;}%6+;Nf{D}1I@Q;b=Ccy?W2^LMJ`y6U5=q<2!0b9K4jBZx ze}?#N7JPlh~7|;ZkKT zFfX^t4}~AUS+N@RI9qo(S=)Fyq(+;6!;DqJ_N>KeJCd(;a*L0C+_9 z2nm|8Y2nj#nIg0EalX=mL7V$~jSjH{6G%lSxT^9tDL23MW2pYkI9}#WXeIMuB_ll^V z!G7@!6VrwGT@M#}U0|4>3bbWNWe6<{U5t8U@w@%FtWE49UfHA|L<3CxGQp3lAlIy@ zBHA1IhMz6W~x5i@Y6HV_cGIo#RsCfkj@!P-*j8QO_Vvq*7At)DYy`$aYvYtQ7S#T$1Fg% zga!aC84z5ikmrV{KO2aC(Lq=d+DC z?4kPPbjE|}3kE!LoRGytJ-K+W9ET_FiG(J2Ln{o z0K2uR9C*rIY6ZNxJm!qXn5h04uoZr%Og7mU8`0DUP%(oXPpq$u4A9(ciJNl5%g&LE zn(n)^=HmNbO9JkS8TA-#nyYfM2za|yr+lre(9|5WO%mgf6wH`6@64Cv6dFIsAbnt8v0+xE)khO%cZf)@-JZK?}NOK%)G4p(;n@=WxoKL z*L!=N>v*MZK-}8@82y{_cwK&-MtCKEhKM3p@_*Qb|7*~f9K4_9a?rSlufM2xmjnLu zq+ABHpXE~GB>P*`y58CA0q#=x(^Kic3;!$JU2o}nzUEa+6r{hp@b5OR%dhVjujG@E zU-I8}kJt6rpCer9(L{gge|xHMU4I>@a-|0&-1uL3mFx2BV8Sao+uw6`g(>_g{(ok# s60vZ9*!~-@@cVs!9k6g^b@q4R6>b44iP!-l3LfHxivY-2%U^!`580 1 and row[1] is not None) else '未知地区' + if not raw_name: # 跳过空行 + continue + + # 区域名称转换 + str_raw_name = str(raw_name).strip() if raw_name is not None else '未知地区' + area_info = query_area_info(str_raw_name) + if area_info and isinstance(area_info, dict) and 'full_name' in area_info and 'area_code' in area_info: + area_name = area_info['full_name'] + area_code = area_info['area_code'] + if raw_name != area_name: + conversion_records.append({ + 'row': row_num, + 'raw_name': raw_name, + 'converted_name': area_name + }) + else: + area_name = raw_name + area_code = 'unknown' + name_conversion_errors.append(f"行 {row_num}: '{raw_name}'") + + area_data = { + 'area_name': area_name, + 'area_code': area_code, + 'raw_name': raw_name + } + + # 提取各教育阶段面积数据 + for stage, config in data_columns.items(): + stage_data = {} + for year_config in config['columns']: + year = year_config['year'] + year_data = {} + # 处理学校占地面积数据 + school_cols = ['school_total', 'school_urban', 'school_town', 'school_rural'] + has_school_categories = all(col in year_config for col in school_cols) + + if has_school_categories: + # 处理分类学校面积数据 + for col in school_cols: + col_name = year_config[col] + col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 + if col_idx < len(row): + value = row[col_idx] + # 数据清洗与转换 + if value is None: + year_data[col] = 0 + else: + str_value = str(value).strip() + if str_value in ['', '####']: + year_data[col] = 0 + else: + try: + year_data[col] = float(str_value) + except ValueError: + year_data[col] = 0 + else: + # 处理中职学校总面积 + col_name = year_config['school_total'] + col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 + if col_idx < len(row): + value = row[col_idx] + if value is None: + year_data['school_total'] = 0 + else: + str_value = str(value).strip() + if str_value in ['', '####']: + year_data['school_total'] = 0 + else: + try: + year_data['school_total'] = float(str_value) + except ValueError: + year_data['school_total'] = 0 + + # 处理教学辅助用房面积数据 + teaching_cols = ['teaching_total', 'teaching_urban', 'teaching_town', 'teaching_rural'] + has_teaching_categories = all(col in year_config for col in teaching_cols) + + if has_teaching_categories: + # 处理分类教学辅助用房面积数据 + for col in teaching_cols: + col_name = year_config[col] + col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 + if col_idx < len(row): + value = row[col_idx] + # 数据清洗与转换 + if value is None: + year_data[col] = 0 + else: + str_value = str(value).strip() + if str_value in ['', '####']: + year_data[col] = 0 + else: + try: + year_data[col] = float(str_value) + except ValueError: + year_data[col] = 0 + else: + # 处理中职教学辅助用房总面积 + col_name = year_config['teaching_total'] + col_idx = openpyxl.utils.column_index_from_string(col_name) - 1 + if col_idx < len(row): + value = row[col_idx] + if value is None: + year_data['teaching_total'] = 0 + else: + str_value = str(value).strip() + if str_value in ['', '####']: + year_data['teaching_total'] = 0 + else: + try: + year_data['teaching_total'] = float(str_value) + except ValueError: + year_data['teaching_total'] = 0 + + stage_data[str(year)] = year_data + area_data[stage] = stage_data + + # 修复:将字典变量重命名并添加到列表 + current_area_data = area_data + area_data.append(current_area_data) + + workbook.close() + + # 保存JSON文件 + with open(JSON_PATH, 'w', encoding='utf-8') as f: + json.dump(area_data, f, ensure_ascii=False, indent=2) + + # 输出统计信息 + print(f"✅ 学校面积数据提取完成,已保存至:{JSON_PATH}") + print(f"📊 共处理 {len(area_data)} 条地区数据") + print("\n=== 名称转换记录 ===") + if conversion_records: + for record in conversion_records: + print(f"🔄 行 {record['row']}: {record['raw_name']} → {record['converted_name']}") + print(f"📊 共检测到 {len(conversion_records)} 项名称转换") + else: + print("📝 不存在名称转换的情况") + if name_conversion_errors: + print(f"⚠️ 发现 {len(name_conversion_errors)} 个区域名称转换失败:") + for error in name_conversion_errors: + print(f" - {error}") + +except FileNotFoundError: + print(f"🔴 错误:Excel文件 '{file_name}' 不存在") +except Exception as e: + print(f"🔴 处理数据时发生错误:{str(e)}{traceback.format_exc()}") +finally: + try: + workbook.close() + except: + pass