Package: easy-excel-util
easy-excelversion: 2.0+excel操作简化，包含导入和导出功能。省去平时频繁的重复操作，同时支持xls和xlsx需要条件xlrd>=1.2xlwt>=1.3openpyxl>=3.0.5安装方式：需要python3.6及以上下载文件内的easy_excel_util包使用pip install easy-excel-util最简单的使用方法导出fromeasy_excel_utilimportBuilder,ExportFielddata=[{'id':1,'name':'姓名1','age':18},{'id':2,'name':'姓名2','age':20}]Builder.build_export().sheet(index=0,data=data,parse_map=dict(id=ExportField(index=0,col_name='id',width=5),name=ExportField(index=1,col_name='姓名',width=15),age=ExportField(index=2,col_name='年龄',width=15))).do_export('/User/ChaoqiYin/excel1.xls')导入fromeasy_excel_utilimportBuilder,ImportFieldr=Builder.build_import('/User/ChaoqiYin/excel1.xls').do_import(dict(id=ImportField(index=0),name=ImportField(index=1),age=ImportField(index=2)))forfieldinr.result:print(field.id,field.name,field.age)全局设置Builder类能进行一些导入或导出需要使用的全局统一配置，提供了以下几种类方法进行全局的配置：add_export_style(style, title_style=None, xlsx=False)：添加一个全局的导出样式，根据导出excel类型不同使用不同的style, xls和xlsx的样式可以同时存在# xlsx类型的excel样式, 样式必须是一个dict，key是openpyxl库中cell的样式对应的属性名，value是对应的属性值fromopenpyxl.stylesimportFontBuilder.add_export_style(style={'font':Font(name='Arial',size=14),},title_style={'font':Font(name='Arial',size=18,bold=True),},xlsx=True)# xls类型的excel样式，样式是一个xlwt库的XFStyle实例importxlwtDEFAULT_STYLE=xlwt.XFStyle()al=xlwt.Alignment()al.wrap=1# 自动换行al.horz=0x02# 设置水平居中al.vert=0x01# 设置垂直居中DEFAULT_STYLE.alignment=alfont=xlwt.Font()# 为样式创建字体# 字体大小，14为字号，20为衡量单位font.name='Arial'font.height=10*20DEFAULT_STYLE.font=fontBuilder.add_export_style(style=DEFAULT_STYLE)add_export_converter(data_type_class, func)：添加一个全局的导出数据转换方法，data_type_class是需要待转换的python数据类型，根据data_type_class自动匹配数据进行转换Builder.add_export_converter(type(float),func=lambdafloat_value:float_value+1)# func接收一个value参数，返回转换后的值add_import_converter(converter_key, func)：添加一个全局的导入数据转换方法，converter_key是excel中的数据格式对应key，根据数据格式自动匹配数据进行转换fromeasy_excel_utilimportEMPTY,TEXT,NUMBER,DATE,BOOLEAN,ERROR,BLANKBuilder.add_import_converter(NUMBER,func=lambdanumber_value:number_value+1)# func接收一个value参数，返回转换后的值&nbsp;导出的其他设置导出xlsx类型的excel:# 默认导出xls格式Builder.build_export(xlsx=True)...build_export()的sheet方法支持多种配置参数:defsheet(index,data,parse_map,sheet_name=None,height=40,before=None,after=None,style=None,title_style=None,row_del_class=None,max_workers=None):'''sheet的导出设置:param index: sheet索引, 从0开始:param parse_map: 解析的dict, key是data中要匹配的key值，value是ExportField类的实例:param data: 用list装载导出的数据, 数据可以是字典，也可以是一个对象，只要对象有对应的属性:param sheet_name: 表名，不传入时sheet的命名方式为sheet{索引}:param height: 行高，默认40，单位为磅:param before: 导入第一行前的操作，需要一个func(work_sheet, sheet_no, parse_map, row_del_class)参数分别为内部sheet类的实例、sheet索引、parse_map、行处理类，需要返回一个后续操作进行的起始行索引:param after: 导入最后一行后的操作，需要一个func(work_sheet, sheet_no, row_num, parse_map, row_del_class)参数分别为内部sheet类的实例、sheet索引、当前行索引、parse_map、行处理类:param style: 该sheet单元格样式，不传则使用全局样式, 可以是一个函数，func(row_num, data, value)参数分别为当前行数，源数据，转换后数据，需要返回一个样式:param title_style: 该sheet标题样式，不传则使用全局样式，标题是第一行:param row_del_class: 行处理的类，建议设为easy_excel_util.export_pack.export_row.ExportRow的子类:param max_workers: 异步线程数，不传入时使用同步模式导出:return:'''...return...ExportField支持多种属性设置:ExportField(index,datetime_format=None,col_name=None,width=20,converter=None,style=None,merge_same=False):paramindex:导出到sheet的列索引,从0开始:paramdatetime_format:如果数据是datetime或者time，根据format转换为对应格式的str:paramcol_name:第一行的title列名，如果所有字段都不传入col_name，则没有title行:paramwidth:列宽，默认20，单位是字符:paramconverter:该列的数据转换方法，需要一个func，func接收一个value参数，返回转换后的值，会覆盖全局导出转换:paramstyle:列样式，支持func，参数和返回值同sheet方法中的style，会覆盖sheet中设置的style:parammerge_same:该列数据相同的单元格是否合并，默认不合并支持一个excel导出多组数据到不同的sheet:data1=[{'id':1,'name':'姓名1','age':18},{'id':2,'name':'姓名2','age':20}]data2=[{'id':11,'name':'姓名11','age':18},{'id':12,'name':'姓名12','age':20}]Builder.build_export().sheet(index=0,data=data1,parse_map=dict(id=ExportField(index=0,col_name='id',width=5),name=ExportField(index=1,col_name='姓名',width=15),age=ExportField(index=2,col_name='年龄',width=15))).sheet(index=1,data=data2,parse_map=dict(id=ExportField(index=0,col_name='id',width=5),name=ExportField(index=1,col_name='姓名',width=15),age=ExportField(index=2,col_name='年龄',width=15))).do_export('/User/ChaoqiYin/excel1.xls')导入的其他设置支持导入文件路径或file对象，同时兼容xls和xlsx:# 文件路径Builder.build_import('/User/ChaoqiYin/excel1.xls')...# file对象, request中的file对象也可以fromflaskimportrequestf=request.files['file']Builder.build_import(f)...针对单个excel添加数据转换方法:# 同Builder.add_import_converter, 会覆盖全局设置Builder.build_import().add_converter(converter_key,func)...do_import方法支持多种配置参数:defdo_import(self,parse_map,error_message_prefix='第{row_num}行',sheet_no=0,start_row_num=0,end_row_num=None,row_del_class=None,row_validate_func=None,max_workers=None,title_row=None):'''导入启动:param parse_map: 解析的dict, key是解析excel后result内data中的属性值，value是ImportField类的实例:param error_message_prefix: 报错提示的前缀文字, 默认是'第{row_num}':param sheet_no: 解析的表格位置索引，从0开始:param start_row_num: 从第几行开始解析，默认0:param end_row_num: 到第几行结束，默认是到最后一行数据:param row_del_class: 默认的行处理类, 建议是easy_excel_util.import_pack.import_row.ImportRow的子类:param row_validate_func: 行验证方法，接收4个参数：（行索引，行原始数据，行转换后的数据，parse_map），返回None或一个list，里面是该行的错误消息，会自动拼接上error_message_prefix:param max_workers: 异步线程数，不传入时使用同步模式导入:param title_row: 字段col_name自动匹配的标题行索引，传入一个行索引，会根据parse_map中field的col_name去匹配该行的单元格，匹配成功时将index覆盖为对应的单元格index，为None时不匹配:return: 返回一个结果对象，有success、result、error_message_list三个属性。success表示导入转换过程中是否有不匹配格式等错误，result是导入转换成功的结果列表，error_message_list是转换有错误时的提示信息列表'''...return...ImportField支持多种属性设置:ImportField(index,datetime_format=None,col_name=None,converter=None,required_message=None):paramindex:解析列对应位置，从0开始:paramdatetime_format:excel单元格字符串转换成datetime的格式模板，不满足则计入error_message_list，自动拼接上error_message_prefix:paramcol_name:列名,用于报错提示或自动匹配标题行对应的列，匹配需要配合do_import的title_row使用:paramconverter:该列的数据转换方法，需要一个func，func接收一个单元格value参数，返回转换后的值，会覆盖全局导入转换:paramrequired_message:是否验证非空必填，该列单元格为空时的校验报错信息，计入error_message_list，自动拼接上error_message_prefix