摘要:總結整個過程的難點在于獲取文件對象,從數據中取值然后在按取出,這樣我們就可以從后臺上傳文件,然后進行批量導入數據庫,其他數據格式只需要改和中的數據字段就可以
第一篇(從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中的數據字段就可以
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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...
閱讀 3554·2021-11-08 13:15
閱讀 2111·2019-08-30 14:20
閱讀 1394·2019-08-28 18:08
閱讀 985·2019-08-28 17:51
閱讀 1490·2019-08-26 18:26
閱讀 2994·2019-08-26 13:56
閱讀 1491·2019-08-26 11:46
閱讀 2592·2019-08-23 14:22