利用xlrd模組在Django專案中實現Excel檔案匯入

wyfem發表於2021-09-09

在專案接近尾聲的時候,經常會需要將客戶的一些資料資料匯入到專案中進行測試或者實際使用,大量的資料當然不可能透過手動的方式輸入,這個時候就需要將資料透過Excel檔案匯入到專案中。具體實現方式如下:

1.引入xlrd模組
import xlrd
2.從前端獲取Excel檔案資料物件
excel_file = request.FILES.get('excel_file','')
3.讀取Excel檔案資料物件

常用的Excel檔案有  .xlsx  和  .xls兩種,.xls檔案讀取時需要設定formatting_info=True

data = xlrd.open_workbook(filename=None, file_contents=excel_file.read())  # xlsx檔案data = xlrd.open_workbook(filename=None, file_contents=excel_file.read(), formatting_info=True)   # xls檔案
4.獲取Excel中每張表(sheets)的資料內容

get_sheets_mg()  # 獲取表中每一行的資料

def get_sheets_mg(data, num):      # data:Excel資料物件,num要讀取的表
    table = data.sheets()[num]  # 開啟第一張表
    nrows = table.nrows  # 獲取表的行數
    ncole = table.ncols  # 獲取列數
    all_list = []    for i in range(nrows):  # 迴圈逐行列印
        one_list = []        for j in range(ncole):
            cell_value = table.row_values(i)[j]            if (cell_value is None or cell_value == ''):
                cell_value = (get_merged_cells_value(table, i, j))
            one_list.append(cell_value)
        all_list.append(one_list)    del (all_list[0])  # 刪除標題   如果Excel檔案中第一行是標題可刪除掉,如果沒有就不需要這行程式碼
    return all_list

僅僅獲取Excel表中的每一行資料是滿足不了實際需求的,因為Excel中經常會有合併單元格的情況出現,因此還要處理合併單元格情況的函式。
get_merged_cells()  # 獲取所有合併的單元格資訊   sheet.merged_cells

def get_merged_cells(sheet):
    """
    獲取所有的合併單元格,格式如下:
    [(4, 5, 2, 4), (5, 6, 2, 4), (1, 4, 3, 4)]
    (4, 5, 2, 4) 的含義為:行 從下標4開始,到下標5(不包含)  列 從下標2開始,到下標4(不包含),為合併單元格
    :param sheet:
    :return:
    """
    return sheet.merged_cells

get_merged_cells_value() # 獲取被合併單元格中的資訊

def get_merged_cells_value(sheet, row_index, col_index):
    """
    先判斷給定的單元格,是否屬於合併單元格;
    如果是合併單元格,就返回合併單元格的內容
    :return:
    """
    merged = get_merged_cells(sheet)    # print(merged,"==hebing==")
    for (rlow, rhigh, clow, chigh) in merged:        if (row_index >= rlow and row_index < rhigh):            if (col_index >= clow and col_index < chigh):
                cell_value = sheet.cell_value(rlow, clow)                # print('該單元格[%d,%d]屬於合併單元格,值為[%s]' % (row_index, col_index, cell_value))
                return cell_value                break
    return None
5.將獲取的資料迴圈匯入資料庫中
all_list_1 = get_sheets_mg(data, 0)
i = 0while i < len(all_list_1):
      ....  # 儲存省略
     i++



作者:零_WYF
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2894/viewspace-2819448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章