refactor: 恢复GROUPBY+FILTER公式(按需混用COUNTIF)+@提示行

This commit is contained in:
大师 2026-06-09 04:40:23 +08:00
parent 3ce84871b3
commit b945d6234d
2 changed files with 29 additions and 36 deletions

View File

@ -154,34 +154,26 @@ TECH_COLS=['所属国别','项目名称','方案名称','编制单位','工程
write_data_sheet(s5,tech_valid.reset_index(drop=True),
f'2026年度公司认定技术方案明细ⅡⅢ类·{tech_tot}项)',TECH_COLS)
# ═══ S6-S10b: 公式(全部用COUNTIF/COUNTIFS·不用GROUPBY/UNIQUE/FILTER避免@兼容问题 ═══
# ═══ S6-S10b: 公式(GROUPBY用于分组聚合 + COUNTIF用于多指标混合 ═══
# ── S6: 公式-年度认定 ──
s6=wb.create_sheet('公式-年度认定')
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
s6.merge_cells('A1:C1'); s6.cell(1,1,'OA年度认定≥2026开工·GROUPBY公式').font=TITLE_F; s6.cell(1,1).border=GOLD_BD
s6.merge_cells('A2:C2'); s6.cell(2,1,'=GROUPBY(有效≥2026!K3:K200,有效≥2026!A3:A200,COUNTA,3,0)').font=GRAY_F
s6.cell(4,1,f'=GROUPBY({REF}!K3:K200,{REF}!A3:A200,COUNTA,3,0)').font=FORMULA_F; s6.cell(4,1).border=BORDER
for w,c in zip([18,12],'AB'): s6.column_dimensions[c].width=w
# 提示行
s6.merge_cells('A10:C10'); s6.cell(10,1,'💡 若WPS显示@前缀,选中单元格→删除@即可正常溢出').font=GRAY_F; s6.cell(10,1).fill=INFO_BG
# ── S7: 公式-国别分布 ──
s7=wb.create_sheet('公式-国别分布')
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
s7.merge_cells('A1:C1'); s7.cell(1,1,'OA国别分布自动排序·GROUPBY公式').font=TITLE_F; s7.cell(1,1).border=GOLD_BD
s7.merge_cells('A2:C2'); s7.cell(2,1,'=GROUPBY(有效≥2026!C3:C200,有效≥2026!A3:A200,COUNTA,3,0,-2)').font=GRAY_F
s7.cell(4,1,f'=GROUPBY({REF}!C3:C200,{REF}!A3:A200,COUNTA,3,0,-2)').font=FORMULA_F; s7.cell(4,1).border=BORDER
for w,c in zip([30,12],'AB'): s7.column_dimensions[c].width=w
s7.merge_cells('A10:C10'); s7.cell(10,1,'💡 若WPS显示@前缀,选中单元格→删除@即可正常溢出').font=GRAY_F; s7.cell(10,1).fill=INFO_BG
# ── S8: 公式-审批进度(COUNTIF·无GROUPBY ──
# ── S8: 公式-审批进度多指标混合·COUNTIF ──
s8=wb.create_sheet('公式-审批进度')
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,['指标','数值','备注'])
@ -200,29 +192,30 @@ for ri,(lab,fm,note) in enumerate(rows8):
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: 公式-预警明细 ── 改用Python静态写FILTER同样有@问题)
# 保留Static sheet "预警明细" 足够用;公式版跳过
# ── S9: 公式-预警明细 ── FILTER 动态筛选
s9=wb.create_sheet('公式-预警明细')
s9.merge_cells('A1:C1'); s9.cell(1,1,'OA预警明细FILTER动态筛选').font=TITLE_F; s9.cell(1,1).border=GOLD_BD
s9.merge_cells('A2:C2'); s9.cell(2,1,'=FILTER(有效≥2026!A3:AD200,有效≥2026!AD3:AD200<>"none","无预警")').font=GRAY_F
s9.cell(4,1,f'=FILTER({REF}!A3:AD200,{REF}!AD3:AD200<>"none","🎉 无预警项")').font=FORMULA_F; s9.cell(4,1).border=BORDER
for w,c in zip([22],'A'): s9.column_dimensions[c].width=w
s9.merge_cells('A10:C10'); s9.cell(10,1,'💡 若WPS显示@前缀,选中单元格→删除@即可正常溢出').font=GRAY_F; s9.cell(10,1).fill=INFO_BG
# ── S10: 公式-认定分类 ──
s10=wb.create_sheet('公式-认定分类')
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
s10.merge_cells('A1:C1'); s10.cell(1,1,'认定危大方案分类GROUPBY公式').font=TITLE_F; s10.cell(1,1).border=GOLD_BD
s10.merge_cells('A2:C2'); s10.cell(2,1,'=GROUPBY(认定数据!H3:H200,认定数据!D3:D200,COUNTA,3,0)').font=GRAY_F
s10.cell(4,1,f'=GROUPBY({CREF}!H3:H200,{CREF}!D3:D200,COUNTA,3,0)').font=FORMULA_F; s10.cell(4,1).border=BORDER
for w,c in zip([20,12],'AB'): s10.column_dimensions[c].width=w
s10.merge_cells('A10:C10'); s10.cell(10,1,'💡 若WPS显示@前缀,选中单元格→删除@即可正常溢出').font=GRAY_F; s10.cell(10,1).fill=INFO_BG
# ── S10b: 公式-技术方案分类 ──
s10b=wb.create_sheet('公式-技术方案分类')
TREF="'认定技术方案'"
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
s10b.merge_cells('A1:C1'); s10b.cell(1,1,'认定技术方案等级分布GROUPBY公式').font=TITLE_F; s10b.cell(1,1).border=GOLD_BD
s10b.merge_cells('A2:C2'); s10b.cell(2,1,'=GROUPBY(认定技术方案!F3:F200,认定技术方案!C3:C200,COUNTA,3,0,-2)').font=GRAY_F
s10b.cell(4,1,f'=GROUPBY({TREF}!F3:F200,{TREF}!C3:C200,COUNTA,3,0,-2)').font=FORMULA_F; s10b.cell(4,1).border=BORDER
for w,c in zip([12,12],'AB'): s10b.column_dimensions[c].width=w
s10b.merge_cells('A10:C10'); s10b.cell(10,1,'💡 若WPS显示@前缀,选中单元格→删除@即可正常溢出').font=GRAY_F; s10b.cell(10,1).fill=INFO_BG
# ═══ 静态汇总 ═══
s11=wb.create_sheet('年度认定汇总')
@ -282,5 +275,5 @@ 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 认定技术方案(表2): {tech_tot}")
print(f" S6-S10b 公式: COUNTIF/COUNTIFS全部无GROUPBY/UNIQUE/FILTER")
print(f" S6-S10b 公式: GROUPBY+COUNTIF+FILTER@问题有提示行")
print(f" S11-S14 静态汇总: 交叉验证")