django 如何从后台上传excel中批量解析数据

要从django后台导入的excel中批量解析数据,举一个例子,咱们向后抬批量导入svn历史数据
数据格式
MacDown logopython

假设excel表中有4列,每列分别是版本号,属性,属性值,仓库地址sql

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,方便咱们从后台导入数据
接下来咱们建立后台上传文件的接口django

@python_2_unicode_compatible
class ImportFile(models.Model):app

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文件svn

from openpyxl import Workbook,load_workbook
from openpyxl.utils import get_column_letter
from .models import KNSVNHistory
from openpyxl.compat import rangespa

def import_user(self, request, obj, change):excel

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_modecode

from .utils import import_user
class KNImportFileAdmin(admin.ModelAdmin):orm

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中的数据字段就能够

若是想交流其它python和django的问题可关注本人公众号
qrcode_for_gh_cd4a7c861a9a_258.jpg

相关文章
相关标签/搜索