refactor: 全部公式改用COUNTIF/COUNTIFS-去除GROUPBY/UNIQUE/FILTER避免@兼容问题
This commit is contained in:
parent
aa3f7d26ef
commit
3ce84871b3
Binary file not shown.
Binary file not shown.
@ -154,37 +154,75 @@ TECH_COLS=['所属国别','项目名称','方案名称','编制单位','工程
|
||||
write_data_sheet(s5,tech_valid.reset_index(drop=True),
|
||||
f'2026年度公司认定技术方案明细(ⅠⅡⅢ类·{tech_tot}项)',TECH_COLS)
|
||||
|
||||
# ═══ S6-S10b: 动态公式 ═══
|
||||
# ═══ S6-S10b: 公式(全部用COUNTIF/COUNTIFS·不用GROUPBY/UNIQUE/FILTER避免@兼容问题) ═══
|
||||
|
||||
# ── S6: 公式-年度认定 ──
|
||||
s6=wb.create_sheet('公式-年度认定')
|
||||
write_formula_sheet(s6,'OA年度认定','GROUPBY on 是否超一定规模',
|
||||
[('A',4,f'=GROUPBY({REF}!K3:K200,{REF}!A3:A200,COUNTA,3,0)','')],[('A',18),('B',12)])
|
||||
s6.merge_cells('A1:B1'); s6.cell(1,1,'OA年度认定(≥2026开工·COUNTIF公式)').font=TITLE_F; s6.cell(1,1).border=GOLD_BD
|
||||
hdr_row(s6,3,['分类','方案数'])
|
||||
s6.cell(4,1,'一般类').font=DATA_F; s6.cell(4,1).border=BORDER
|
||||
s6.cell(4,2,f'=COUNTIF({REF}!$K$4:$K$200,"否")').font=FORMULA_F; s6.cell(4,2).border=BORDER
|
||||
s6.cell(5,1,'超规类').font=DATA_F; s6.cell(5,1).border=BORDER
|
||||
s6.cell(5,2,f'=COUNTIF({REF}!$K$4:$K$200,"是")').font=FORMULA_F; s6.cell(5,2).border=BORDER
|
||||
s6.cell(6,1,'合计').font=BOLD_F; s6.cell(6,1).border=BORDER
|
||||
s6.cell(6,2,'=B4+B5').font=BOLD_F; s6.cell(6,2).border=BORDER
|
||||
for w,c in zip([14,10],'AB'): s6.column_dimensions[c].width=w
|
||||
|
||||
# ── S7: 公式-国别分布 ──
|
||||
s7=wb.create_sheet('公式-国别分布')
|
||||
write_formula_sheet(s7,'OA国别×分类','GROUPBY on 所属国别',
|
||||
[('A',4,f'=GROUPBY({REF}!C3:C200,{REF}!A3:A200,COUNTA,3,0,-2)','')],[('A',30),('B',12)])
|
||||
s7.merge_cells('A1:B1'); s7.cell(1,1,'OA国别分布(COUNTIF公式)').font=TITLE_F; s7.cell(1,1).border=GOLD_BD
|
||||
hdr_row(s7,3,['国别','方案数'])
|
||||
country_list = sorted(m['所属国别'].unique(), key=lambda x: m[m['所属国别']==x].shape[0], reverse=True)
|
||||
for ri,cn in enumerate(country_list):
|
||||
r = ri+4
|
||||
s7.cell(r,1,cn).font=DATA_F; s7.cell(r,1).border=BORDER
|
||||
s7.cell(r,2,f'=COUNTIF({REF}!$C$4:$C$200,"{cn}")').font=FORMULA_F; s7.cell(r,2).border=BORDER
|
||||
s7.cell(len(country_list)+4,1,'合计').font=BOLD_F; s7.cell(len(country_list)+4,1).border=BORDER
|
||||
s7.cell(len(country_list)+4,2,f'=SUM(B4:B{len(country_list)+3})').font=BOLD_F; s7.cell(len(country_list)+4,2).border=BORDER
|
||||
for w,c in zip([30,12],'AB'): s7.column_dimensions[c].width=w
|
||||
|
||||
# ── S8: 公式-审批进度(COUNTIF·无GROUPBY) ──
|
||||
s8=wb.create_sheet('公式-审批进度')
|
||||
write_formula_sheet(s8,'OA审批进度 & 预警','COUNTIF on 是否完成审批',
|
||||
[('A',4,'方案总数',''),('B',4,f'=COUNTA({REF}!A4:A200)',''),
|
||||
('A',5,'已完成审批',''),('B',5,f'=COUNTIF({REF}!Z4:Z200,TRUE)',''),
|
||||
('A',6,'未完成审批',''),('B',6,f'=COUNTIF({REF}!Z4:Z200,FALSE)',''),
|
||||
('A',7,'橙色预警',''),('B',7,f'=COUNTIF({REF}!AD4:AD200,"orange")',''),
|
||||
('A',8,'黄色预警',''),('B',8,f'=COUNTIF({REF}!AD4:AD200,"yellow")',''),
|
||||
('A',9,'预警合计',''),('B',9,'=B7+B8','')],[('A',20),('B',14)])
|
||||
s8.merge_cells('A1:C1'); s8.cell(1,1,'OA审批进度 & 预警(COUNTIF公式)').font=TITLE_F; s8.cell(1,1).border=GOLD_BD
|
||||
hdr_row(s8,3,['指标','数值','备注'])
|
||||
rows8 = [
|
||||
('方案总数',f'=COUNTA({REF}!A4:A200)','≥2026年开工'),
|
||||
('已完成审批',f'=COUNTIF({REF}!Z4:Z200,TRUE)','含"已完成"状态'),
|
||||
('未完成审批',f'=COUNTIF({REF}!Z4:Z200,FALSE)','审批中+未审批'),
|
||||
('🟠 橙色预警',f'=COUNTIF({REF}!AD4:AD200,"orange")','距开工≤30天'),
|
||||
('🟡 黄色预警',f'=COUNTIF({REF}!AD4:AD200,"yellow")','距开工≤45天'),
|
||||
('预警合计','=B7+B8','橙色+黄色'),
|
||||
]
|
||||
for ri,(lab,fm,note) in enumerate(rows8):
|
||||
r=ri+4
|
||||
s8.cell(r,1,lab).font=DATA_F; s8.cell(r,1).border=BORDER
|
||||
s8.cell(r,2,fm).font=FORMULA_F; s8.cell(r,2).border=BORDER
|
||||
s8.cell(r,3,note).font=GRAY_F; s8.cell(r,3).border=BORDER
|
||||
for w,c in zip([18,10,35],'ABC'): s8.column_dimensions[c].width=w
|
||||
|
||||
s9=wb.create_sheet('公式-预警明细')
|
||||
write_formula_sheet(s9,'OA预警明细','FILTER on 预警信号',
|
||||
[('A',4,f'=FILTER({REF}!A3:AD200,{REF}!AD3:AD200<>"none","🎉 无预警项")','')],[('A',22)])
|
||||
# ── S9: 公式-预警明细 ── 改用Python静态写(FILTER同样有@问题)
|
||||
# 保留Static sheet "预警明细" 足够用;公式版跳过
|
||||
|
||||
# ── S10: 公式-认定分类 ──
|
||||
s10=wb.create_sheet('公式-认定分类')
|
||||
write_formula_sheet(s10,'公司认定分类','GROUPBY on 认定数据',
|
||||
[('A',4,f'=GROUPBY({CREF}!H3:H200,{CREF}!D3:D200,COUNTA,3,0)','')],[('A',20),('B',12)])
|
||||
s10.merge_cells('A1:B1'); s10.cell(1,1,'认定危大方案分类(COUNTIF公式)').font=TITLE_F; s10.cell(1,1).border=GOLD_BD
|
||||
hdr_row(s10,3,['分类','方案数'])
|
||||
s10.cell(4,1,'一般类').font=DATA_F; s10.cell(4,1).border=BORDER
|
||||
s10.cell(4,2,f'=COUNTIF({CREF}!$H$4:$H$200,"否")').font=FORMULA_F; s10.cell(4,2).border=BORDER
|
||||
s10.cell(5,1,'超规类').font=DATA_F; s10.cell(5,1).border=BORDER
|
||||
s10.cell(5,2,f'=COUNTIF({CREF}!$H$4:$H$200,"是")').font=FORMULA_F; s10.cell(5,2).border=BORDER
|
||||
s10.cell(6,1,'合计').font=BOLD_F; s10.cell(6,1).border=BORDER
|
||||
s10.cell(6,2,'=B4+B5').font=BOLD_F; s10.cell(6,2).border=BORDER
|
||||
for w,c in zip([14,10],'AB'): s10.column_dimensions[c].width=w
|
||||
|
||||
# ── S10b: 公式-技术方案分类 ──
|
||||
s10b=wb.create_sheet('公式-技术方案分类')
|
||||
TREF="'认定技术方案'"
|
||||
write_formula_sheet(s10b,'认定技术方案等级分布',
|
||||
f'GROUPBY({TREF}!F3:F200,{TREF}!C3:C200,COUNTA,3,0)',
|
||||
[('A',4,f'=GROUPBY({TREF}!F3:F200,{TREF}!C3:C200,COUNTA,3,0)','')],[('A',20),('B',12)])
|
||||
s10b.merge_cells('A1:B1'); s10b.cell(1,1,'认定技术方案等级分布(COUNTIF公式)').font=TITLE_F; s10b.cell(1,1).border=GOLD_BD
|
||||
hdr_row(s10b,3,['等级','方案数'])
|
||||
s10b.cell(4,1,'Ⅲ类').font=DATA_F; s10b.cell(4,1).border=BORDER
|
||||
s10b.cell(4,2,f'=COUNTIF({TREF}!$F$4:$F$200,"Ⅲ")').font=FORMULA_F; s10b.cell(4,2).border=BORDER
|
||||
for w,c in zip([12,12],'AB'): s10b.column_dimensions[c].width=w
|
||||
|
||||
# ═══ 静态汇总 ═══
|
||||
s11=wb.create_sheet('年度认定汇总')
|
||||
@ -242,6 +280,7 @@ for w,col in zip([6,8,40,35,18,12,10,20],'ABCDEFGH'): s14.column_dimensions[col]
|
||||
wb.save(OUT)
|
||||
print(f"\n✅ {OUT}")
|
||||
print(f" S1-S3 数据源: OA{len(valid_all)}/{len(valid_2026)} + 认定{cert_tot}+技术{tech_tot}")
|
||||
print(f" S4 公式-认定vsOA: COUNTIFS对比(项目名预填+公式自动计算)")
|
||||
print(f" S5-S10b 动态公式: GROUPBY/FILTER/COUNTIF")
|
||||
print(f" S4 公式-认定vsOA: COUNTIFS项目级对比")
|
||||
print(f" S5 认定技术方案(表2): {tech_tot}行")
|
||||
print(f" S6-S10b 公式: COUNTIF/COUNTIFS(全部无GROUPBY/UNIQUE/FILTER)")
|
||||
print(f" S11-S14 静态汇总: 交叉验证")
|
||||
Loading…
x
Reference in New Issue
Block a user