表格数据读取为字典/写入指定位置数据

##测试数据 表格数据转化为字典提供测试脚本使用,

import sys,os
from openpyxl import load_workbook
add_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(add_path)


path = os.path.dirname(__file__)
print(path)

data_path = path + '/baidu_data.xlsx'
sheet_name = 'login'

#打开表格
wb = load_workbook(data_path)
#读取表格的sheet_name
sheet_obj = wb[sheet_name]

#获取表格每行的数据
list_h = list(sheet_obj.rows)
#获取表格第一行的数据,也就是表头的数据
list_h1 = list_h[0]
#因为表格内字典已caseName再次封装区分行数据,先获取caseName所在列
w = 0
for i in range(len(list_h1)):
    if list_h1[i].value == 'caseName':
        w = i
        print(w)
# 封装表格字典
xlsl_dict = {}
for j in list(sheet_obj.rows)[1:]:  # 遍历表格每行数据,但是不遍历第一行表头数据
    case_name = j[w].value  # 现获取第j行表格数据 的casename值,再次封装字典使用
    case_dict = {}  # 以casename值 为区分再次封装字典塞入整个表格字典
    for k in range(len(list_h1)):  # 遍历每列字段
        data_value = j[k].value
        if type(data_value) == str:#表格内数据可为字典,读取为字典,自点击换行处理
            if '{' in j[k].value or '}' in j[k].value:
                data_value = j[k].value.replace('\n','')
                data_value = json.loads(data_value)

        case_dict[list_h1[k].value] = data_value  # case_dict内 key取值表头的列的值,value取值j行k列的值
    xlsl_dict[case_name] = case_dict  # 将遍历好的case_dict字典塞入整体xlsl_dict
print('当前表格字典为',xlsl_dict)
wb.close()#关闭表格

  

根据需求写入指定位置数据,单个数据写入

import sys,os
from openpyxl import load_workbook
add_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(add_path)


path = os.path.dirname(__file__)
print(path)

data_path = path + '/baidu_data.xlsx'
sheet_name = 'login'

#打开表格
wb = load_workbook(data_path)
#读取表格的sheet_name
sheet_obj = wb[sheet_name]

#获取表格每行的数据
list_h = list(sheet_obj.rows)
#获取表格第一行的数据,也就是表头的数据
list_h1 = list_h[0]
w_text = 'stute'#测试结果状态表头
h_text = 'test_signin_password_error'#测试标题字段

#获取caseame列宽
case_name_w = 0
for i in range(len(list_h1)):
    if list_h1[i].value == 'caseName':
        case_name_w = i
        print(case_name_w)

#根据列宽,已知测试标题,求出stute状态写入宽度
w = 0#列宽
for i in range(len(list_h1)):
    if list_h1[i].value == w_text:
        w = i+1#i为列表下标,实际需要+1
        break

#根据case_name求出行高
xxx = list(sheet_obj.rows)
h = 0#行高
for j in range(len(xxx)):
    print(xxx[j][case_name_w].value)
    if xxx[j][case_name_w].value==h_text:
        h = j+1#j为列表下标,实际需要+1

print('行高为%d' %h)
print('宽为%d' %w)
sheet_obj.cell(row = h,column = w,value = 'TEST')#写入数据
wb.save('baidu_data.xlsx')#保存,写入不保存则不生效
ce = sheet_obj.cell(row = h,column = w)#读取写入表格位置数据
print(ce.value)

  

字典写入表格

def input_xlsx_dict(data_path,sheet_name,input_data):
    '''

    :param data_path: 表格路径
    :param sheet_name: sheet页名称
    :param input_data: 写入数据,这里的写入数据是字典
    :return:
    '''
    # 打开表格
    wb = load_workbook(data_path)
    # 读取表格的sheet_name
    sheet_obj = wb[sheet_name]
    for key in input_data.keys():
        # 获取表格每行的数据
        stute_text = 'testResult'
        w,h = return_table_coordinates(sheet_obj,stute_text,key)
        print(w, h)
        stute = input_data[key]['testResult']
        sheet_obj.cell(row=h, column=w, value=stute)  # 写入数据

        data_test = 'testTime'
        w2, h2 = return_table_coordinates(sheet_obj, data_test,key)
        test_data = input_data[key]['testTime']
        print(w2,h2)
        sheet_obj.cell(row=h2, column=w2, value=test_data)  # 写入数据
        wb.save(data_path)  # 保存,写入不保存则不生效
        # ce = sheet_obj.cell(row=h, column=w)  # 读取写入表格位置数据
        # print(ce.value)



def return_table_coordinates(sheet_obj,x_coordinate,y_coordinate):
    # 根据列宽,已知测试标题,求出stute状态写入宽度
    '''
    :param sheet_obj: xlsx sheet页读取数据
    :param x_coordinate: x轴名称
    :param y_coordinate: y轴名称
    :return:
    '''
    number_lines = list(sheet_obj.rows)
    # 获取表格第一行的数据,也就是表头的数据
    number_lines_1 = number_lines[0]
    # 获取caseame列宽
    case_name_w = 0
    for i in range(len(number_lines_1)):
        if number_lines_1[i].value == 'caseName':
            case_name_w = i
            print(case_name_w)
            break
    x = 0  # 列宽
    for i in range(len(number_lines_1)):
        if number_lines_1[i].value == x_coordinate:
            x = i + 1  # i为列表下标,实际需要+1
            break

    # 根据case_name求出行高
    y = 0  # 行高
    for j in range(len(number_lines)):
        if number_lines[j][case_name_w].value == y_coordinate:
            y = j + 1  # j为列表下标,实际需要+1
    print('当前坐标%s%s' %(str(x),str(y)))
    return x,y

  

表格数据修改及删除操作

import openpyxl

old_data = {
    1:{'id':'RT891ES-E21530-3',
        'price': '995.84'
        },
    2:{'id':'RT891ES-E13869',
       'price':'51111.31'
},
3:{'id':'9',
       'price':'542.31'
}
}


xlsx_path = r'E:\ROBOT\pending.xlsx'
wp = load_workbook(xlsx_path)#读取表格
ws = wp.get_sheet_names()[0]#获取表格所有sheet
wb = wp.get_sheet_by_name('0')#获取表格sheet名称为0的页


list_w = list(wb.rows)#获取行数
#获取表格第一行的数据,也就是表头的数据
list_h1 = list_w[0]#获取第一行的数据
for i in range(len(list_h1)):#遍历第一行的数据,取出指定字段坐标
    print(list_h1[i].value)
    if 'Seller SKU' == list_h1[i].value:
        hhh = i
    elif 'Campaign Price' == list_h1[i].value:
        price_h = i
#
#遍历列数据,指定列数据校验
list_sh = list(wb.columns)
#获取表格第一行的数据,也就是表头的数据
list_h2 = list_sh[hhh]
dedal = 0#处理数据列坐标,删除操作会让后续数据前移
for i in range(2,len(list_h2)):
    h_value = list_h2[i].value
    print('当前单单元格值为%s' %h_value)
    d_h = i - dedal + 1
    for key in old_data.values():
        if key['id'] == str(h_value):
            print('改价格')
            g_h = d_h
            g_w = price_h + 1
            wb.cell(row=g_h, column=g_w,value=key['price'])
            break

    else:
        wb.delete_rows(d_h)
        dedal += 1
        print('删除')
wp.save(xlsx_path)

  

posted @ 2022-03-02 17:46  究极不吃香菜  阅读(143)  评论(0编辑  收藏  举报