Esempio n. 1
0
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)