def workbook_finance(workbook, x, index, model, k): """ 电子表格,多张工作表写入数据库 workbook: workbook = xlrd.open_workbook(file_contents=file_excel.file.read()) x: 从x行开始 x=0,1,2... index: 工作表序号 model: 数据库 K: 数据库字段, 与Excel表格列对应 """ sheet = workbook.sheet_by_index(index) try: #1.1、电子表格转换为列表 mylist = [] for row_num in range(x, sheet.nrows): #从x行开始 x=0,1,2... row = sheet.row( row_num ) #row -- [empty:'', empty:'', text:'HZ-616S', number:10000.0] v = [] for r in row: #一次处理电子表格一行 v.append(r.value) mylist.append(v) #2.1、列表中清除空格行 和 以‘日期’开头的行;2、插入送货单位名称、经办人 mlist = [] name = '' for v in mylist: if any(v) and v[0] != '日期': #列表中清除空格行 和 以‘日期’开头的行 if isinstance(v[0], str): name = v[0] #获得送货单位名称;字符串开始行的第一个单元格值。 else: v.insert(1, name) #插入 送货单位名称 v.insert(8, '李小明') #插入 经办人 mlist.append(v) #3.1、列表数据,初始化成与数据库字段一样的数据类型;2、数据写入数据库 object_list = [] for v in mlist: v[0] = get_date(int(v[0])) #列表元素0,转换为时间格式 if not v[5] or isinstance(v[5], str): v[5] = 0 #列表元素5(对应数量),如果为空,转换为0 if not v[6] or isinstance(v[6], str): v[6] = 0 #列表元素6(对应单价),如果为空,转换为0 v[7] = round(float(v[5]) * float(v[6]), 2) #列表元素7(对应金额),金额 = 数量 * 单价 d = dict(zip(k, v)) object_list.append(model(**d)) model.objects.bulk_create(object_list, batch_size=20) return 'ok' except Exception as e: print(e) return 'err: %s. 错误工作表:%s' % (e, index + 1)
def excel_sheet_index_purchase(workbook, model, k, index_n): """Excel文件(单元格合并的电子表格同样适用),导入数据库 打开上传的Excel文件 file_excel = request.FILES.get(post_file_excel) workbook = xlrd.open_workbook(file_contents=file_excel.file.read()) 打开本地Excel文件 workbook = xlrd.open_workbook(filename='本地文件路径.xlsx') model: 数据库 K: 数据库字段, 与Excel表格列对应 index_n: 工作表序号 """ row_num = 0 ret = "ok" sheet = workbook.sheet_by_index(index_n) try: mylist = [] object_list = [] v7 = 0 for row_num in range( 1, sheet.nrows ): #sheet.nrows -- 电子表格总行数;row_num -- 从第1行开始读;电子表格默认从0行开始。 row = sheet.row( row_num ) #row -- [empty:'', empty:'', text:'HZ-616S(高)', number:10000.0, number:7.8, number:78000.0, empty:'', number:1794459.1, empty:'', empty:''] v = [] for (index, r) in enumerate(row): #一次处理电子表格一行 s = r.value if s: if isinstance(s, str): if row_num == 1 and index == 10: #电子表格第1行 v.append('结余') else: v.append(s.strip()) else: if index == 0: v.append(get_date(s)) #日期转换 43250 --> 2018-05-30 elif row_num == 1 and index == 10: #电子表格第1行 v.append('结余') else: v.append(str(Decimal(s).quantize( Decimal('0.00')))) #浮点数保留2位小数 else: if row_num == 1: #电子表格第1行 空 if index == 3 or index == 4 or index == 5 or index == 6 or index == 7: #index类似电子表格一行中的A1、B1、C1、D1 ... v.append(0) elif index == 0: v.append(get_date(61)) # 61 --> 1900-03-01 elif index == 10: v.append('结余') #电子表格第1行 备注空,则设定为结余 else: v.append('') else: if index == 0 or index == 1 or index == 9: #合并单元格 操作 v.append(mylist[row_num - 2][index]) else: if index == 2 or index == 8 or index == 10: v.append('') else: v.append(0) v[5] = round(float(v[4]) * float(v[3]), 2) #金额 = 单价 * 数量 if row_num != 1: #不是电子表格第1行 v[7] = round(v7 + v[5] - float(v[6]), 2) v7 = v[7] mylist.append(v) d = dict(zip(k, v)) object_list.append(model(**d)) model.objects.bulk_create(object_list, batch_size=20) except Exception as e: ret = 'err: %s。 工作表:%s; %s行: %s。' % (e, index_n + 1, row_num + 1, v) return ret
def workbook_model(workbook, x, index, model, k): """ 电子表格,多张工作表写入数据库 workbook: workbook = xlrd.open_workbook(file_contents=file_excel.file.read()) x: 从x行开始 x=0,1,2... index: 工作表序号 model: 数据库 K: 数据库字段, 与Excel表格列对应 结束循环条件: 最后两行相同 """ sheet = workbook.sheet_by_index(index) try: #1.1、电子表格转换为列表;2、最后两行相同结束循环 mylist = [] for row_num in range( x, sheet.nrows): #从x行开始 x=0,1,2... row_num=0,1,2,3,... row = sheet.row( row_num) #row -- [empty:'', empty:'', text:'HZ', number:10.0] v = [] for r in row: #一次处理电子表格一行 v.append(r.value) if not any(v) and row_num >= 2: #空行 v=['','','','','','',''] 结束循环 break mylist.append(v) #2.1、列表中去掉列表最后两个元素;2、插入客户名称、经办人 mlist = [] name = '' filename_no = '' #未被导入的工作表名 for (n, v) in enumerate(mylist): v1 = v[ 1:] #v ['名称','','','','','','',''] v1['','','','','','',''] if n == 0 and not any(v1): name = v[0] #获得名称 else: v.insert(1, name) #插入 名称 v.insert(8, '陈会计') #插入 经办人 if n >= 2: mlist.append(v) #3.1、列表数据,初始化成与数据库字段一样的数据类型;2、数据写入数据库 object_list = [] for (n, v) in enumerate(mlist): if isinstance(v[0], int) or isinstance(v[0], float): v[0] = get_date(int(v[0])) #列表元素0,转换为时间格式 else: v[0] = '1900-01-01' for r in range(4, 7): if not v[r] or isinstance(v[r], str): v[r] = 0 #数值单元格 列表元素,如果为空或为字符型,转换为0 else: v[r] = round(v[r], 2) v[6] = round(float(v[5]) * float(v[4]), 2) #金额 = 数量 * 单价 d = dict(zip(k, v)) object_list.append(model(**d)) if object_list: model.objects.bulk_create(object_list, batch_size=20) else: filename_no += '%s' % (index + 1) return filename_no except Exception as e: print(e) return 'err: %s. 错误工作表:%s' % (e, index + 1)
def workbook_cost(workbook, x, index, model, k): """ 电子表格,多张工作表写入数据库 workbook: workbook = xlrd.open_workbook(file_contents=file_excel.file.read()) x: 从x行开始 x=0,1,2... index: 工作表序号 model: 数据库 K: 数据库字段, 与Excel表格列对应 结束循环条件: 最后两行相同 """ sheet = workbook.sheet_by_index(index) try: #1.1、电子表格转换为列表;2、最后两行相同结束循环 mylist = [] for row_num in range(x, sheet.nrows): #从x行开始 x=0,1,2... row = sheet.row( row_num) #row -- [empty:'', empty:'', text:'HZ', number:10.0] v = [] for r in row: #一次处理电子表格一行 v.append(r.value) v.pop(9) #去掉列表的空列 mylist.append(v) if (len(mylist) > 3) and (mylist[-1] == mylist[-2]): #最后两行相同结束循环 break #2.1、列表中去掉列表最后两个元素;2、插入客户名称、经办人 mlist = [] name = '' filename_no = '' #未被导入的工作表名 for (n, v) in enumerate(mylist): #for (n,v) in enumerate(mylist[:-2]): #去掉列表最后两个元素??? v1 = v[ 2:] #v ['**','单位名称','','','','','','',''] v1['','','','','','',''] if n == 0 and not any(v1): name = v[1] #获得单位名称 else: v.insert(1, name) #插入 客户名称 v.insert(14, '陈会计') #插入 经办人 if n >= 4: mlist.append(v) #3.1、列表数据,初始化成与数据库字段一样的数据类型;2、数据写入数据库 object_list = [] v8, v13 = 0, 0 for (n, v) in enumerate(mlist): if isinstance(v[0], int) or isinstance(v[0], float): v[0] = get_date(int(v[0])) #列表元素0,转换为时间格式 else: v[0] = '1900-01-01' if isinstance(v[10], int) or isinstance(v[10], float): v[10] = get_date(int(v[10])) #列表元素0,转换为时间格式 else: v[10] = '1900-01-01' for r in range(4, 9): if not v[r] or isinstance(v[r], str): v[r] = 0 #数值单元格 列表元素,如果为空或为字符型,转换为0 else: v[r] = round(v[r], 2) for r in range(12, 14): if not v[r] or isinstance(v[r], str): v[r] = 0 #数值单元格 列表元素,如果为空或为字符型,转换为0 else: v[r] = round(v[r], 2) v[7] = round(float(v[5]) * float(v[6]), 2) #金额 = 收货数量 * 单价 if n > 0: v[8] = round((v8 + v[7] - v[4]), 2) #余额 = 余额_1 + 金额 - 付款 v[13] = v13 + v[7] - v[12] #欠票 = 欠票_1 + 金额 - 金额1 v8, v13 = v[8], v[13] d = dict(zip(k, v)) object_list.append(model(**d)) if object_list: model.objects.bulk_create(object_list, batch_size=20) else: filename_no += '%s' % (index + 1) return filename_no except Exception as e: print(e) return 'err: %s. 错误工作表:%s' % (e, index + 1)