From d99b1aa51cbdf533fe68ccfcbc28948d55a01e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=A0=87?= Date: Wed, 23 Jul 2025 14:28:11 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=F0=9F=90=9B:add=20cood?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/router.py | 12 ++++--- app/templates/日报模板.docx | Bin 58428 -> 58375 bytes app/tools/deal_excels.py | 1 + app/tools/final_doc.py | 13 ++++++-- app/tools/replace_text.py | 57 ++++++++++++++++++++++++++++---- app/tools/style.py | 7 +++- 6 files changed, 75 insertions(+), 15 deletions(-) diff --git a/app/api/router.py b/app/api/router.py index 4d8070d..b834ff7 100644 --- a/app/api/router.py +++ b/app/api/router.py @@ -136,7 +136,7 @@ async def upload_file(files: List[UploadFile] = File(...)): summary="生成日报", description="生成日报,将生成的简报和日报文档转成html返回前端", ) -async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0): +async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0,over_load_value: int =0): global data_dict try: logger.info("开始生成日报") @@ -148,8 +148,10 @@ async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0) # 存储文件的路径 fold_path = str(Path(UPLOAD_DIR).resolve()).replace("\\", "/") - data_dict = deal_docx(fold_path, DOWNLOAD_DIR,time_type=time_type) - + data_dict = deal_docx(fold_path, DOWNLOAD_DIR,time_type=time_type,over_load_value=over_load_value) + if "status" in data_dict: + if not data_dict["status"]: + return data_dict # 判断是否生成日报成功,如果成功,则转成html返回前端 report_sim_html = docx2html(data_dict["daily_repo_simple"]) report_html = docx2html(data_dict["daily_report"]) @@ -158,7 +160,7 @@ async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0) # 将数据写入数据库 save_word_document(data_dict) - + logger.info("日报生成返回成果") # 返回 JSON 包含 HTML 内容 return JSONResponse( content={ @@ -181,7 +183,7 @@ async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0) # 将原始数据保存到数据库 finally: try: - if os.listdir(UPLOAD_DIR): + if os.listdir(UPLOAD_DIR) and "save_folder" in data_dict: raw_data_path = move_raw_files( UPLOAD_DIR, DOWNLOAD_RAW_DIR, data_dict["save_folder"] ) diff --git a/app/templates/日报模板.docx b/app/templates/日报模板.docx index ee74b2560541c8287b7b0d8312137bcb154a5ca2..186a2601315a54e2638e04baffcc33788a964261 100644 GIT binary patch delta 16864 zcmXtfV|XA<7i?^AY}>Yz4K}uIZtMv*wzILVjcsS+jcwb$dB1z_pLu5b8TF|;r)R3G zJ4V1mN5JDaV3#(yP%J?~Ks@3Fu>oZf`F>`U4zlY|>c;`;m0wLx(K0d$Fti-gWObQ# zChY#M<6k@uM1RH3&eScF`I5wJ)x%)SY53MJe=Rf>~01^dN6=}$SJ#p%vHbw-gi zV;+(HFCZN9#HY@BbfA;o08X!G`&p$qFZ)gvoJRC>>@9!&RAb^PFnwa1^ZM!In%8bt87B0t`e(y ze%d+Gz^Dvh)DpuoAbx? z!O@w?#KFmo(ZkL*I6)zDl^JF5GWZ=yQegFEcS!5kZj#+-SwOJYavc|mT%9q)vXphE z&+Aysxtx_zY`^zy1{ZGfYQ0s$H|`ppb`f?mYEU|zqVu0Y*(Z8lv1mlU)bgzuY^Ndl zSJd5eWR`y}^LhX-cF>HLSJLEKQ)bN~H6$+hCQJssFgX&T(K~srlD{DtNYwfsFgF zzbJq35W|GxL*w^Eto$mrGhDs=acX*P+8(a?Nrv3GlR577w%cjaK1W_=6}Q&9Ef;t> zNoY_a;fE1&a;$W!Q{~5p?L5(c2qkuJ;?}!?Gh)KNHqXhx!+?PJ)K}pUKmmWrM1M(P zC2FCSa*Ny)5NGm7#1GGyn1psT4T1G{)^c=A|J zf+;xC7TpF0flvFQ4cD|&^Eq%msyBdn?-3s9+Syp7zt$R$rE1-|u@YKpYyPp&bJyRo zXB)Hn+tZbUwM|VSCe7jEr}G)!;0k9C`BQ+fIICacUOgw2 zqqy~@<0sa4w)H88l+6c?Yi}wT<{yxEWSwKZ2CDT4HjnjElqBs;kN$Oe271wrg`w5!|5Z^ZQ=m@^w`Nl*MZ3K6c7e%=WtSn0!}u@jqbSpTER z>o#uv7ReYbeAaTR`w=GyNc$^TV&e}=Ae})@$3rNowB+ia&bpVItbr~uY(kt=AegYS zGOgOfUv9Uv25&Z#8jHnA?(A@`4ccKh+Mj1jKi|54kh?yXyuo{4Knlb8gy-i%7p*cz z4xFO3a9`f?9e!M0K8_dtX*++8(fLhSVvs*Hd?vFn!IRu~_cYYzsens#3to{>56IXL zW)lk4zF&8De;Ry_Bjc&?aOu#kCL1Dzls>6MTf2F6U_;E8jYoTwDld+4kzg~H#tCi_|c(CiXI&RBJSWeNrsa z{YYVOXjbopF3_mz8Re#+;`aYT1CS67Wf9hRCYK$BTyQwR=&@pKDBhtOY`gMHq;4YC z{42oe>E=FOrf7j~-oeVUK4l3ZKqUNwy{X)}DfVx?=&3_8`GD82=6NKj1AM(6_li~< z+znyTjMZsdVqcjX`RKiA!}>KW2q6uhgs|C`C;1>6@iDigIHLGP&RQJj2$0kk8g*au z-fT5v_RV=2rLFxZfo(eEY%_mwu9_7Y&8e|$7Zc3=itjE7OAvdIW8;ssVL+#?*6zut zW>E1QptDfbV;!?<$*ym$`kq>sEESizBbc7`OROq#Xn1V7tW|XIzVZibc9n>;31T{t z7y_#wk*UVe1VQc;?b$(bIgny8v0pswDH4yNZhlQOA4Ia<*$g~(v2H^ zPFVHOtS|-dpmMA@g1(MvGOE(vs#dG2tipTxxA4HaG0DwSa*oz*45%%x<4lciv-z~( zJ`u{(_B!Zvix2;MoA+f1UvFf$O`y)EXk-VPTx@1dLZ(mDcaF;F?>2X$lO~4G%|1Z-Jpz z-)F8^y0`nP_`Tl)U>Y9uZaAQee#FQU{R8pIWt9t7&dlFwx-H$GWTbInSDE+SYW>XU zI=d;#Esu*?z<#?m-S)@!Xy8=X5OZEUEdM10XK~=`u);>r;>TGQQ;zTB?e3zWfZxkK z&~?*$T|v~7oyhh1e)Kx^aWhsy<r0JmU%RJP$8s`##K!u6BP+ zY54uTyH|+qetCKtZJ#pmJ$#x_$nN~SO=Q~S^}O6oB!#_e1Ug>>8zHI@BN)= zJ{#g@MQZZcM*b^#6_lhS;>fQWO**_GSP~>q4RoR0kdHN?R>~_&r5NA$)t6cZJH=dH zIx*&*Vd0D$_(d+|WI@em0*e|R6?Nb~mbAdoOb$2hB9r8?DM10Z21+VJ?u4o}l#{hL zdeb2(T`4@`jGg5se`AZf7`R`_m%Gf&gCs9mqBd83u4X)IqpaLPR!sI;TU52Nfnb!0&>Ot3)Ygy~R`mbo47Ce5Pt__&yw$P!airabF_r z_hf{O;WfBet+}scM_G|^Dt;Gn(DbY&ikCy=0tox-O%KUT?lS3Dtdg6;?)P?UV!B>a z(`>e5Q2tc&nblsWo)0aR>on2kNli6OxN2lMrvI*yqeCIQbV$!pE<9h@t9KXVe>qsB z67qfr_AH2qeBU#6FF#p&ufeCz&dHh67|=^IL}SQWLe-`o>}u>|H;HUMxdtj-aWy-l zKE#Yk{YUbvNJ8zs@L7b`*IHu) zILVDf#@iu|8hzZFvL?gG_O%Xt(QfEc3Zk@nb*9I zz{feUDLXjpP@{t!35)m}<`xSbBOW52O2)AJFxV^veF+=wOxRo&ol@-)LM&aF)B|3n z37VD^H(u&5hRoNP4^e@i>*_*cz5O+^BOs5;5vQ!lTZ(F|AP zvmI*PG5fG+F=$TR%F11qQ=_Sni;*rjfNdUq`cN57S~a(epa9?T7iR5Aa|p_v1KNtw z$9Qz&VkNFH&_-q{0Qd=)gfr#CEB-Q%uqW=!Eqv zmIN6Uq*XV6a$UC=4v{5^U}gs%LIxBVLDgL`Cy)eRg_>o~H z;0bPTiZjc#%@6WxJCEz2r}Adk1fv2W`)~at0NgwbPj!ECJ-wdIeew-`S4q*Up2`h% ztSg4561+2nuz?dwO^jxSuQD|Q5d69MbYkjPNSSXJaR{GE!oR1*Zvds+C6DsY)pFaAnB-!W+yK*H`A7zHSh1<)+ zy%!y_GUdJh$7i(6J|xM4gkJ)0R7>Rw&AYpI)DfLsd;T^EXO$r~k7;ffpr(c}HIdW0 zmmt~~+5Y#0-q5~7nu^pNf%Z!_z;}x%wuXEEN=v0nV}#fOna`_g1R*Mg8xie{dmi*v z7K7bSN^?eG*coM#QijBYw&zv9s8=3QFP7!F-K zd^d}lYaMay2{&s<_}#uQkksb0TtWi{!pPWxBHoteZM1_;>?g!6T(+9FTvCa^Z_7{% z`1e_;sB%1kdfBN!3xS}^^_H#mw;!iMaHE_DWZt4fXGqXz7MG@qFZt)1C}!?x9#dd8 zAzcPU)jgJ^JDozCZFYuEwPKBPO4VZ7b_n5@p7%Uy66%vC*m=4DbJ>ym_(z46@H9U+ zd47c&S_b5QAbm zGKW|pei^a-Phj&yyEg0ye z#}ggzzxFel)i}2o>hXeioOi?Rr?-5%Msx9)$P~S~gaR-C>%wFZVkj0RS83ySoQjT4 zJ*P#)_wAPh$;tA4bxR9U{90{;(n^hUFNWN@v%L+ss-c^|g(NV7W;KH-0NUzSW!Kz)*RQ3Cni`~An zUXpf!nu!|0^kshCMobNJwa#*l4lR*<21yJo9&@`+_Pn%qVIprpQECkU}O?VHp(>_TlmYm^ZS(H@x;cCl1Zh$XB<{hDGWW^Oo=P z#wK|k%pi`;mg++~C(e>`@A{;=W?r3%iOE08O0Kp=O1f^ra`2l*MxL8H=dJVm zjeV1Vu9f;~<&prZEV|6+?l~<5y?~R^rZp}`b zqv%`<3v3i_&IvlZ7EbM66L59bc5|p@u&ZgS<&)>!ba*jajC-8FU>QR%Uo3Op1-EE|f?pCm?e>irzsA{&i531d!629o=rmbFMbquDf zZn!$>2g~@RDkmora(&`A&Kw@}+l?DjfC)Aj8e%r~b0U{1cKKP^+^sBzNm*mMng=qH z!>%`TIf1&t#!n)+JMs#+eH$F}c^dh>3|+KN;au~xlpe$8o0sqDw)Mw#)clgW+d@`2 zfpxKd*8M$0Nr$OGeiKq!$FLNl$mV1X3nLx+;CpCdqO0BN9Vfm|s7+sacVlJ=pr?mg zL|~%+JI&+osB9!We0vlF6kSCy#lpX=qO76978hdXfLlXv8^F!EcTJC1*XPbs#c-nE zZg}c99U{LW@rdQ+`R<*b&xK(b=-_-P8&yD@dqgBDK z&1c#a<|S>4O-&suwpJ#b)IwgwzzZZ4@<`RflbQp~X@$OtlB-3P^8U}RT3R7Ys=;#l z>KeibzD7gm{1E~#K9_2JI>H~c<|VWvi>%xDlLCMH{+&pW=OYxt{S}^K=5KrtD1pZvTpb0pbH$_HuF~CT zt84LS&bl{T6`=>KZPZbo*kHINC%#3W5H{-=rBKRBCT|!KvSZSP+OQ=zuEdmAG3{$$ zs#8Ml*S3+sz^@hS>gi=w0QMSphL6`?=J3c%rDhrrw+j)?bjisWuc#VyD#)0r4-NQ_ zj?V6$W!i28;oi0CS~S--NK|#^??y4S$KDiH`stdeEziC`zk2Z)wd~8Edw~57u}e5P zsjmCB_5l5F=r^9SJt2<{P4mF>&i?1Nx~@hl=h(#un}GYCg!(m8!2U*fO&`Sx{$ANA zKO#+7ErM&ustG>D&^*NJBFMcRjOsW#E#!0Jqjk zLu4zoBBaZ|bxq|3oE`XU-<@i@4q+O{EKgd5Rw_yv&c~jxbK#s$_ zJ5LkYva?j&FxoP>Yq>o#3wGDgrX80I(TadZtg5lBv)Fp4 ziJcyG_Tw%ZyJPo*U_L)p8PUZT^Kh-jy7ljcdg87_E$i+FJ`8~Zl)!NLWFL-PE_P^qSQ=v1ApUigVyEFfV#u+Y?-+3je=CO9QOF9 z7(h19iIqCIFpUVnR=L{lgdXtKUFt{*tehb5jY-ep;;m6n8z;9$+q*;mNl*`h!uj2;LsJp&ZoUyF z)A+pKZzZmxJ2N0%5_h4q;Bfirf8LAs>2NU7iwWPH|Bm0!f~DKphzCnK7)n~_h_f3a%7=C^%|pPg(o%aAY88kEpV1XSQrSW3BpJJO0-Y!46 zM&_btU-@1>3KBJh6!z?m39|`^x3jQc=7pplgnFTv;By6zzr#h;v4LB$(%kguJrY zORrk(5fSby2x}LaQ&(^f%C>zMWz{6pDz^J#-#e;B8_or{?u-Vk6>hJAm&5MYUo%PK z@c4JQ+!VB{l=Sql>DKqX<1Nz_&T-NMhj$(~^>m*v)2b$8(B#@uY7(ns%Nylc%_2g= zI2l~Q<>DQ!`2V;AuzN8CS=zuh6*pY-V5-L<6-{UF1Fek^IVOXg@X}LArl2|eGacwLp+sO29Ug02 zBprjtKedL=JK-9Mt?|E2QID~bv_e`6pw4%(7t?aEdpv39PQo|x{_5P`CA-V0QFX#b z36_`SBjgpqBn(P*%n7GAJXq)h)spNXNb@(`(TeeG;X@2B9~w^r(rfh-*wI~GPF772 z?N41Ot0c3{U`aOus{ls3Umtq$|SP_Do4F8H9{KZpOUGXTK&P6^&?e1_WH|7{GB$J~ z4omtr%RU`2=ZKqSIsOyMBpf#8K`WoR%hkepSW(g_1%D5GB-PfGz{&22)i&#)@ub5NC1zCd!f6}Bu&5YK0;eKll^i5FS61zrR)Pm%sM>_5?M}b6BvS3j>$T+%Zd0VAKCK>LSrel&yN?jC} zj+|JpBC^~wny5@eHjLY+U-EJ$)w}TM#31hOG0hs{x*;*J8K-t8{BspF)=I?IL~DyC z4l)ikfTsc|({FoZ2V|&Am3OE`dNJwZR>Y>3Volcpt8%g*fS?lASQPs2u2GquhbObU zt?|?C(=hXVMeVKNcWUE!sxi%Fbg|P}ILvrNOl2Rg=%6DGLYhb`)ED|+Iq@H&`S~=T zPJbTCnU?kQj(>yQ@zi!4S)445MO~Jd1?J~OKq+uKTS(yghgp;Uac?uAG~dYwU_qozkzVgPcYlBb7}(HQ4RNc=j?BynXu`V5N_D#mN1wcnIY{-O6it zj!uzsU@vWXrX^cyl#N7)i+l2t!LE_Oe9*xwgmLX{bP5WHR`4;G$usBda{PJ}kaPru zIpU-oUtjQo)uf^>)FX+wvO7&OYN$=)H++E3l9hw`T)0fnW7YG9mA4?N^%8YoCt`iR zZO=3l5q<78S`d94>~#u>+pKq7&yThn_~Qmd+(AG;MzanVlNoR5m}5MaC`@zYq8TIK ze~gw8#Y=zE7)$d3TC`4=jR^D}mTKDZmnL5F1W# zJ`{~=NHg5ieOEDGyG}ItQmtt!t=;a{6Q^r~cpD3Zx;Y@g>%mqT(55d`#fv|mv*0B5 z5g4=>d@8acFty_S3AL5#byOnRv`;cI+Ks8Dj$ORS&&ly9!YAeG8p>!BBp(4#wRKFP zCn)%SXDtsVeQ&3?JAGB7~Z3hsbV`gJBa z0a4NeyEikCfm$@uftp3;E{O7bITexF&t{V4pC}#MkaB+NsjguV zvGx%T!gy{dj+2lj3HgAjmT?rsU!c%9D@dLKouD|6TorZt2RSS#-Ikj)N|X5b2nET; z+hf6{P|!UENYY$`>-K9LE6RLbv4|aMkxGP&D4sicF=y?qXAsW0?nrDw4dDFdhW5aD zg}=rD{nm)}NoC#g^KE#O;B)7Gm#YipiP-sHhgGOZn;LZc~~QA`538wkupw1PvYFO3qVI}0<`hJiG| zgDfEq$}_WvL;s6YJ|?p>QX<@LI_}N1MSxe!#f-hu)){JU^)WK68EGc1wOn@8V#$+PLaXS2?q;DBZdEsu=7sLnlRUSm5is za*@*K6!{TulQ!Q{@=DF=(*1IbZ``Cvno3B@0L&KHK6KE_({(Ufih|kI+pNx;X?}p{ z3l+y&hGRB(qcU_XG`#3s94%xbEI7#ABPoh|sA{VYnnAfSW z1>EMF4vp`)C7A{M-VUd-fyd{_M}we7h~C^q+6nnC zDGBr9>nM3#|5(_ROEpR@?Abf-siFC6XuxeIZR%ufN`lmXZNPLkGU+W;9VMM0iy!6n zT{$gba*Ot&c#+*L$UD#&om$0Xamz~ydq^g)F@}JVq3-lzZ4=UqW}uo5AvukY=+M%_8=b#AREQlEcV9_Yni6a1`5$z-3FQrHwV^sb-_4n*C-O7)F{3 zS@L^=x#v;cnZi0lwGQBzyL z$eGO21I2H{bJ+ug#W?GaR6)YmfpDS@L#{-+fdSnB4*>_dG`B6>bc>=LyLq_I}w)YJDR4bM~w2oskijw%@t}>$*^9m|9#GDH(1NwW=+(zH!sAU?GBt zWeTut{lPGq;;>Q;H43mJ^TuFgFn71H-9&+NbAiH-{7VjneL-nF~4J z|G;UmwC*TXT3pbM63&HZVO^?TTh$ah-_Zs=aKs^4;(%!KBjzMWInwmf^TIkRaPaec z+v_CZ7GQv39|T6wO0Xejg?(`t>DA!coiG>ab5PVDUl>{84l2O~6n>?OK~C{MNNq!o4OP?Gri5u7z)Q9a zo;_CyBfeM)DfWNIU*{in|y_+r#1Awl4-d@6$3t-<}EjkiywTAvLRKAqmzFLIE0h+OhsG`|ET-ZXl=J&Sq zqyh_|L^&#!V^MuQS2_lJe|t0_1nwQg9KF6`XbEpD9Atn7MoN;~MUvYnu4#&m(6AfEf{DZW?PY?mzxhtFfa8=8?QKbPLMCg2}<-CV5DO zbF@lHqiU(;nWzPSv8(}%;X-Ryom@={>GH5 zmzYJ5OLKUi;7U)O>nRk4x71V?DGc`@+o`JYkc9@D7~`)9JE;om0{$(qaD+`1`8s65n{~W9DB)`0_BKOceLzDelj~+NApF#NU=_-6l6E8c=*eRk}vn^ z=#|-TP_DiJ*th#Qw~WuUk0q%tjxT4&VjYervA3&g*YS7ks~hQB&i!zO)k`|_$)TK_ zc9=s1YhHWxxFmYMT5&N_5Rv zZ0$eH)e9}>6~hE6?%bd{XMW(mB$;EZ?;$Ghh#XZ3brwMe6q{Op^d_Joi#ojjSLGUV z`<1KHC1v*qeTr0f-L^)ai5}5z;i0O;WEc695#eR5eTE>^_)L$7dcB5)DwOK5BhjV8L%ACM}G z$KTo#m8qhdCD01dwnKZ8r5+J@-OrEA2L2fFd`~4~!TJW{@;US*y!xon^>Tg<-HrD( z(w%_G%_P|}(;lBliVFLR375GBa3WapS0_>u{n~h$(~;53^_&F!$?Ii|V}5N+=5jUZ z*xj|t@>6TGiHo#jNFSt-d`BCyqKZ0BY7=H_D~3;yIf@=>{u}fGyryfWKdiq-m1z& zgCPQP!yIyE)eL_U&A|h|5Dx#I(eypzEBRT`v(#y3$$~7my1sNd72>4uq0nT6LVBQl_bv^5k_yPk>u+v2-upA|!3mI?M->omR91Y>OJAi*!q= zjtRFPKCmYowrq(g{nyNvz}O$}2M@bpQqmvBhZ8VS`O^6bmbBm2|4IP0&?hIx*?%J) zfG?%I``2auFyc!ni(^cy+3^rbJ0+Mc-s(rZ&!JP*%>rbT{%` zdx0ks2<2fW1|DCoH^}@FQz*|NQ~*dedEK8)B6_H)@oIALcJ+SySo$)p@p~VR|G%k? zpuc?+9&;>3ac%_qOe4agJVhg>198x7`UmIbBkGgXPhkkdpwm` zFeX^^#>?6=sO@Z=x8}L8dJgr-$+as?N^LSuJrG=7JI00;u{IlulrXEnn?vw3rjsW4 zUfrsnLo!^w96f4X0hKlq=#2Vxllf#1!FEEZHi!hP4XKu8@`*23B8d}2Psu^b7Kuk8HzS@l`~zBIWYldTBmu zD;m;vQ@l>tQ8{)w0Le&Is2dRJ(Lm#pzhXGeEZd}ES&qvL6e~?rn9_HL8PjU+naeiq z=T-cP-PD$&y-YI1!Ru&3KNuul?K=22;r=|M5-I4)=Oe@G+KT_v?2YYEQfdyLf=(OF zcG_%UBw}mWnT^ zlGPVmWOp;#LZ& z=+%7RP|R2?IKB-M62tPgyt#r)wG99>@UnO^taW*P%~pa6xSol-E@$ILskn_Bv6qxvX@`lgqP)_E3Cyq_aQxjvuyqF5Nbd#}(<{0)FvaA0CR zJyivBaFcjb$sEh@YEXw2dE?qn<*Is>t*?RW7|xjA+D8}=!gz>nu^srdbBTtK{KlcA zpjv*u;^vBzk_yG+4{7zQMXVhwuN6W&_3iFMo~&G5qVv+n<;JNh^H1l4td~oWjE(fE zs%Xx6(3Y}m$@y}Y$f_#BzZT$3m-%$)pQ~%{pqk$M>vSJ`5$rk1W&Z3L4PIk=n*tRA z#+TN;9$E1H{Ck|59uu@}#Q6P%rUA8SW2WDS4$VHINFtAUQjyPE4)maTxMcw5^dCyx zhTjT72f19Ty>QmK89yZ$)pszsXta%?UzH(b25EvvQs&-qGx#zZ^PhmB$yG2``w5PL zL3a@d$3Q7*e!vdi&*EIha5sjJ*daV`u@29qRwHNOcG2Vr71m#3w91N^8n;1wR2OVR zQdc19km3UJ59mc8B5_30NI{70$W$cUm&{0vX6W@6s4wh3t=U(FL^hT;F4E!84_7Vf ze#0pDi^Sp(J)$$#LM)&|eA!J+%d%6Qq)i9=-~M<+dX`+iX zFz_+Rm79n|OpyX11r37`W;{7|#E;-#e+U#>C?r=YRQs=0N(~I9&_S~Yd(8#Ue?cM( zi-#0cDn@8M!hjT1QXK5697)O`*aK7?3vVMYUi9B(J_)k-gN)rN~4ky6;C{J*|D2YDzn5G@4V&-fYkyfh{E@<;(Am zeg%QI1)36h2noAXUmWv~AqI=d0kX6=&Nvw_2kW7zekKWbfGD4fmHS?h&Zh2QubV>r zFAT~lAP~oVXi^3t@#wutQU<^dWZ^j^3M?}&ny{LL{B#(i@c&}NGe$`1!Zf24qrnrA z@{A%U^{RT3xbj9q{-oSb zA@jA0060B^i1rnU%O2aq@BId#urct2xzK|!r6+{K!M}Rx0>%q6_0y{;)3LLnRyIKe z4kx7Ya?$m=#^d*_EQl{mrOfZ7AHqcc(aDjDEC8$kCqX21LgN~@I+|woF_eCP!<*(& zoD+p-Y(1_k(+VzqKo;9V^uNGlaL%R{Qvj-&TDn!qAa7=nkuaF(>G6D8-2M#Xrl(>| zw!YY={b*4hr(eHT#mU&5u<{LfA%ldGtp|n_t2fgQ=IaTky$%ba=rS8LBB>G`96V@) z1WAk;<&vn)vDm)gxV{j_-fVGQ{30)3+2t=~ke=+Jk9)lD1v8sU>SZ1_H!NL6+Q}<;T-~qX#pKT#QuwTlyOV(`*+3YUw^>$bAwshK%ErkEFNUn z5!Zq?LH;UrfKPUnj||O_oE&6ax|}kgL(*LqW$8b$K_unl?x{_s>HUvcJ4@3^N|nr! z9Ulu}Vnh>1w;l43#n7vE%U`|KiUIEeo39lw(EY&$&!JV@JH8Sniu6G5r-+Xe9fi*6 znpz!gut$wvYxAFwY|5t8;$h^-#|Es!ro=lZ8gzLmJoqUh!~eYo-V7n(cq3HSkp(-sXrSf25rF z4+$-H*BmRoF~qCh)SsEe9)g3nO0~xR;VR5rB}V)ZUUqJ+{My=qWcAw7pB`+xPyssj z1d=Rk3o}=eCBqcdc_9He)p$!F@F`|cc9_$ytvh+b?TtU%=H7bLjP5?_yL2U(YQZ*}~Y> z(c`C39Bw`KFB&jNN`&E{?L^5CB48p0O%6Tek#a+<g>kFN*Juldsta zZ^7Q|e=dwkU@Z_=SDozO>(ks}Pr1%Ayk}acn@l4#u_!XPLpo!Ne2pH@egn6=Ua|G6 z+K&8*uDD!hBI!t{F=V@-#ZvayB<5GeQJ=flVa6#Zy95E>Mn-<)$L0O4kH#A1Jjmxm=O0q;!v-pRFTga#XX4leB!NPFdjK zZ>n~VNYiH)kCHv>O>d{RTB=5Vv}@i`UkCZ{@xWY)8AC^oi{qZa;uQFHK_Zjz&L1I3 z!*xv}y(>a^u|tSUQRewQL2%%E-7e=@WcBF_R>24-YK>7di86de6+N)ipYqp^DpEB9 z<{z@H>>=zw+^M|)n7#0=;=mI&0u^B@5Bv_#yYt&Q9Blrct-fRL=k+r`I5CQXdR(YR zr9rR2USzR)UvTq4&=ZY*xvbXX>EaBNj$*No6@O!NY4Q7xH#YczacdW!8A$_^+r z>uw2=J)%qrO7a_yB66Vbtae|D9a2P^26EF*L;#{qKsEA-Z3S%U)SgFPBqluRAi6t` z$-H*H&f{w$8;!x z9-<6wP?2@u4I`#4fduMa8_RJtV%UDP@5=W6gc4-Q6^Q@gLN37Ut~FqMPbDR{U9aqE+_#xpVvDKe$I;PZ$TkWOPgv5 z`|Ty%MJicl-?V{*ctx_2(eTqx$ZHFU``6RZO(DO=>VyyCtQoOLIsMb0X~ndW_dHQ< zv~2#E_nalc2vJ{4ySD3*Lu(8OJG_0Kc0i9HVaAeKIe4CK4u%h#g>p7SpG{MW_x?qG z7D+Z_uZ#-qCTVd%n5^}m_CfO5n`K5s`afvglyV=Pj=&I-ZJLa zf(U6gCByO5n+cb1U(i7=g{+Wd8aGVQ-|hkPov&D+ujbZ3StfJlCg}3|nigVW>B-#)FwN2F9kOeynN-W>S}dcXY1s}KxNXCA3d~XygXUqkv*g2V*lykdsR00A??CMU delta 16913 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: + over_load_before = over_load_value + else: + print("缺少昨日配变过载数量,需要手动填写") + return { + "status":False, + "error_message":"缺少昨日配变过载数量,需要手动填写" + } if over_load_before: # 将字符串转换为浮点数 over_load_before = float(over_load_before) diff --git a/app/tools/replace_text.py b/app/tools/replace_text.py index 7b397af..1667dfe 100644 --- a/app/tools/replace_text.py +++ b/app/tools/replace_text.py @@ -1,4 +1,5 @@ import logging +from multiprocessing.spawn import old_main_modules from docx.oxml.ns import qn from docx.shared import Pt @@ -8,18 +9,60 @@ logger = logging.getLogger(__name__) #excluded_list = ['{{year}}','{{month}}', '{{day}}'] # 将文档中的字符串变量替换成提取内容 +""" +def replace_text_in_paragraph(paragraph, old_text, new_text): + try: + runs = list(paragraph.runs) # 先复制一份,避免边遍历边修改 + for run in runs: + if old_text in run.text: + # 1. 拆分 run:把 old_text 前后拆开 + before, old, after = run.text.partition(old_text) + run.clear() + paragraph.add_run(before) + target_run = paragraph.add_run(new_text) + paragraph.add_run(after) + # 3. 仅给目标 run 加粗 + 字体 + if old_text == "{{sentiment_trend}}": + target_run.bold = True + target_run.font.name = "Times New Roman" + target_run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') + target_run.font.size = Pt(16) + elif old_text.startswith('{{') and old_text.endswith('}}'): + # 其它模板只改字体、字号,不加粗 + target_run.font.name = "Times New Roman" + target_run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') + target_run.font.size = Pt(16) + + except Exception as e: + logger.exception(f"替换段落里的文本失败:{e}") + print(f"替换段落里的文本失败:{e}") +""" def replace_text_in_paragraph(paragraph, old_text, new_text): try: if old_text in paragraph.text: # 检查段落中是否存在模板字符串 # 遍历段落的每个运行 for run in paragraph.runs: - if old_text in run.text: - run.text = run.text.replace(old_text, new_text) - if old_text.startswith('{{') : - run.font.name = "Times New Roman" - #run.font.name = "仿宋" - run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') - run.font.size = Pt(16) + if old_text =="{{sentiment_trend}}": + print("定制化加粗") + if old_text in run.text: + before, old, after = run.text.partition(old_text) + run.clear() + paragraph.add_run(before) + target_run = paragraph.add_run(new_text) + paragraph.add_run(after) + if old_text == "{{sentiment_trend}}": + target_run.bold = True + target_run.font.name = "Times New Roman" + target_run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') + target_run.font.size = Pt(16) + else: + if old_text in run.text: + run.text = run.text.replace(old_text, new_text) + if old_text.startswith('{{') : + run.font.name = "Times New Roman" + #run.font.name = "仿宋" + run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') + run.font.size = Pt(16) except Exception as e: logger.exception(f"替换段落里的文本失败:{e}") print(f"替换段落里的文本失败:{e}") diff --git a/app/tools/style.py b/app/tools/style.py index f329add..140e342 100644 --- a/app/tools/style.py +++ b/app/tools/style.py @@ -1,6 +1,7 @@ +from docx.enum.table import WD_ALIGN_VERTICAL from docx.shared import Pt from docx.oxml.ns import qn -from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING import logging @@ -16,8 +17,12 @@ def table_style(table): # 遍历每一行的每个单元格 for cell in row.cells: # 遍历单元格的每个段落 + cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER for paragraph in cell.paragraphs: paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER + paragraph.paragraph_format.line_spacing_rule = WD_LINE_SPACING.EXACTLY + paragraph.paragraph_format.line_spacing = Pt(11) + paragraph.paragraph_format.space_after = Pt(0) # 遍历段落的每个运行(Run) for run in paragraph.runs: # 设置英文字体(适用于数字和英文)