第一篇(從django後臺解析excel數據批量導入數據庫)

第一篇(從django後臺解析excel數據批量導入數據庫)

文章會在github中持續更新python

做者: knthonygit

githubgithub

聯繫我sql

1.django 如何從後臺上傳excel中批量解析數據

要從django後臺導入的excel中批量解析數據,舉一個例子,咱們向後擡批量導入svn歷史數據
數據格式
MacDown logo數據庫

假設excel表中有4列,每列分別是版本號,屬性,屬性值,倉庫地址django

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,方便咱們從後臺導入數據
接下來咱們建立後臺上傳文件的接口app

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

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_modespa

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 來提升效率。excel

總結,整個過程的難點在於獲取文件對象,從數據中取值而後在按key取出,這樣咱們就能夠從後臺上傳excel文件,而後進行批量導入數據庫,其餘數據格式只須要改utils和model中的數據字段就能夠

相關文章
相關標籤/搜索