当前位置: 首页 > 后端技术 > Python

django如何在后台从excel上传批量分析数据

时间:2023-03-26 18:26:10 Python

批量分析django后台导入的excel数据,我们以批量导入svn历史数据数据格式MacDown标识为例。假设excel表格有4列,每列分别是版本号,属性,属性值,仓库地址2.第一步新建app,然后新建model@python_2_unicode_compatibleclassKNSVNHistory(models.Model):revision=models.IntegerField(verbose_name=u"修订版本",blank=True,null=True)prop=models.CharField(verbose_name=u'SVNproperty',choices=constants.YD_SVN_PROP_CHOICE,max_length=60,default=constants.YD_SVN_PROP_DATE)value=models.TextField(verbose_name=u"SVN属性值",blank=False,null=False,default=u"")repo=models.CharField(max_length=100,verbose_name=u"SVN存储库",blank=False,null=False)editor=models.ForeignKey(User,verbose_name=u"editor",blank=True,null=True)ctime=models.DateTimeField(verbose_name=u"创建时间",auto_now_add=True,)mtime=models.DateTimeField(verbose_name=u"修改时间",auto_now=True,)classMeta:ordering=['ctime']def__str__(self):returnself.value作为上面的代码,我创建了一个保存数据的模型,方便我们从后台导入数据。接下来我们创建后台上传文件的接口@python_2_unicode_compatibleclassImportFile(models.Model):file=models.FileField(upload_to='File')name=models.CharField(max_length=50,verbose_name=u'文件名')classMeta:ordering=['name']def__str__(self):returnself.name下面就是我们解析excle的功能部分,在app下新建一个utils.py文件fromopenpyxlimportWorkbook,load_workbookfromopenpyxl.utilsimportget_column_letterfrom.modelsimportKNSVNHistoryfromopenpyxl.compatimportrangedefimport_user(self,请求、对象、更改):wb=load_workbook(filename=obj.YDUserFile.path)ws=wb.get_sheet_names()ws=wb.get_sheet_by_name(ws[0])headers=['version','attr','value','addr']lists=[]users=request.userforrowinrange(2,5):r={}forcolinrange(1,len(headers)+1):key=headers[col-1]r[key]=ws.cell(row=row,column=col).valuelists.append(r)sqllist=[]forcellinlists:#forheaderinheaders:revision=cell['version']prop=cell['attr']value=cell['value']repo=cell['addr']sql=KNSVNHistory(revision=revision,prop=prop,value=value,repo=repo,editor=users)sqllist.append(sql)KNSVNHistory.objects.bulk_create(sqllist)打开admin.py因为我们要在后台保存,所以我们需要重写ModelAdmin的save_modefrom.utilsimportimport_userclassKNImportFileAdmin(admin.ModelAdmin):list_display=('file','name',)list_filter=['name',]defsave_model(self,request,obj,form,change):re=super(YDImportFileAdmin,self).save_model(request,obj,form,change)import_user(self,request,obj,change)returnre上面代码中使用第三方库openpyxl解析excel的key重点是获取文件对象,我们通过传入的obj对象获取fileobj。其实一般情况下,我们点击上传的时候,重写的save_mode方法会拦截整个对象。这里我们取出我们要解析的excel文件对象进行解析,后面的解析过程也比较简单,我们解析后通过字典保存每一行数据,然后通过key访问获取进行数据库操作,我们使用KNSVNHistory.objects.bulk_create以提高数据库操作期间的效率。总结一下,整个过程的难点就是获取文件对象,从数据中获取值然后按键取出来,这样我们就可以从后台上传excel文件,然后导入到分批处理数据库。其他数据格式只需要改utils和model中的数据如果想交流其他python和django问题可以关注我公众号