Python 对Excel求和、合并居中的操作

时间:2022-08-29 11:04:50

需求

原始表格:

Python 对Excel求和、合并居中的操作

想在Total列中对每日的Amount进行汇总,然后对Date和Total进行合并居中,效果如下:

Python 对Excel求和、合并居中的操作

思路

遍历Excel行,从第一个非空Date列开始,到下个非空Date列,对Amount列进行求和,结果赋给第一个非空Data列对应行的Total列。

代码

  1. import os
  2. import openpyxl
  3. from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment
  4. def range_sum(worksheet,start,end):
  5. sum = 0
  6. for row in worksheet[start:end]:
  7. for cell in row:
  8. if cell.value != None:
  9. sum += cell.value
  10. return sum
  11. def is_blank_row(worksheet,row_num,max_col=None):
  12. if not max_col:
  13. max_col = worksheet.max_column
  14. for cell in worksheet[row_num][:max_col]:
  15. if cell.value:
  16. return False
  17. return True
  18. def total_amount(worksheet):
  19. """ 对某sheet的A、E列合并居中,并对E列求和 """
  20. ws = worksheet
  21. row, max_row = 4, ws.max_row
  22. while row < ws.max_row:
  23. sum_row_start, sum_row_end = row, row
  24. for working_row in range(row + 1,max_row + 2):
  25. if (not is_blank_row(worksheet, working_row-1) # 上一行有值
  26. and (ws[f'A{working_row}'].value or is_blank_row(worksheet, working_row))): # A列有值 或 当前为空行(最后一次合并)
  27. # 求和
  28. sum_row_end = working_row - 1
  29. ws[f'E{sum_row_start}'] = range_sum(ws,f'C{sum_row_start}',f'C{sum_row_end}')
  30. # 合并居中
  31. ws[f'E{sum_row_start}'].alignment = Alignment(horizontal="center", vertical="center")
  32. ws[f'A{sum_row_start}'].alignment = Alignment(horizontal="center", vertical="center")
  33. ws.merge_cells(f'E{sum_row_start}:E{sum_row_end}')
  34. ws.merge_cells(f'A{sum_row_start}:A{sum_row_end}')
  35. break
  36. row = sum_row_end + 1
  37. def main():
  38. # 根据情况修改代码
  39. in_file_name = 'In.xlsx'
  40. processing_sheet = 'Sheet1'
  41. path_name = 'D:\\Users\\Desktop\\Temp'
  42. out_file_name = 'Out.xlsx'
  43. wb = openpyxl.load_workbook(filename=os.path.join(path_name,in_file_name))
  44. total_amount(wb[processing_sheet])
  45. wb.save(os.path.join(path_name,out_file_name))
  46. if __name__=='__main__':
  47. main()

说明

本功能用到了openpyxl模块,更多Excel操作请见官网

本代码不支持Excel中间有空行的情况,最后有空行无影响

f'A{sum_row_start}'这样的代码用到了f-string功能,若python版本低于3.6,需改为'A'+str(sum_row_start)或其它形式

补充:Python3 Pandas DataFrame 对某一列求和

在操作pandas的DataFrame的时候,常常会遇到某些列是字符串,某一些列是数值的情况,如果直接使用df_obj.apply(sum)往往会出错

使用如下方式即可对其中某一列进行求和

  1. dataf_test1['diff'].sum() // diff为要求和的列

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/helloword4217/article/details/88945745