Django-Excel導入導出

来源:https://www.cnblogs.com/missdx/archive/2020/07/28/13393373.html
-Advertisement-
Play Games

利用pandas模塊實現Excel與MySQL的互通 代碼實現 Excel數據導入MySQL(方式一) # 批量導入數據(速度快) def importdata(localpath: str, db: str, foreignkey): data = pandas.read_excel(localp ...


  • 利用pandas模塊實現Excel與MySQL的互通
  • 代碼實現
    • Excel數據導入MySQL(方式一)
# 批量導入數據(速度快)
def importdata(localpath: str, db: str, foreignkey):
    data = pandas.read_excel(localpath, dtype='str', keep_default_na=False)  # 讀取本地上傳的excel表內容, dtype='str'防止讀取001為1這種情況,keep_default_na=False是防止空值為NULL。
    verbosename = db._meta.fields  # 獲取被導入資料庫的欄位
    rows = data.shape[0]  # 獲取excel表的行數
    columns = data.shape[1]  # 獲取excel表的列數
    querysetlist = []  # 用於儲存數據
    eachdata = {}  # 用於儲存每一行數據
    # 外鍵需要添加_id,與資料庫中的欄位保持一致
    for i in range(len(verbosename)):
        if verbosename[i].name in foreignkey:  # 判斷是否為外鍵
            verbosename[i].name = verbosename[i].name + '_id'
    if len(verbosename) == columns:  # 必須保證二者長度一致,順序一致。
        for i in range(rows):
            for j in range(len(verbosename)):
                eachdata[verbosename[j].name] = data.iloc[i, j]  # 不會包括表頭
            querysetlist.append(db(**eachdata))
        try:
            db.objects.bulk_create(querysetlist)  # 批量導入數據
            msg = '數據導入成功,導入數據共計{}條'.format(rows)
        except Exception as e:
            print('報錯信息:{}'.format(e))
            msg = '數據導入失敗'
        return msg
    else:
        msg = '數據導入失敗!請檢查excel表。'
        return msg
    • Excel數據導入MySQL(方式二)
# 逐個導入數據(速度慢)
def importdata2(localpath: str, db: str, foreignkey):
    data = pandas.read_excel(localpath, dtype='str', keep_default_na=False)  # 讀取本地上傳的excel表內容, dtype='str'防止讀取001為1這種情況。
    verbosename = db._meta.fields  # 獲取被導入資料庫的欄位
    # for i in range(0, len(verbosename)):
    #     print(verbosename[i].name)
    rows = data.shape[0]  # 獲取excel表的行數
    columns = data.shape[1]  # 獲取excel表的列數
    eachdata = {}  # 用於儲存每一行數據
    # 外鍵需要添加_id,與資料庫中的欄位保持一致
    for i in range(len(verbosename)):
        if verbosename[i].name in foreignkey:  # 判斷是否為外鍵
            verbosename[i].name = verbosename[i].name + '_id'
    if len(verbosename) == columns:  # 必須保證二者長度一致,順序一致。
        for i in range(rows):
            for j in range(len(verbosename)):
                eachdata[verbosename[j].name] = data.iloc[i, j]  # 不會包括表頭
            try:
                db.objects.create(**eachdata)
                msg = '數據導入成功,共計{}條'.format(rows)
            except Exception as e:
                print('報錯信息:{}'.format(e))
                msg = '數據導入失敗'
            # return msg
    else:
        msg = '數據導入失敗!請檢查excel表。'
    return msg
    • 調用部分
def import_ceping(request):
    """導入測評人員"""
    foreignkey = ['department', 'rank_id', 'post_id']  # 記錄外鍵
    # 接收excel文件存儲到Media文件夾
    rev_file = request.FILES.get('excel')
    # 判斷是否有文件
    if not rev_file:
        return JsonResponse({'code': 0, 'msg': 'Excel文件不存在'})
    # 獲得一個唯一的名字:uuid+hash
    new_name = get_random_str()
    # 準備寫入的URL
    file_path = os.path.join(settings.MEDIA_ROOT, new_name + os.path.splitext(rev_file.name)[1])
    # 開始寫入磁碟
    try:
        f = open(file_path, 'wb')
        # 分多次寫入
        for i in rev_file.chunks():
            f.write(i)
        f.close()
    except Exception as e:
        return JsonResponse({'code': 0, 'msg': '寫入失敗,請聯繫管理員'})
    # 讀取存儲在Media文件夾的數據
    ex_data = importdata(file_path, Ceping, foreignkey)
    return JsonResponse({'code': 1, 'msg': ex_data})
    • MySQL數據導出Excel
