继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

利用xlrd模块在Django项目中实现Excel文件导入

青春有我
关注TA
已关注
手记 1239
粉丝 205
获赞 1008

在项目接近尾声的时候,经常会需要将客户的一些数据资料导入到项目中进行测试或者实际使用,大量的数据当然不可能通过手动的方式输入,这个时候就需要将数据通过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
链接:https://www.jianshu.com/p/42ebbc8330f0


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP