自写类实现:新建工作薄 sheet表,保存文件功能
在操作Excel表格时,更加方便简单
在初始化方法中,新建了一个工作簿与sheet表。 col_data字典用来收集所有写入sheet表的列信息,为后续设置自动调整列宽用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import xlwtfrom xlwt import Styleclass MyXlwt : def __init__ (self, sheet_name='sheet_1' , re_write=True ): """ 自定义类说明: :param sheet_name:默认sheet表对象名称,默认值为 'sheet_1' :param re_write: 单元格重写写功能默认开启 """ self.work_book = xlwt.Workbook() self.sheet = self.work_book.add_sheet(sheet_name, cell_overwrite_ok=re_write) self.col_data = {} def save (self, file_name ): self.work_book.save(file_name) MyXlwt().save("test.xls" )
类里面增加方法: 按行写入一组列表数据
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 def write (self, row, col, label, style=Style.default_style ): """ 在默认sheet表对象一个单元格内写入数据 :param style: :param row: 写入行 :param col: 写入列 :param label: 写入数据 """ self.sheet.write(row, col, label, style) if col not in self.col_data.keys(): self.col_data[col] = [] self.col_data[col].append(label) else : self.col_data[col].append(label) def write_row (self, start_row, start_col, date_list, style=Style.default_style ): """ 按行写入一行数据 :param style: :param start_row:写入行序号 :param start_col: 写入列序号 :param date_list: 写入数据:列表 :return: 返回行对象 """ for col, label in enumerate (date_list): self.write(start_row, start_col + col, label, style) return self.sheet.row(start_row)
按行写入一组列表数据:
1 2 3 4 5 6 7 8 9 10 11 if __name__ == '__main__' : myObj = MyXlwt() l1 = list (range (10 )) l2 = ['数据%s' % i for i in range (10 )] myObj.write_row(0 ,0 ,l1) myObj.write_row(1 ,1 ,l2) myObj.save('test.xls' )
示例图>/font
类里面增加方法: 按行写入多组数据
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def write_rows (self, start_row, start_col, data_lists, style=Style.default_style ): """ 按行写入多组数据 :param style: :param start_row: 开始写入行序号 :param start_col: 写入列序号 :param data_lists: 列表嵌套列表数据 :return: 返回写入行对象列表 """ row_obj = [] for row_, data in enumerate (data_lists): if isinstance (data, list ): self.write_row(start_row + row_, start_col, data, style) row_obj.append(self.sheet.row(start_row + row_)) else : msg = '数据列表不是嵌套列表数据,而是%s' % type (data) raise Exception(msg) return row_obj
按行写入多组数据:
1 2 3 4 5 6 7 if __name__ == '__main__' : myObj = MyXlwt() ls = [[1 , 2 , 3 ], ['a' , 'b' , 'c' , 'd' ], ['A' , 'B' , 'C' , 'D' , 'E' ]] myObj.write_rows(0 , 0 , ls) myObj.save('test.xls' )
示例图
类里面增加方法: 按列输入一列或多列数据
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 def write_col (self, start_row, start_col, date_list, style=Style.default_style ): """ 按列写入一列数据 :param style: :param start_row:写入行序号 :param start_col: 写入列序号 :param date_list: 写入数据:列表 :return: 返回写入的列对象 """ for row, label in enumerate (date_list): self.write(row + start_row, start_col, label, style) return self.sheet.col(start_col) def write_cols (self, start_row, start_col, data_lists, style=Style.default_style ): """ 按列写入多列数据 :param style: :param start_row:开始写入行序号 :param start_col: 开始写入列序号 :param data_lists: 列表嵌套列表数据 :return: 返回列对象列表 """ col_obj = [] for col_, data in enumerate (data_lists): if isinstance (data, list ): self.write_col(start_row, start_col + col_, data, style) col_obj.append(self.sheet.col(start_col + col_)) else : msg = '数据列表不是嵌套列表数据,而是%s' % type (data) raise Exception(msg) return col_obj
按列输入一列或多列数据:
1 2 3 4 5 6 7 8 9 10 11 12 if __name__ == '__main__' : myObj = MyXlwt() l3 = ['列%s' % i for i in range (10 )] myObj.write_col(0 , 0 , l3) ls2 = [[1 , 2 , 3 ], ['a' , 'b' , 'c' , 'd' ], ['A' , 'B' , 'C' , 'D' , 'E' ]] myObj.write_cols(0 , 1 , ls2) myObj.save("test.xls" )
示例图
类里面增加方法: 创建格式方法 1、这里我们自定义了一个方法来创建单元格格式; 2、可设置字体名称、字体大小,是否加粗、对齐方式。
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 def diy_style (self, font_name, font_height, bold=True , horz=2 ): """ 创建单元格格式:(默认垂直居中) :param font_name: 字体名称 :param font_height: 字体高度 :param bold: 默认加粗 :param horz: 水平对齐方式,默认水平居中:2,左对齐:1,右对齐:3 :return: 返回设置好的格式 """ style = xlwt.XFStyle() font = style.font font.name = font_name font.height = font_height * 20 font.bold = bold alignment = style.alignment alignment.horz = horz alignment.vert = 1 return style
按行、按列写入数据,使用自定义的创建格式方法来写入数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 if __name__ == '__main__' : myObj = MyXlwt() l4 = ['行%s' % i for i in range (5 )] l5 = ['列%s' % i for i in range (3 )] ls3 = [[1 , 2 , 3 ], ['a' , 'b' , 'c' , 'd' ], ['A' , 'B' , 'C' , 'D' , 'E' ]] h_s = myObj.diy_style('Times New Roman' , 20 ) s2 = myObj.diy_style('Times New Roman' , 10 , False , 1 ) myObj.write_row(0 , 1 , l4, h_s) myObj.write_col(1 , 0 , l5, h_s) myObj.write_rows(1 , 1 , ls3, s2) myObj.save('test.xls' )
示例图
类里面增加方法: 自写设置行高列宽方法
设置单元格宽度、高度
1 2 3 4 5 6 7 8 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 def set_col_width (self, col_ro_cols, width ): """ 设置单元格宽度 :param col_ro_cols: 一个列序号,或列序号列表 :param width: 列宽度 :return: None """ if isinstance (col_ro_cols, int ): self.sheet.col(col_ro_cols).width = 256 * width else : for col_ in col_ro_cols: self.sheet.col(col_).width = 256 * width def set_row_height (self, row_ro_rows, height ): """ 设置单元格高度 :param row_ro_rows:行序号、或行序号列表 :param height: 行高度 :return: None """ if isinstance (row_ro_rows, int ): self.sheet.row(row_ro_rows).height_mismatch = True self.sheet.row(row_ro_rows).height = 20 * height else : for row_ in row_ro_rows: self.sheet.row(row_).height_mismatch = True self.sheet.row(row_).height = 20 * height
设置行高、列宽
1 2 3 4 5 6 7 8 9 10 11 12 if __name__ == '__main__' : myObj = MyXlwt() ls4 = [[1 , 2 ], ['a' , 'b' , 'c' ], ['A' , 'B' , 'C' ], ['D' , 'E' , 'F' , 'G' ]] myObj.write_rows(0 , 0 , ls4) myObj.set_col_width(0 , 15 ) myObj.set_col_width([1 , 3 ], 20 ) myObj.set_row_height([0 , 1 , 2 ], 25 ) myObj.save('test.xls' )
示例图
类里面增加方法: 根据单元格内容自动调整列宽、统一设置行高方法 1、因中、英文长度不一致,所以写了一个计算长度的方法:string_len(); 2、之所以要获取col_data 是因为 xlwt 的sheet对象获取在写入数据方法时是以行写入的 用get_cols()方法获取列会出问题, 所以就自己定义了一个col_data 字典,然后通过自定义的 write 方法来收集列信息 3、列宽其实和字体大小也有关系,在 xlwt 模块里想要获取已写入的数据、单元格字体大小,挺复杂的,只能暂时将字体大小作为一个参数传入了。
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 def adjust_col_width (self, font_height ): """ 设置自适应列宽 :param font_height: 文字字体高度 :return: None """ def string_len (string ): length = 0 for s in string: if s.isupper() or s.islower(): length += 2 elif s.isspace(): length += 1 else : length += 3 return length col_width = {} mul = font_height * 20 for col, str_len in self.col_data.items(): max_len = max ([string_len(str (i)) for i in str_len]) col_width[col] = max_len for col_, width_ in col_width.items(): if width_ * mul <= 2350 : self.sheet.col(col_).width = 2350 else : self.sheet.col(col_).width = mul * width_ def set_unite_height (self, height ): """ 设置统一行高 :param height:行高 :return:None """ rows = self.sheet.get_rows().keys() for row in rows: self.set_row_height(row, height)
统一设置行高方法
1 2 3 4 5 6 7 8 9 10 11 12 13 if __name__ == "__main__" : myObj = MyXlwt() ls5 = [[1 , 2 ], ['abcdefghijk' , 'b' , 'c' ], ['A' , 'B' , 'CDEFGHIJKLMNSFSD' ], ['D' , 'E' , 'F' , 'G' , '这是新建的测试中文数据字符串' ]] myObj.write_rows(0 , 0 , ls5) myObj.adjust_col_width(10 ) myObj.set_unite_height(20 ) myObj.save('test.xls' )
示例图