需求
原始表格:
想在Total列中对每日的Amount进行汇总,然后对Date和Total进行合并居中,效果如下:
思路
遍历Excel行,从第一个非空Date列开始,到下个非空Date列,对Amount列进行求和,结果赋给第一个非空Data列对应行的Total列。若Amount列开始遇到空值,则从上一个非空Date行开始到Amount空值对应行的上一行为止,进行合并。
代码
import os
import openpyxl
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment
os.chdir('D:\\Users\\Desktop\\Temp')
wb = openpyxl.load_workbook('In.xlsx')
# 函数:范围单元格求和
def range_sum(worksheet,start,end):
sum = 0
for row in worksheet[start:end]:
for cell in row:
if cell.value != None:
sum += cell.value
return sum
# 函数:对某sheet求和并居中
def total_amount(worksheet):
ws = worksheet
row, max_row = 2, ws.max_row
while row < ws.max_row:
sum_row_start, sum_row_end = row, row
for working_row in range(row + 1,max_row):
# 长条件,换行增强可读性
if (ws['A' + str(working_row)].value != None
or (ws['C' + str(working_row)].value == None
and ws['C' + str(working_row-1)].value != None)):
sum_row_end = working_row - 1
# 求和
ws['D' + str(sum_row_start)] = range_sum(ws,'C' + str(sum_row_start),'C' + str(sum_row_end))
# 合并
ws.merge_cells('D' + str(sum_row_start) + ':D' + str(sum_row_end))
ws.merge_cells('A' + str(sum_row_start) + ':A' + str(sum_row_end))
# 居中
ws['D' + str(sum_row_start)].alignment = Alignment(horizontal="center", vertical="center")
ws['A' + str(sum_row_start)].alignment = Alignment(horizontal="center", vertical="center")
break;
row = sum_row_end + 1;
# 根据情况完善代码
total_amount(wb['Sheet1'])
wb.save('Out.xlsx')
本功能用到了openpyxl模块,更多Excel操作请见官网