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
实现excel录入数据库
猜你喜欢
转载自blog.csdn.net/qq_27361945/article/details/83187716
今日推荐
周排行