美文网首页Python_问题及解决
xlrd读取excel时,解决int、float变float问题

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

作者: Shun2018 | 来源:发表于2019-11-06 11:18 被阅读0次

    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问题

        本文链接:https://www.haomeiwen.com/subject/umtubctx.html