excel A列相同时B列横排处理

领导要做个报表:数据量大,一个一个完成太累;

网上疯狂搜索;接前辈力量终于搞定;

如图所示:

  要达到如下结果,D列中的值用这个公式:

=IFERROR(INDEX($A:$A,SMALL(IF((ROW($A$1:$A$2652)>1)*($A$1:$A$2652<>""),IF(COUNTIF(OFFSET($A$1,,,ROW($A$1:$A$2652)),$A$1:$A$2652)=1,ROW($A$1:$A$2652),""),""),ROW(A1))),"")
E,F,G,H列要达到上图所示结果 :

利用公式:=IFERROR(INDEX($B:$B,SMALL(IF($A$1:$A$2652=$D2,ROW($A$1:$A$2652),""),COLUMN(A1))),"")

操作注意方式:复制公式后,要让公式生效,需要同时按下CTRL+SHIFT+ENTER ,公式才会生效:然后往右拉,再往下拉即可。

你这个组合逻辑不对,我给你详细说一下我的要求, 将第code1的所有非空数据保存到第一个数组中, 将第code2所有的非空数据保存到第二个数组中, 将第code3所有的非空数据保存到第三个数组中, 然后将互斥1和互斥2两个,以键值的方式保存在第四个数组中,键为互斥1,值为互斥2 然后将code3和互斥1之间的的数据按横排以键值的方式保存在第五个数组中,键为code3,值为code3和互斥1之间的的数据,按横排和code3对应的数组。 其余功能先删除 以下为代码 def call_external_script(self): selected_sheets = [] for item, state in self.check_states.items(): if state: sheet_name = self.tree.item(item, "values")[1] selected_sheets.append(sheet_name) if not selected_sheets: messagebox.showwarning("提示", "请至少选择一个工作表") return file_path = self.file_path.get() if not file_path: messagebox.showwarning("提示", "请先选择Excel文件") return try: all_combinations = [] for sheet in selected_sheets: df = pd.read_excel(file_path, sheet_name=sheet) required_columns = ['code1', 'code2', 'code3'] if not all(col in df.columns for col in required_columns): messagebox.showwarning("警告", f"工作表 '{sheet}' 缺少必要(code1/code2/code3)") continue excluded_columns = ['code1', 'code2', 'code3', '互斥1', '互斥2'] other_columns = [col for col in df.columns if col not in excluded_columns] # 全新组合逻辑:间两两组合 for _, row in df.iterrows(): # 处理值拆分 def split_values(col): val = row[col] if pd.isna(val) or (val_str := str(val).strip()) == '': return [] return [v.strip() for v in val_str.split(',') if v.strip() != ''] code1_vals = split_values('code1') code2_vals = split_values('code2') code3_vals = split_values('code3') # 组合1:code1 + code2 for v1 in code1_vals: for v2 in code2_vals: combo = v1 + v2 all_combinations.append(combo) # 连接其他 for other_col in other_columns: for ov in split_values(other_col): all_combinations.append(f"{combo}-{ov}") # 组合2:code2 + code3 for v2 in code2_vals: for v3 in code3_vals: combo = v2 + v3 all_combinations.append(combo) # 连接其他 for other_col in other_columns: for ov in split_values(other_col): all_combinations.append(f"{combo}-{ov}") # 创建结果DataFrame result_df = pd.DataFrame(all_combinations, columns=['组合结果']) # 使用openpyxl操作Excel文件 from openpyxl import load_workbook book = load_workbook(file_path) # 删除已有的check页 if 'check' in book.sheetnames: del book['check'] # 创建新的check页 new_sheet = book.create_sheet('check') new_sheet.append(['组合结果']) # 写入数据 for comb in all_combinations: new_sheet.append([comb]) book.save(file_path) messagebox.showinfo("完成", f"生成{len(all_combinations)}条组合,结果保存在'check'工作表") except Exception as e: messagebox.showerror("处理失败", f"处理过程中出错:\n{str(e)}")
最新发布
09-02
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值