首页 > 编程语言 >利用 python将 Excel 统计完的材料数量填入桥梁工程数量表中(填入的是公式)

利用 python将 Excel 统计完的材料数量填入桥梁工程数量表中(填入的是公式)

时间:2022-11-21 19:44:58浏览次数:45  
标签:mat 填入 python 材料 Excel --- parts lis row

全桥桥梁材料数量 计算完后,需要填入相应表格中,原来我都是手输入 = 后面表格的内容,这个过程无聊、机械、费眼、还容易出错,现在我终于编辑了一个能自动填公式的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()  

程序运行后的结果;  将公式填入的相应的表格中。

 

标签:mat,填入,python,材料,Excel,---,parts,lis,row
From: https://www.cnblogs.com/windsboy963/p/16912964.html

相关文章