Flask MongoDB數據庫導入Excel文件

1.使用uuid進行唯一編碼,寫入新文件

file_name = 'case_%s.xls'%(uuid.uuid4().hex)

2.如果文件路徑不存在,就創建。

    if not os.path.exists(path_store):
        os.makedirs(path_store)
    

3.打開並寫入文件

    with open(upload_path, 'wb+') as f2:
        content = f.read()
        f2.write(content)

這裏的upload_path指的是具體到文件名稱的文件路徑,f指前端傳入的文件

4.使用Python的xlrd庫讀取文件內容

 data = xlrd.open_workbook(upload_path)
    sheet = data.sheet_by_name("sheet1")

5.寫入前將每行數據提取

    for i in range(0, sheet.nrows):
        returnData = sheet.row_values(i)

6.有用到Python的集合,利用集合中沒有重複元素這一特性去重。

case_belong_set = set()#定義集合
case_belong_set.add(case_belong)#向集合中傳值
case_belong_list = list(case_belong_set)#集合轉列表
belong = ''.join(case_belong_list).encode('utf-8')#列表轉字符串

7.貼上全部代碼僅供參考寫法;

import xlrd
import os
from models import *
import re
import uuid
import cases_business

def data_check(f,version_name,path_store, username, admin_right):
    #將excel寫入新的文件
    file_name = 'case_%s.xls'%(uuid.uuid4().hex)
    upload_path = os.path.join(path_store, file_name)
    if not os.path.exists(path_store):
        os.makedirs(path_store)
    with open(upload_path, 'wb+') as f2:
        content = f.read()
        f2.write(content)

    data = xlrd.open_workbook(upload_path)
    sheet = data.sheet_by_name("sheet1")

    case_add_num = 0
    modify_name_num = 0
    modify_text_num = 0

    for i in range(0, sheet.nrows):
        returnData = sheet.row_values(i)
        module_path_id = returnData[0]
        name = returnData[1]
        text = returnData[2]
        model_id = returnData[3]
        case_belong = returnData[4]

        if "|" not in text:
            return False, u'第%s行用例內容格式錯誤!'%i, file_name

        try:
            model_id = int(model_id)
        except:
            return False,u'第%s行用例拓撲爲非數值類型'%i,file_name

        if "." not in module_path_id:
            return False, u'第%s行用例路徑未分級'%i, file_name

        if admin_right:
            pass
        else:
            case_belong_set = set()
            case_belong_set.add(case_belong)
            case_belong_list = list(case_belong_set)
            belong = ''.join(case_belong_list).encode('utf-8')
            print belong
            print username
            if len(case_belong_list) == 1:
                if belong == username:
                    pass
                else:
                    return False, u'該用例不屬於當前用戶,不允許修改他人用例!', file_name
            else:
                return False, u'不允許多人上傳!', file_name

        case_code_p = '\d+[A-Za-z\.\d-]+\d+'  # 用例編號正則表達式
        m = re.search(case_code_p, name)
        if m is None:
            return False, u'第%s行用例無法解析出用例編號!' % i, file_name
        else:
            case_code = m.group()
            case_code_list = []
            case_code_list.append(case_code)
            for i in case_code_list:
                case_obj = OneCaseScheam.objects(version_name=version_name, case_code=i).first()
                if case_obj is not None:
                    if i in case_obj.case_code:
                        if name == case_obj.name:
                            pass
                        else:
                            modify_name_num += 1
                        if text == case_obj.text:
                            pass
                        else:
                            modify_text_num += 1
                else:
                    case_add_num += 1
    print case_add_num, modify_name_num, modify_text_num
    msg = u'''
        有%s條用例新增
        '有%s條用例名稱被修改
        有%s條用例內容被修改
        ''' % (case_add_num, modify_name_num, modify_text_num)
    return True, msg, file_name

def data_import(excel_file_name,version_name):
    upload_path = os.path.join(os.getcwd(), 'case_app\static\upload',excel_file_name)
    data = xlrd.open_workbook(upload_path)
    sheet = data.sheet_by_name("sheet1")
    for i in range(sheet.nrows):
        returnData = sheet.row_values(i)
        module_path_id = returnData[0]
        name = returnData[1]
        text = returnData[2]
        model_id = returnData[3]
        case_belong = returnData[4]
        case_code_p = '\d+[A-Za-z\.\d-]+\d+'  # 用例編號正則表達式
        m = re.search(case_code_p, name)
        case_code = m.group()
        case_code_list = []
        case_code_list.append(case_code)
        for i in case_code_list:
            data_dict = {'version_name': version_name, 'case_text': text,
                         'module_path_id': module_path_id, 'case_name': name,
                         'topo_model_id': model_id, 'topo_model_name': None, 'topo_model_content': None}
            case_obj = OneCaseScheam.objects(version_name=version_name, case_code=i).first()
            if case_obj is not None:
                case_id = case_obj.id
                data_dict['case_id'] = case_id
                cases_business.modify_case_content(data_dict, role='test',belong=case_belong)
            else:
                cases_business.add_case(data_dict,role='test',belong=case_belong)
    return True,None,excel_file_name

if __name__ == '__main__':
    from mongoengine import *
    connect("T2_DB", host="mongodb://%s:%s" % ('192.168.84.230', 30000))

該代碼實現的功能是在自動化平臺上實現導入導出的後端代碼,其中有涉及到數據的檢查以及數據的校對(數據校對在導出時有用到)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章