水电表计算辅助程序

## 1.源码展示

"""

import os
from openpyxl.styles import PatternFill




"""
思路如下:
1、首先是读取相关的颜色值,并用map进行存储;key代表意思,value代表颜色的ARGB值
2、是将23、24、25的列数进行固定并进行存储
3、修改每个时间段已经标注的颜色进行更换
4、计算数据:应缴、实缴、欠缴的数据
"""

#创建一个数据类年定位
@dataclass(frozen=True)
class Point:
x:int
y:int


# 这里是需要定义几个常用颜色值,一般存储是RGB值
color_Map={}

##打开工作表
def open_WorkBook(path):
work=openpyxl.load_workbook(path)
return work

# 打开对应工作簿
def open_Sheet(work,sheetName):
sheet = work[sheetName]
return sheet

def valid_Len(sheet):
"""
这里是读取第5行的数据,来判断计算数据的填写位置
:param sheet: Excel表格的Sheet名称
:return: 每一行的长度值
"""
lie_len = 0 # 长度
valid_len = 0 # 宽度
for cell in sheet['A']:
if cell.value is not None:

lie_len += 1

for cell in sheet[5]:

if cell.value is not None and cell.value =="是否欠费":
valid_len=cell.column+1

p=Point(valid_len,lie_len)
print(p)
return p

def read_Color(sheet):
"""
通过读取第3行的颜色标准对其进行存储
:param sheet: Excel中sheet对象
:return:
"""
color_RGB=sheet['G1'].fill.start_color.rgb
# print("白色ARGB颜色值是:"+color_RGB+"类型是:"+str(type(color_RGB)))

row_3=sheet[3]
for cell in row_3:
if cell.fill.start_color.rgb != color_RGB and cell.fill.start_color.rgb is not None:
color_Map[cell.value]=cell.fill.start_color.rgb
print(color_Map)
"""
对某些列填充颜色不是白色的进行更换对应的颜色
还是一样的思路对第5行数据进行读取,然后进行判断,只要计算出24年1月的位置即可
:param sheet: 工作簿
:param color: 颜色值
:param point: 位置坐标
:return:
"""
def Change_Cell_Color(sheet,color,point):
sheet.cell(row=point.x,column=point.y).fill.start_color.rgb=color

def calCulate_Coordinates(sheet,keyWord):
"""
计算坐标
:param sheet: Excel表格的Sheet名称
:param keyWord: 需要查询的相关的关键字
:return: 每一行的长度值
"""
col=0
for cell in sheet[5]:
if cell.value == keyWord:
col=cell.column
p = Point(5, col)

return p

def padding_Color(sheet,color_early,interval,color_befor='FFFFC000'):
"""
该函数是用来进行填充不同年份的对应不同的颜色
:param sheet:
:param color_befor:
:param color_early:
:param interval:
:return:
"""
# 首先是进行填充颜色
fill_Color=PatternFill(patternType='solid',fgColor=color_early)
for col in sheet.iter_cols(min_col=interval["min_col"],max_col=interval["max_col"],
max_row=interval["max_row"],min_row=interval["min_row"]):
for cell in col:
if cell.fill.start_color.rgb == color_befor :
cell.fill =fill_Color



def iterRow_SUM(sheet,color_Map,interval):
"""
这里是一边计算每年应收数值,欠缴费用
:param sheet:
:param color_Map:
:param valid_Length:
:return:
"""
print("计算区域如下所示:")
print(interval)
for row in sheet.iter_rows(min_row=interval["min_row"],max_row=interval["max_row"],
min_col=interval["min_col"],max_col=interval["max_col"]):
# 应缴费用
row_sum_Due=0
# 实缴费用
row_Realiy_23=0
row_Realiy_24=0
row_Realiy_25=0

for cell in row:
# 这里是计算应缴的费用
if isinstance(cell.value,(int, float)):
row_sum_Due += cell.value
# 检查单元格填充是否为PatternFill类型且颜色匹配 这里是计算实缴的费用
if cell.fill.start_color.rgb == color_Map['23年已交']:
# 确包单元格内容是数值
if isinstance(cell.value,(int, float)):
row_Realiy_23+=cell.value
if cell.fill.start_color.rgb == color_Map['24年已交']:
# 确包单元格内容是数值
if isinstance(cell.value,(int, float)):
row_Realiy_24+=cell.value
if cell.fill.start_color.rgb == color_Map['25年已交']:
# 确包单元格内容是数值
if isinstance(cell.value,(int, float)):
row_Realiy_25+=cell.value
# print("{},{}".format(cell.row,interval["max_col"]))
# 这里就开始进行写入操作 写入应激的费用
writer_value(sheet,row=cell.row,col=interval["max_col"]+6,value=row_sum_Due)
writer_value(sheet,row=cell.row,col=interval["max_col"]+8,value=row_Realiy_23)
writer_value(sheet,row=cell.row,col=interval["max_col"]+9,value=row_Realiy_24)
writer_value(sheet,row=cell.row,col=interval["max_col"]+10,value=row_Realiy_25)


def writer_value(sheet, row, col,value):
"""
将对应的数值填入到对应位置
:param sheet: 写入的表格对象
:param row: 行数
:param col: 列数
:param value: 写入值
:return:
"""
sheet.cell(row=row,column=col,value=value)

def close_Excel(work,path,OutPutName):
#这里是需要将路径的最后的文件进行删除掉
path=os.path.dirname(path)
work.save(path+'/'+OutPutName+".xlsx")

# 主函数
if __name__ == '__main__':

# 首先是对文件路径进行输入
path=input("请输入文件路径及文件名:")
#开始打开文件
workBook=open_WorkBook(path)
# 打开对应的sheet
sheetName= input("请输入SheetName:")
sheet=open_Sheet(workBook,sheetName)
# 获取表格长度,以便于开始填写数据


sheet_len=valid_Len(sheet) # 44,130
# 读取颜色值
read_Color(sheet)
# 开始对表格进行每个年份进行填充颜色

# 首先是计算2024年的开始列数 p.y
p=calCulate_Coordinates(sheet,"24.1月")

#开始设置区间 ,并且进行填充
interval={}
interval['min_row']=p.x+1
interval['min_col']=p.y
interval['max_col']=p.y+11
interval['max_row']=sheet_len.y
padding_Color(sheet,color_Map['24年已交'],interval)
#开始对2025年进行填充
interval['min_col']=p.y+12

interval['max_col']=sheet_len.x-5
padding_Color(sheet,color_Map['25年已交'],interval)

# 然后开始是进行计算
# 开始是计算区域
interval['min_col']=14
iterRow_SUM(sheet,color_Map,interval)

excelName=input("请输入表格名称:")
close_Excel(workBook,path,excelName)

"""

 

posted @ 2025-07-08 10:14  什么都会有的  阅读(4)  评论(0)    收藏  举报