有如下一个excel表
表内有合并单元格,现在需要求和,不能直接下拉填充公式怎么办?
通常的办法是先取消合并单元格,计算后,再次合并单元格,比较繁琐。
在此,尝试使用python和xlwings运行直接给出想要的结果。
代码如下:
import xlwings as xw
def fill_missing_departments(data):
result = []
current_department = None
for row in data:
if row[0] is not None:
current_department = row[0]
result.append([current_department, row[1], row[2]])
return result
def 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] += salary
else:
salary_sum[department] = salary
print(salary_sum)
# {'财务部': 10038.0, '市场部': 24240.0, '行政部': 14160.0, '企划部': 6728.0}
summary_data = salary_sum
# 将数据salary_sum写入合并单元格中
# 记录哪些部门已经写入,避免写到合并单元格中间
written_departments = set()
# 从第2行开始遍历(假设第1行为表头)
row = 2
while True:
dept_cell = sheet.range(f"A{row}")
dept = dept_cell.value
if dept is None:
# 如果整行都为空,说明已经到底了
if sheet.range(f"B{row}").value is None and sheet.range(f"C{row}").value is None:
break
else:
row += 1
continue
if 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)
运行后,直接实现了目标