有如下一个excel表
表内有合并单元格,现在需要求和,不能直接下拉填充公式怎么办?
通常的办法是先取消合并单元格,计算后,再次合并单元格,比较繁琐。
在此,尝试使用python和xlwings运行直接给出想要的结果。
代码如下:
import xlwings as xwdef fill_missing_departments(data):result = []current_department = Nonefor row in data:if row[0] is not None:current_department = row[0]result.append([current_department, row[1], row[2]])return resultdef sum_salaries_by_department(file_path):# 打开Excel工作簿wb = xw.Book(file_path)sheet = wb.sheets[0] # 假设数据在第一个sheet中# 获取数据范围data_range = sheet.range('A2:C9').value # 假设数据在这个范围内print(data_range)# [['财务部', '张三', 4586.0], [None, '清风', 5452.0], ['市场部', '李四', 6589.0], [None, '李白', 8728.0], [None, '青州', 8923.0], ['行政部', '郭靖', 8192.0], [None, '黄蓉', 5968.0], ['企划部', '吴勇', 6728.0]]filled_data = fill_missing_departments(data_range)print(filled_data)# [['财务部', '张三', 4586.0], ['财务部', '清风', 5452.0], ['市场部', '李四', 6589.0], ['市场部', '李白', 8728.0], ['市场部', '青州', 8923.0], ['行政部', '郭靖', 8192.0], ['行政部', '黄蓉', 5968.0], ['企划部', '吴勇', 6728.0]]# 创建部门薪资汇总字典salary_sum = {}for row in filled_data:department = row[0]salary = row[2]if department in salary_sum:salary_sum[department] += salaryelse:salary_sum[department] = salaryprint(salary_sum)# {'财务部': 10038.0, '市场部': 24240.0, '行政部': 14160.0, '企划部': 6728.0}summary_data = salary_sum# 将数据salary_sum写入合并单元格中# 记录哪些部门已经写入,避免写到合并单元格中间written_departments = set()# 从第2行开始遍历(假设第1行为表头)row = 2while True:dept_cell = sheet.range(f"A{row}")dept = dept_cell.valueif dept is None:# 如果整行都为空,说明已经到底了if sheet.range(f"B{row}").value is None and sheet.range(f"C{row}").value is None:breakelse:row += 1continueif dept in summary_data and dept not in written_departments:sheet.range(f"D{row}").value = summary_data[dept]written_departments.add(dept)row += 1# 保存工作簿wb.save()wb.close()my_xlsx_path = '合并单元格的求和.xlsx'
sum_salaries_by_department(my_xlsx_path)
运行后,直接实现了目标