Python使用openpyxl实现Excel求和与合并居中

Ada
Ada
发布时间:2026-10-14 | 2人浏览过
原创

本文介绍如何利用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为要求和的列

以上为个人经验分享,希望能为大家提供参考。欢迎大家多多支持本站。如有错误或考虑不周之处,敬请指正。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表