利用 python将 Excel 统计完的材料数量填入桥梁工程数量表中(填入的是公式)
全桥桥梁材料数量 计算完后,需要填入相应表格中,原来我都是手输入 = 后面表格的内容,这个过程无聊、机械、费眼、还容易出错,现在我终于编辑了一个能自动填公式的python程序。
统计完的材料数量表为:
修改后的 桥梁数量表为:

代码为:
1 # 公式 =INDEX(下部结构!$F:$F,MATCH("桥台盖梁 C40",下部结构!$H:$H,0)) 2 # 下部结构!$F:$F---数量所在列号--- 6 3 # 下部结构!$H:$H---部位材料需查找项目所在的列号 --- 8 4 # "桥台盖梁 C40"---部位+材料---需要查找的内容 5 from openpyxl import Workbook,load_workbook 6 import random 7 # row---行 column---列 8 f_name = ('./000 数量表.xlsx') # 文件名 9 sh1 = ('下部结构') # 统计完材料和数量的 sheet 10 mat_num1 = 8 # 部位材料所在的列号数字 11 mat_st1 = "H" # 部位材料所在的列号 12 13 num_st1 = "F" # 部位材料所在的列号 14 row_max1 = 58 # 数量的最大行号 15 16 sh2 = ('工程数量表') # 工程数量表所在的 sheet 17 par_num2 = 3 # 部位材料所在的行号 18 par_max2 = 23 # 部位所在的最大列号 19 mat_max2 =24 # 材料所在的最大行号 20 21 22 wb = load_workbook(f_name) # 23 24 # 第1步读取统计完工程数量的《下部结构》sheet 文件中的 25 # 部位材料---mat_list 、 26 # 获取材料的内容 row---行 column---列 27 # 内容必须是文字,不能是公式 28 29 ws = wb[sh1] # 30 31 mat_lis = [] # 定义材料列表---sheet1中的 32 # 修改列号、行号范围 33 for i in ws.iter_rows(min_col=mat_num1,max_col=mat_num1, 34 min_row=2,max_row=row_max1): 35 for j in i: 36 # print(j.value) 37 if j.value is not None: 38 mat_lis.append(j.value) 39 # print(mat_lis) 40 41 # 第3步 读取 《下部数量表》中 部位---parts_list 42 # 部位 par在 parts_list 中的索引位置+1 即为列号 43 # row---行 column---列 44 ws2 = wb[sh2] 45 46 parts_lis = [] # 定义部位列表---sheet2中的 47 # 修改列号、行号范围 48 for i in ws2.iter_rows(min_col=1,max_col=par_max2, 49 min_row=par_num2,max_row=par_num2): 50 for j in i: 51 if j not in parts_lis: 52 parts_lis.append(j.value) 53 54 # 第4补 读取 《下部数量表》中 列---材料---mat_list 55 # 材料 mat在 mat_list 中的索引位置+1 即为行号 56 # row---行 column---列 57 mat_lis2 = [] # 定义材料列表---sheet2中的 58 # 修改列号、行号范围 59 for i in ws2.iter_rows(min_col=1,max_col=1, 60 min_row=1,max_row=mat_max2): 61 for j in i: 62 if j.value not in mat_lis: 63 mat_lis2.append(j.value) 64 # print(mat_lis2) 65 # 第5步 循环查找坐标 66 # parts是否在 parts_list中 67 # 如果在,就返回 parts的行号---x 68 # mat是否在 mat_list中 69 # 如果在,就返回 mat的列号---y 70 # x + y 即为坐标 71 # 用 for 语句 循环,用 try 试错 72 73 for i in range(0,len(mat_lis)): 74 par = mat_lis[i].split() [0] # 部位 75 mat = mat_lis[i].split() [1] # 材料 76 77 try: 78 par in parts_lis 79 mat in mat_lis2 80 x = (parts_lis.index (par) + 1) 81 y = (mat_lis2.index (mat) + 1) 82 ws2.cell(y,x).value = (r'=INDEX(%s!$%s:$%s,MATCH("%s",%s!$%s:$%s,0))' % 83 (sh1,num_st1,num_st1,mat_lis[i],sh1,mat_st1,mat_st1)) 84 # =INDEX(下部结构!$F:$F,MATCH("桥台盖梁 C40",下部结构!$H:$H,0)) 85 except ValueError as reason: 86 print('%s 不存在!!!' % mat_lis[i]) 87 88 # 第7步 保存 Excel 89 wb.save(f_name) 90 # 最后关闭文件 91 wb.close()
程序运行后的结果; 将公式填入的相应的表格中。


浙公网安备 33010602011771号