diff --git a/data/2026-06-08/cleaned/危大方案编审进度看板.pptx b/data/2026-06-08/cleaned/危大方案编审进度看板.pptx index b8f968b..2289310 100644 Binary files a/data/2026-06-08/cleaned/危大方案编审进度看板.pptx and b/data/2026-06-08/cleaned/危大方案编审进度看板.pptx differ diff --git a/src/gen_pptx.py b/src/gen_pptx.py index b5262b1..2f06cb4 100644 --- a/src/gen_pptx.py +++ b/src/gen_pptx.py @@ -156,22 +156,28 @@ R(MX2+Inches(1.2),PY+Inches(0.08),Inches(3.6*0.56),Inches(0.18),fill=BLUE) T(MX2+Inches(1.2),PY+Inches(0.28),Inches(3.6),Inches(0.18), '已审批 29 未审批 23 / 总计 52',sz=7,clr=GRAY) -# Unregistered detail +# Unregistered detail (native table) UDY=RY2+Inches(1.85)+Inches(0.12) -R(Inches(0.5),UDY,Inches(12.333),Inches(0.72),fill=WHITE,line=RGBColor(0xDB,0xE2,0xEA)) +R(Inches(0.5),UDY,Inches(12.333),Inches(0.82),fill=WHITE,line=RGBColor(0xDB,0xE2,0xEA)) R(Inches(0.5),UDY,Inches(12.333),Inches(0.28),fill=BLUE) T(Inches(0.7),UDY+Inches(0.02),Inches(10),Inches(0.24),'登记率未达100%的项目(认定→OA)',sz=10,clr=WHITE,b=True) -# Table header -R(Inches(0.5),UDY+Inches(0.28),Inches(7.0),Inches(0.22),fill=BG) -T(Inches(0.55),UDY+Inches(0.28),Inches(6.9),Inches(0.22),'项目名称',sz=9,clr=BLUE,b=True) -for col,(w,label) in enumerate([(Inches(1.5),'认定'),(Inches(1.5),'OA'),(Inches(1.5),'缺口')],1): - R(Inches(7.5)+(col-1)*Inches(1.5),UDY+Inches(0.28),w,Inches(0.22),fill=BG) - T(Inches(7.55)+(col-1)*Inches(1.5),UDY+Inches(0.28),Inches(1.4),Inches(0.22),label,sz=9,clr=BLUE,b=True,al=PP_ALIGN.CENTER) -# Data row -T(Inches(0.55),UDY+Inches(0.50),Inches(6.9),Inches(0.22),'阿联酋阿布扎比马斯努阿岛水工项目',sz=9) -T(Inches(7.55),UDY+Inches(0.50),Inches(1.4),Inches(0.22),'2',sz=10,clr=BLUE,b=True,al=PP_ALIGN.CENTER) -T(Inches(9.05),UDY+Inches(0.50),Inches(1.4),Inches(0.22),'0',sz=10,clr=RED,b=True,al=PP_ALIGN.CENTER) -T(Inches(10.55),UDY+Inches(0.50),Inches(1.4),Inches(0.22),'2',sz=10,clr=RED,b=True,al=PP_ALIGN.CENTER) + +tbl=s1.shapes.add_table(2,4,Inches(0.5),UDY+Inches(0.28),Inches(12.333),Inches(0.48)) +tbl.table.columns[0].width=Inches(7.5) +tbl.table.columns[1].width=Inches(1.5) +tbl.table.columns[2].width=Inches(1.5) +tbl.table.columns[3].width=Inches(1.833) +for i,(h,al) in enumerate([('项目名称',PP_ALIGN.LEFT),('认定',PP_ALIGN.CENTER),('OA',PP_ALIGN.CENTER),('缺口',PP_ALIGN.CENTER)]): + c=tbl.table.cell(0,i); c.text=h + c.fill.solid(); c.fill.fore_color.rgb=BG + for p in c.text_frame.paragraphs: p.font.size=Pt(9); p.font.bold=True; p.font.color.rgb=BLUE; p.alignment=al +for i,val in enumerate(['阿联酋阿布扎比马斯努阿岛水工项目','2','0','2']): + c=tbl.table.cell(1,i); c.text=val + for p in c.text_frame.paragraphs: + p.font.size=Pt(9) + p.font.color.rgb=RED if val=='0' else BLUE + p.font.bold=i>0 + p.alignment=PP_ALIGN.CENTER if i>0 else PP_ALIGN.LEFT # Footer R(Inches(0),Inches(7.18),Inches(13.333),Inches(0.32),fill=RGBColor(0xF5,0xF6,0xF8)) @@ -200,29 +206,34 @@ warnings=[ ('🟡','阿联酋迪拜马克图姆国际机场地下结构工程','T梁预制运输安装(4包)','已添加未实施','42天'), ] -# Table header -TY=Inches(1.1); TH=Inches(0.32) +# Native table: 6 rows × 5 cols (1 header + 5 data) +TY=Inches(1.1) CW=[Inches(0.6),Inches(3.8),Inches(3.0),Inches(2.2),Inches(1.0)] HDS=['信号','项目名称','方案名称','当前状态','距开工'] x_off=Inches(0.5) -for i,(h,w) in enumerate(zip(HDS,CW)): - R(x_off+sum(CW[:i]),TY,w,TH,fill=BLUE) - T(x_off+Inches(0.05)+sum(CW[:i]),TY+Inches(0.02),w-Inches(0.1),Inches(0.28),h,sz=10,clr=WHITE,b=True) - +tbl2=s2.shapes.add_table(6,5,x_off,TY,sum(CW),Inches(6*0.38)) +for i,w in enumerate(CW): tbl2.table.columns[i].width=w +for i,h in enumerate(HDS): + c=tbl2.table.cell(0,i); c.text=h + c.fill.solid(); c.fill.fore_color.rgb=BLUE + for p in c.text_frame.paragraphs: p.font.size=Pt(10); p.font.bold=True; p.font.color.rgb=WHITE for j,(icon,proj,scheme,status,days) in enumerate(warnings): - y=TY+TH+Inches(j*0.38) + row=j+1; vals=[icon,proj,scheme,status,days] bg_c=BG if j%2==0 else WHITE - R(x_off,y,sum(CW),Inches(0.38),fill=bg_c) - T(x_off+Inches(0.05),y+Inches(0.04),Inches(0.5),Inches(0.3),icon,sz=16,al=PP_ALIGN.CENTER) - T(x_off+CW[0],y+Inches(0.04),CW[1]-Inches(0.1),Inches(0.3),proj,sz=10) - T(x_off+CW[0]+CW[1],y+Inches(0.04),CW[2]-Inches(0.1),Inches(0.3),scheme,sz=10) - T(x_off+CW[0]+CW[1]+CW[2],y+Inches(0.04),CW[3]-Inches(0.1),Inches(0.3),status,sz=10) - T(x_off+sum(CW[:4]),y+Inches(0.04),CW[4]-Inches(0.1),Inches(0.3),days,sz=11,clr=RED,b=True,al=PP_ALIGN.RIGHT) + for i,val in enumerate(vals): + c=tbl2.table.cell(row,i); c.text=val + c.fill.solid(); c.fill.fore_color.rgb=bg_c + for p in c.text_frame.paragraphs: + p.font.size=Pt({0:16,1:9,4:11}.get(i,10)) + p.font.color.rgb=RED if i==4 else BLACK + p.font.bold=(i==4) + p.alignment=PP_ALIGN.CENTER if i in (0,4) else PP_ALIGN.LEFT # Rule -R(x_off,TY+TH+Inches(5*0.38+0.2),sum(CW),Inches(0.45),fill=BG) -R(x_off,TY+TH+Inches(5*0.38+0.2),Inches(0.06),Inches(0.45),fill=GOLD) -T(x_off+Inches(0.2),TY+TH+Inches(5*0.38+0.25),Inches(11),Inches(0.35), +RY=TY+Inches(6*0.38+0.15) +R(x_off,RY,sum(CW),Inches(0.45),fill=BG) +R(x_off,RY,Inches(0.06),Inches(0.45),fill=GOLD) +T(x_off+Inches(0.2),RY+Inches(0.05),Inches(11),Inches(0.35), '📐 预警规则:🟠 橙色 ≤30天未审批 · 🟡 黄色 ≤45天未审批 · 🔴 红色 在实施未审批(本月0项)',sz=10,clr=BLACK) R(Inches(0),Inches(7.18),Inches(13.333),Inches(0.32),fill=RGBColor(0xF5,0xF6,0xF8))