Python xlwt 模块编辑 Excle 表格 实例:按行按列写入、自定义格式方法、自动调整列宽等
前言:
一、自写类实现:新建工作薄 sheet表,保存文件功能
二、自写按行、按列写入方法
三、创建格式方法
四、自写设置行高列宽方法
五、根据单元格内容自动调整列宽、统一设置行高方法
结尾:
【Python与Office】专栏
前言:
前面三篇博客我们介绍了xlwt模块对Excel表格的很多基础操作,这篇博客我们来自己写一些方法。让我们在操作Excel表格时,更加方便简单,同时也是对前面内容的回顾。
一、自写类实现:新建工作薄 sheet表,保存文件功能
1 class My_xlwt(object): 2 def __init__(self,sheet_name = 'sheet_1',re_write = True): 3 ''' 4 自定义类说明: 5 :param sheet_name:默认sheet表对象名称,默认值为 'sheet_1' 6 :param re_write: 单元格重写写功能默认开启 7 ''' 8 self.work_book = xlwt.Workbook() 9 self.sheet = self.work_book.add_sheet(sheet_name, 10 cell_overwrite_ok=re_write) 11 self.col_data = {} 12 13 def save(self,file_name): 14 self.work_book.save(file_name)
解析:
自己写了一个My_xlwt的类,继承Object类。在初始化方法中,新建了一个工作簿与sheet表。
col_data字典用来收集所有写入sheet表的列信息,为后续设置自动调整列宽用。
二、自写按行、按列写入方法
按行写入代码:
1 def write(self,row,col,label,style = Style.default_style): 2 ''' 3 在默认sheet表对象一个单元格内写入数据 4 :param row: 写入行 5 :param col: 写入列 6 :param label: 写入数据 7 ''' 8 self.sheet.write(row,col,label,style) 9 10 # 将列数据加入到col_data字典中 11 if col not in self.col_data.keys(): 12 self.col_data[col] = [] 13 self.col_data[col].append(label) 14 else: 15 self.col_data[col].append(label) 16 17 def write_row(self,start_row,start_col,date_list, 18 style = Style.default_style): 19 ''' 20 按行写入一行数据 21 :param start_row:写入行序号 22 :param start_col: 写入列序号 23 :param date_list: 写入数据:列表 24 :return: 返回行对象 25 ''' 26 for col,label in enumerate(date_list): 27 self.write(start_row,start_col+col,label,style) 28 29 return self.sheet.row(start_row) 30 31 def write_rows(self,start_row,start_col,data_lists, 32 style = Style.default_style): 33 ''' 34 按行写入多组数据 35 :param start_row: 开始写入行序号 36 :param start_col: 写入列序号 37 :param data_lists: 列表嵌套列表数据 38 :return: 返回写入行对象列表 39 ''' 40 row_obj = [] 41 for row_,data in enumerate(data_lists): 42 if isinstance(data,list): 43 self.write_row(start_row+row_,start_col,data,style) 44 row_obj.append(self.sheet.row(start_row+row_)) 45 else: 46 msg = '数据列表不是嵌套列表数据,而是%s' % type(data) 47 raise Exception(msg) 48 49 return row_obj
测试:
1、按行写入一组列表数据:
1 if __name__ == '__main__': 2 # 实例化自写类 3 test = My_xlwt() 4 h_s = test.diy_style('Times New Roman',20) 5 s2 = test.diy_style('Times New Roman',10,False,1) 6 7 l1 = list(range(10)) 8 l2 = ['数据%s'% i for i in range(10)] 9 # 在0行0列写入一行数据 10 test.write_row(0,0,l1) 11 # 在1行1列写入一行数据 12 test.write_row(1,1,l2) 13 # 保存文件 14 test.save('my_test.xls')
文件截图:
2、按行写入多组数据:
1 if __name__ == '__main__': 2 # 实例化自写类 3 test = My_xlwt() 4 ls = [[1,2,3],['a','b','c','d'],['A','B','C','D','E']] 5 # 在0行0列开始按行写入多组数据 6 test.write_rows(0,0,ls) 7 # 保存文件 8 test.save('my_test.xls')
文件截图:
按列写入代码:
1 def write_col(self,start_row,start_col,date_list, 2 style = Style.default_style): 3 ''' 4 按列写入一列数据 5 :param start_row:写入行序号 6 :param start_col: 写入列序号 7 :param date_list: 写入数据:列表 8 :return: 返回写入的列对象 9 ''' 10 for row,label in enumerate(date_list): 11 self.write(row+start_row,start_col,label,style) 12 13 return self.sheet.col(start_col) 14 15 def write_cols(self,start_row,start_col,data_lists, 16 style = Style.default_style): 17 ''' 18 按列写入多列数据 19 :param start_row:开始写入行序号 20 :param start_col: 开始写入列序号 21 :param data_lists: 列表嵌套列表数据 22 :return: 返回列对象列表 23 ''' 24 col_obj = [] 25 for col_ ,data in enumerate(data_lists): 26 if isinstance(data,list): 27 self.write_col(start_row,start_col+col_,data,style) 28 col_obj.append(self.sheet.col(start_col+col_)) 29 else: 30 msg = '数据列表不是嵌套列表数据,而是%s' % type(data) 31 raise Exception(msg) 32 33 return col_obj
测试:
1、按列写入一组、多组数据:
if __name__ == '__main__': # 实例化自写类 test = My_xlwt() l3 = ['列%s' % i for i in range(10)] # 在0行0列写入一列数据 test.write_col(0,0,l3) ls2 = [[1,2,3],['a','b','c','d'],['A','B','C','D','E']] # 在0行1列开始写入多列数据 test.write_cols(0,1,ls2) # 保存文件 test.save('my_test.xls')
文件截图:
三、创建格式方法
代码:
1 def diy_style(self,font_name,font_height,bold = True,horz = 2): 2 ''' 3 创建单元格格式:(默认垂直居中) 4 :param font_name: 字体名称 5 :param font_height: 字体高度 6 :param bold: 默认加粗 7 :param horz: 水平对齐方式,默认水平居中:2,左对齐:1,右对齐:3 8 :return: 返回设置好的格式 9 ''' 10 style = xlwt.XFStyle() 11 # 字体设置 12 font = style.font 13 font.name = font_name 14 font.height = font_height*20 15 font.bold = bold 16 # 对齐方式 17 alignment = style.alignment 18 # 水平居中 19 alignment.horz = horz 20 # 垂直居中 21 alignment.vert = 1 22 23 return style
解析:
1、这里我们自定义了一个方法来创建单元格格式;
2、可设置字体名称、字体大小,是否加粗、对齐方式。
测试:
按行、按列写入数据,使用自定义的创建格式方法来写入数据:
1 if __name__ == '__main__': 2 # 实例化自写类 3 test = My_xlwt() 4 l4 = ['行%s'% i for i in range(5)] 5 l5 = ['列%s'% i for i in range(3)] 6 ls3 = [[1,2,3],['a','b','c','d'],['A','B','C','D','E']] 7 # 使用自写的创建单元格格式方法来创建以下两种格式 8 # Times New Roman 字体,20号大小,加粗,水平居中,垂直居中 9 h_s = test.diy_style('Times New Roman',20) 10 # Times New Roman 字体,10号大小,不加粗,水平左对齐,垂直居中 11 s2 = test.diy_style('Times New Roman',10,False,1) 12 # 写入数据 13 # 0行,1列 按行写入数据 格式 h_s 14 test.write_row(0,1,l4,h_s) 15 # 1行,0列 按列写入数据 格式 h_s 16 test.write_col(1,0,l5,h_s) 17 # 1行,1列 按行写入多组数据 格式 s2 18 test.write_rows(1,1,ls3,s2) 19 # 保存文件 20 test.save('my_test.xls')
文件截图:
四、自写设置行高列宽方法
代码:
1 def set_col_width(self,col_ro_cols,width): 2 ''' 3 设置单元格宽度 4 :param col_ro_cols: 一个列序号,或列序号列表 5 :param width: 列宽度 6 :return: None 7 ''' 8 if isinstance(col_ro_cols,int): 9 self.sheet.col(col_ro_cols).width = 256*width 10 else: 11 for col_ in col_ro_cols: 12 self.sheet.col(col_).width = 256*width 13 14 def set_row_height(self,row_ro_rows,height): 15 ''' 16 设置单元格高度 17 :param row_ro_rows:行序号、或行序号列表 18 :param height: 行高度 19 :return: None 20 ''' 21 if isinstance(row_ro_rows, int): 22 self.sheet.row(row_ro_rows).height_mismatch = True 23 self.sheet.row(row_ro_rows).height = 20 * height 24 else: 25 for row_ in row_ro_rows: 26 # 需先将单元格高度不自动匹配单元格内容高度打开,才能设置高度 27 self.sheet.row(row_).height_mismatch = True 28 self.sheet.row(row_).height = 20 * height
解析:
设置单元格宽度、高度方法前面好像没说过,很简单:
1:先用sheet对象获取列或行对象 sheet.row(row_index) /sheet.col(col_index) 2:设置宽度、高度值: sheet.row(row_index).width = width 设置行高时,需先: sheet.col(col_index).height_mismatch = True 然后再设置: sheet.col(col_index).height = height
测试:
设置列宽及行高:
1 if __name__ == '__main__': 2 # 实例化自写类 3 test = My_xlwt() 4 ls4 = [[1,2],['a','b','c'],['A','B','C'],['D','E','F','G']] 5 test.write_rows(0,0,ls4) 6 # 设置第0列宽度为 15 7 test.set_col_width(0,15) 8 # 设置第1、3列宽度为 20 9 test.set_col_width([1,3],20) 10 # 设置第0、1、2 行高度为 25 11 test.set_row_height([0,1,2],25) 12 # 保存文件 13 test.save('my_test.xls')
文件截图:
五、根据单元格内容自动调整列宽、统一设置行高方法
代码:
1 def adjust_col_width(self,font_height): 2 ''' 3 设置自适应列宽 4 :param font_height: 文字字体高度 5 :return: None 6 ''' 7 # 获取字符串长度 8 def string_len(string): 9 length = 0 10 for s in string: 11 if s.isupper() or s.islower(): 12 length += 2 13 elif s.isspace(): 14 length += 1 15 else: 16 length += 3 17 return length 18 19 col_width = {} 20 mul = font_height * 20 21 for col,str_len in self.col_data.items(): 22 max_len = max([string_len(str(i)) for i in str_len]) 23 col_width[col] = max_len 24 25 for col_,width_ in col_width.items(): 26 if width_*mul <= 2350: 27 self.sheet.col(col_).width = 2350 28 else: 29 self.sheet.col(col_).width = mul*width_ 30 31 def set_unite_height(self,height): 32 ''' 33 设置统一行高 34 :param height:行高 35 :return:None 36 ''' 37 rows = self.sheet.get_rows().keys() 38 for row in rows: 39 self.set_row_height(row,height)
解析:自写根据列中字符串长度设置自动宽度
1、因中、英文长度不一致,所以写了一个计算长度的方法:string_len();
2、之所以要获取col_data 是因为 xlwt 的sheet对象获取在写入数据方法时是以行写入的 用get_cols()方法获取列会出问题,所以就自己定义了一个col_data 字典,然后通过自定义的 write 方法来收集列信息
3、列宽其实和字体大小也有关系,在 xlwt 模块里想要获取已写入的数据、单元格字体大小,挺复杂的,只能暂时将字体大小作为一个参数传入了。
测试:
设置自适应宽度、统一单元格高度:
1 if __name__ == '__main__': 2 # 实例化自写类 3 test = My_xlwt() 4 # 创建一组数据 5 ls5 = [[1, 2], ['abcdefghijk', 'b', 'c'], 6 ['A', 'B', 'CDEFGHIJKLMNSFSD'], 7 ['D', 'E', 'F', 'G','这是新建的测试中文数据字符串']] 8 # 按行写入 9 test.write_rows(0,0,ls5) 10 # 自写根据列中字符串长度设置自动宽度 11 test.adjust_col_width(10) 12 # 设置统一高度 13 test.set_unite_height(20) 14 # 保存文件 15 test.save('my_test.xls')
文件截图:
结尾:
以上就是本篇博客的全部内容了,感谢阅读。