Python使用openpyxl实现Excel求和与合并居中
本文介绍如何利用Python的openpyxl库处理Excel数据。通过遍历工作表,识别非空行,对指定列(如Amount)进行条件求和,并将结果填入Total列。同时演示如何对Date和Total列执行合并居中操作,提供完整代码及注意事项,适用于Excel自动化办公场景。
需求
原始表格:

目标是在Total列中汇总每日的Amount数值,并对Date列和Total列进行合并居中处理,最终效果如下:

思路
遍历Excel工作表的每一行,定位从第一个非空的Date列开始,直到下一个非空Date列之前的区间,对该区间内的Amount列数值进行求和,并将计算结果赋值给第一个非空Date列所在行的Total列。
代码
import os
import openpyxl
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment
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
def is_blank_row(worksheet,row_num,max_col=None):
if not max_col:
max_col = worksheet.max_column
for cell in worksheet[row_num][:max_col]:
if cell.value:
return False
return True
def total_amount(worksheet):
""" 对某sheet的A、E列合并居中,并对E列求和 """
ws = worksheet
row, max_row = 4, 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 + 2):
if (not is_blank_row(worksheet, working_row-1) # 上一行有值
and (ws[f'A{working_row}'].value or is_blank_row(worksheet, working_row))): # A列有值 或 当前为空行(最后一次合并)
# 求和
sum_row_end = working_row - 1
ws[f'E{sum_row_start}'] = range_sum(ws,f'C{sum_row_start}',f'C{sum_row_end}')
# 合并居中
ws[f'E{sum_row_start}'].alignment = Alignment(horizontal="center", vertical="center")
ws[f'A{sum_row_start}'].alignment = Alignment(horizontal="center", vertical="center")
ws.merge_cells(f'E{sum_row_start}:E{sum_row_end}')
ws.merge_cells(f'A{sum_row_start}:A{sum_row_end}')
break
row = sum_row_end + 1
def main():
# 根据情况修改代码
in_file_name = 'In.xlsx'
processing_sheet = 'Sheet1'
path_name = 'D:\\Users\\Desktop\\Temp'
out_file_name = 'Out.xlsx'
wb = openpyxl.load_workbook(filename=os.path.join(path_name,in_file_name))
total_amount(wb[processing_sheet])
wb.save(os.path.join(path_name,out_file_name))
if __name__=='__main__':
main()
说明
该功能依赖于openpyxl模块,更多关于Excel的操作请参考官方文档。
注意:本代码无法处理Excel中间存在空行的情况,但文件末尾的空行不受影响。
代码中使用了f-string格式化字符串,例如'f'A{sum_row_start}'。如果Python版本低于3.6,需要将其改写为'A'+str(sum_row_start)或其他兼容形式。
补充:Python3 Pandas DataFrame 对某一列求和
在处理pandas的DataFrame时,常遇到列数据类型混合的情况,既有字符串又有数值。如果直接调用df_obj.apply(sum),通常会引发错误。
可以通过以下方式对指定列进行求和:
dataf_test1['diff'].sum() // diff为要求和的列
以上为个人经验分享,希望能为大家提供参考。欢迎大家多多支持本站。如有错误或考虑不周之处,敬请指正。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









