实现excel录入数据库

import xlrd

from dbbackend.models import ZJcell, LngLat, ZJenb


class Cellinforeader:
    """读取excel的类"""

    def __init__(self, path=r'C:\Users\Administrator\Desktop\嘉兴工参\圈定区域网内邻区关系(1).xlsx', sheetname='圈定小区'):
        try:
            self.workbook = xlrd.open_workbook(path)
            self.sheet = self.workbook.sheet_by_name(sheetname)
        except Exception:
            print(Exception)
        # 列名与列号字典,例如{'小区名称':2}
        self.col_dict = {}
        # sheet.ncols:  Nominal number of columns in sheet.
        for i in range(self.sheet.ncols):
            self.col_dict[self.alltypestrip(self.sheet.cell_value(0, i))] = i
            # ' abc '.strip()去除字符串前后的空格

    # 提取每行数据,导入小区数据库ZJcell中
    def insertcells(self, cgi='CGI', cellname='小区名称', freq='频段', pci='PCID', lng='基站经度', lat='基站纬度',
                    azimuth='扇区方位角', enbname='基站名称', enbid='LTEENODEBID'):
        insertcount = 0
        for i in range(1, self.sheet.nrows):
            row = self.sheet.row_values(i)
            # 下面啰嗦了这么多行,无非是要实现两个功能,一是根据列名寻找数据,避免根据列的位置寻找数据时格式不能改
            # 二是利用strip函数将字符串前后的空格删除,避免基站名后面带空格的情况,这里利用的小技巧有:
            # 1、把列名和列号做成dict,这样就可直接通过列名取列号,比循环查找函数省时间
            # 2、alltypestrip()函数利用了python三目运算
            # 3、因为变量名重复,所以在结果的变量名前加下划线 _ ,加以区分
            # 4、这么多重复的写法,看似可以使用循环来解决,但那样反而复杂,不如使用相同的格式列出来,以后看着清晰,
            #    相当于配置的赋值都应该这样写
            _enbname = self.alltypestrip(row[self.col_dict[enbname]])
            _enbid = self.alltypestrip(row[self.col_dict[enbid]])
            _lng = self.alltypestrip(row[self.col_dict[lng]])
            _lat = self.alltypestrip(row[self.col_dict[lat]])
            _cgi = self.alltypestrip(row[self.col_dict[cgi]])
            _cellname = self.alltypestrip(row[self.col_dict[cellname]])
            _freq = self.alltypestrip(row[self.col_dict[freq]])
            _pci = self.alltypestrip(row[self.col_dict[pci]])
            _azimuth = self.alltypestrip(row[self.col_dict[azimuth]])

            enb, createdornot = ZJenb.objects.get_or_create(enbname=_enbname, enbid=_enbid)
            lnglat, createdornot1 = LngLat.objects.get_or_create(lng=_lng, lat=_lat)
            cell, createdornot2 = ZJcell.objects.get_or_create(cgi=_cgi, cellname=_cellname, freq=_freq, pci=_pci,
                                                               azimuth=_azimuth, lnglat=lnglat, enb=enb)
            # ' abc '.strip()去除字符串前后的空格

            # get_or_create函数返回元组的第二个数据表示是否新创建了一条数据
            if createdornot2:
                insertcount += 1
        print("导入" + str(insertcount) + "条数据")

    # 对enbid 'float' object使用strip函数时报错,所以增加这个函数,使用strip前判断一下是不是str类型。
    def alltypestrip(self, args):
        return args.strip() if type(args) is str else args

猜你喜欢

转载自blog.csdn.net/qq_27361945/article/details/83187716