摘要:总结整个过程的难点在于获取文件对象,从数据中取值然后在按取出,这样我们就可以从后台上传文件,然后进行批量导入数据库,其他数据格式只需要改和中的数据字段就可以
第一篇(从django后台解析excel数据批量导入数据库)
文章会在github中持续更新
1.django 如何从后台上传excel中批量解析数据作者: knthony
github
联系我
要从django后台导入的excel中批量解析数据,举一个例子,我们向后抬批量导入svn历史数据
数据格式
假设excel表中有4列,每列分别是版本号,属性,属性值,仓库地址
2.第一步,新建一个app,然后在app中新建model@python_2_unicode_compatible class KNSVNHistory(models.Model): revision = models.IntegerField(verbose_name=u"修订版本", blank=True, null=True) prop = models.CharField(verbose_name=u"SVN属性", 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"编辑者", blank=True, null=True) ctime = models.DateTimeField(verbose_name=u"创建时间", auto_now_add=True, ) mtime = models.DateTimeField(verbose_name=u"修改时间", auto_now=True, ) class Meta: ordering = ["ctime"] def __str__(self): return self.value
如上代码,我自己创建了用来保存数据的model,方便我们从后台导入数据
接下来我们创建后台上传文件的接口
@python_2_unicode_compatible class ImportFile(models.Model): file = models.FileField(upload_to="File") name = models.CharField(max_length=50, verbose_name=u"文件名") class Meta: ordering = ["name"] def __str__(self): return self.name
下面就是我们解析excle的功能部分,在app下新建一个utils.py文件
from openpyxl import Workbook,load_workbook from openpyxl.utils import get_column_letter from .models import KNSVNHistory from openpyxl.compat import range def import_user(self, request, obj, change): 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.user for row in range(2, 5): r = {} for col in range(1, len(headers) + 1): key = headers[col - 1] r[key] = ws.cell(row=row, column=col).value lists.append(r) sqllist = [] for cell in lists: # for header in headers: 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_mode
from .utils import import_user class KNImportFileAdmin(admin.ModelAdmin): list_display = ("file","name",) list_filter = ["name",] def save_model(self, request, obj, form, change): re = super(YDImportFileAdmin,self).save_model(request, obj, form, change) import_user(self, request, obj, change) return re
在上面的代码中使用了第三方库openpyxl来解析excel
关键点在于获取文件对象的时候,我们是通过传过来的obj对象来获取fileobj,其实通俗来讲就是在我们点击上传的时候,重写的save_mode方法拦截了整个对象,我们在这里拿出我们要解析的excel文件对象进行解析,后面的解析过程也比较简单,我们将每行数据解析之后通过字典来保存,然后再用key访问取到进行数据库操作,在数据库操作的时候我们使用KNSVNHistory.objects.bulk_create 来提高效率。
总结,整个过程的难点在于获取文件对象,从数据中取值然后在按key取出,这样我们就可以从后台上传excel文件,然后进行批量导入数据库,其他数据格式只需要改utils和model中的数据字段就可以
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/38228.html
摘要:后台批量导入数据在生产环境中,往往数据不是几条或者几百条,那么举个例子,将公司所有员工员工号或者帐号密码导入进后台,那就不建议你去后台一条条记录去添加了如何从中批量导入记录第一步为数据建立模型修订版本作者修订时间注释消息影响的文件创建时间修 django后台批量导入数据 在生产环境中,往往数据不是几条或者几百条,那么举个例子,将公司所有员工员工号或者帐号密码导入进后台,那就不建议你去后...
摘要:批量导入数据库思想之一页面上传表格后台解析表格的数据暂放数据结构中或自己看情况处理,再把里面的数据批量存入数据库。 批量导入数据库思想之一:页面上传excel表格后台解析excel表格的数据暂放数据结构中(list或Map,自己看情况处理),再把list里面的数据批量存入数据库。直接贴代码: 前端: 文件描述: ...
摘要:并且在对的抽象中,每一行,每一个单元格都是一个对象。对支持使用官方例子需要继承,覆盖方法,每读取到一个单元格的数据则会回调次方法。概要Java对Excel的操作一般都是用POI,但是数据量大的话可能会导致频繁的FGC或OOM,这篇文章跟大家说下如果避免踩POI的坑,以及分别对于xls和xlsx文件怎么优化大批量数据的导入和导出。一次线上问题这是一次线上的问题,因为一个大数据量的Excel导出...
此篇文章关键阐述了Django提交wps表格格并将它们载入数据库系统,将文件传送到网络服务器特定途径,其实不是很难,文中分三个环节来给大家详解,需要的小伙伴可以参考一下 导言: 近期上级领导要统计技术单位在多个业务线投入的工时百分数,而jira现阶段的Tempo软件只有统计分析本人工时。于是便写了个报表软件,将jira中导出来本人的工时wps表格格导入数据库,在后面解决每个业务流程工时占有...
摘要:然后封面就一个一个下啦是不是很方便具体源代码在上有用的话记得星星 有时候会有这样的需求吧 有一个表格里面有一批数据需要批量生成封面我们在浏览器里可以批量生成比如 showImg(https://segmentfault.com/img/bV67kB?w=2308&h=996); 我们有这样一个表格需要生成图书封面 showImg(https://segmentfault.com/img...
阅读 3495·2021-11-08 13:15
阅读 2069·2019-08-30 14:20
阅读 1329·2019-08-28 18:08
阅读 949·2019-08-28 17:51
阅读 1447·2019-08-26 18:26
阅读 2956·2019-08-26 13:56
阅读 1440·2019-08-26 11:46
阅读 2557·2019-08-23 14:22