#  導出數據
def exportdata(localpath, db):
    verbosename = db._meta.fields
    columnname = []  # 存儲欄位名
    for i in range(len(verbosename)):
        columnname.append(verbosename[i].name)
    info = db.objects.values_list()  # 查詢資料庫數據
    data = pandas.DataFrame(info)
    try:
        data.to_excel(localpath, na_rep='NULL', header=columnname, index=False)
        msg = '數據導出成功'
    except Exception as e:
        msg = '數據導出失敗'
    return msg

 

        


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #include <iostream> using namespace std; template<typename T> class Complex { public : Complex() { } Complex(T a, T b) { this->a = a; this->b = b; } v ...
  • 今天使用mybatis開發公司中台項目踩的一個坑,分享並記錄一下 踩坑前因:因項目中比較多狀態欄位,用了大量的Integer 0和1進行判斷 在功能做完後只是粗略的點了下覺得沒多大問題(來自程式員強大的自信),便提交了代碼,很不巧的是剛好領導在做功能測試,發現了功能缺陷,主角來了: 在做牧戶查詢時所 ...
  • 假如,明天你財務自由了,你會想去做些什麼? 最近,他二哥坐電梯發現身邊的程式員們,除了交流各種棘手的Bug之外,還會討論股市大盤漲了還是跌了,自己買的股票賺了還是虧了。生活不易,猿猿嘆氣,誰又沒有做過一夜暴富的美夢呢? 待到春來時,洗手作羹湯。 拋棄java C,只把歌來唱。 這樣美麗如畫的場景在他 ...
  • 學習ruby中記錄下的一些要點和感悟,隨緣更新 內容來自 《“笨方法”學ruby》、https://www.runoob.com/ ,此處僅做記錄 #Ruby 數組(Array) Ruby 數組是任何對象的有序整數索引集合。數組中的每個元素都與一個索引相關,並可通過索引進行獲取。 數組的索引從 0 ...
  • 內容簡介: 《Python自動化運維:技術與最佳實踐》一書在中國運維領域將有“劃時代”的重要意義:一方面,這是國內第一本從縱、深和實踐角度探討Python在運維領域應用的著作;一方面本書的作者是中國運維領域的“偶像級”人物,本書是他在天涯社區和騰訊近10年工作經驗的結晶。因為作者實戰經驗豐富,所以能 ...
  • Python是一種解釋型、面向對象、動態數據類型的程式設計語言,在游戲開發領域,Python也得到越來越廣泛的應用,並由此受到重視。 本書教授用Python開發精彩游戲所需的[]為重要的該你那。本書不只是介紹游戲編程概念的相關內容,還深入到複雜的主題。全書共14章,依次介紹了使用Pygame、文件I ...
  • 百度雲盤:Python 編程金典PDF高清完整版免費下載 提取碼:klcf 內容簡介 本書由全球著名的程式語言培訓專家精心編著,解釋瞭如何將Python用作常規用途,編寫多層、客戶機/伺服器結構、資料庫密集型、基於Internet和Web的應用程式。書中採用作者獨創的“活代碼”教學方式,層層揭示了P ...
  • 書籍作者:Mark Summerfield(馬克 . 薩默菲爾德)(英) 書籍譯者:閆鋒欣內容簡介:本書是一本闡述Qt高級編程技術的書籍。本書以工程實踐為主旨,是對Qt現有的700多個類和上百萬字參考文檔中部分關鍵技術深入、全面的講解和探討,如豐富的網路/桌面應用程式、多線程、富文本處理、圖形/視圖 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...