xlrd读取excel时,解决int、float变float问题

1、导入需要的包

import xlrd
import datetime

2、编写一个用于导入excel文件的装饰器

# A decoration: import excel file
def import_excel_file(fn):
    @functools.wraps(fn)
    def wrapper(request, *args, **kwargs):
        # 检查导入的文件请求是否合法,文件是否能收到
        try:
            excel = request.FILES['excel']
        except MultiValueDictKeyError:
            return render(request, '400.html', {
                'err': '数据导入出错:没有发现需要的导入的文件,请选择导入的文件,再试一下!',
                'back_url': request.session.get('back_url')
            })
        except AttributeError:
            return render(request, '400.html', {
                'err': '数据导入出错:request没有excel参数,请联系管理员!',
                'back_url': request.session.get('back_url')
            })
        except KeyError:
            return render(request, '400.html', {
                'err': '数据导入出错:request没有excel参数,请联系管理员!',
                'back_url': request.session.get('back_url')
            })

        # 验证导入的文件是否为合法的表格文件
        try:
            validate_excel(excel)
        except ValidationError:
            return render(request, '400.html', {
                'err': '导入excel数据出错:导入的文件< %s >格式不对,请确保文件后缀是xls、xlsx 或csv!' % excel.name,
                'back_url': request.session.get('back_url')
            })
        else:
            data = xlrd.open_workbook(filename=None, file_contents=excel.read())
            table = data.sheets()[0]
            n_rows = table.nrows

            return fn(request, *args, **kwargs, table=table, n_rows=n_rows)

    return wrapper

3、编写一个转换单元格数据格式的工具函数

# A function tool: convert the type of cell while reading dates from import excel file
# Parameter: cell object which will be converted
# Return: right data type for python
def convert_cell_type_from_import_excel(_cell):
    # 单元格的ctype属性为0时,对应的python格式为空字符串:''
    if _cell.ctype == 0:
        return ''

    # 单元格的ctype属性为2时,对应的python格式为float和int
    # 手动做以下判断将int类型分离出来
    elif _cell.ctype == 2 and _cell.value % 1 == 0.0:
        return int(_cell.value)

    # 单元格的ctype属性为3时,对应的python格式为datetime
    elif _cell.ctype == 3:
        return datetime.date(*xlrd.xldate_as_tuple(_cell.value, 0))

    # 单元格的ctype属性为4时,对应的python格式为Bool
    elif _cell.ctype == 4:
        return True if _cell.value == 1 else False

    # 单元格的ctype属性为1时,对应的python格式为字符串
    # 默认返回字符串和ctype=2时的float类型的内容
    else:
        return _cell.value

4、编写实际读取excel的处理函数(需用上述装饰器进行装饰)

@import_excel_file
def import_product_standard(request, table=None, n_rows=None):

    for i in range(1, n_rows):
        try:
            # 使用工具函数 "convert_cell_type_from_import_excel" 将每个cell对象转换成相应的Python格式
            dic = {'ps_name': str(convert_cell_type_from_import_excel(table.cell(i, 0))).strip()[:50],
                   'jspl': str(convert_cell_type_from_import_excel(table.cell(i, 1))).strip()[:50],
                   'wspl': str(convert_cell_type_from_import_excel(table.cell(i, 2))).strip()[:50],
                   'jsqsbs': str(convert_cell_type_from_import_excel(table.cell(i, 3))).strip()[:50],
                   'wsqsbs': str(convert_cell_type_from_import_excel(table.cell(i, 4))).strip()[:50],
                   'jsdskz': str(convert_cell_type_from_import_excel(table.cell(i, 5))).strip()[:50],
                   'wsdskz': str(convert_cell_type_from_import_excel(table.cell(i, 6))).strip()[:50],
                   'jsdsql': str(convert_cell_type_from_import_excel(table.cell(i, 7))).strip()[:50],
                   'wsdsql': str(convert_cell_type_from_import_excel(table.cell(i, 8))).strip()[:50],
                   'dbjxql': str(convert_cell_type_from_import_excel(table.cell(i, 9))).strip()[:50],
                   'dbwxql': str(convert_cell_type_from_import_excel(table.cell(i, 10))).strip()[:50],
                   'dbpfkz': str(convert_cell_type_from_import_excel(table.cell(i, 11))).strip()[:50],
                   'dbjm': str(convert_cell_type_from_import_excel(table.cell(i, 12))).strip()[:50],
                   'dbwm': str(convert_cell_type_from_import_excel(table.cell(i, 13))).strip()[:50]}
        ......

你可能感兴趣的:(xlrd读取excel时,解决int、float变float问题)