• django后台导入excel文件


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

    要从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
    因为我们要在后台保存,所以我们需要重写ModelAdminsave_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 来提高效率。

  • 相关阅读:
    Hidden、ViewState、ControlState 区别
    使用 CSS3 中的伪类渲染表格
    IIS与Apache
    好奇怪的问题~
    博客可长可短-UnobtrusiveValidationMode的理解
    一路走来,一些感触,一些想法
    网页中一次导出多张Excel的问题
    [Leetcode][Python]56: Merge Intervals
    [Leetcode][Python]55: Jump Game
    [Leetcode][Python]54: Spiral Matrix
  • 原文地址:https://www.cnblogs.com/onemorepoint/p/7760213.html
Copyright © 2020-2023  润新知