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
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...