1import xlwt 2from xlwt import Worksheet 3from xlwt import Pattern as PTRN, Alignment as ALMT, Font as FT, XFStyle as XFSTL 4import typing 5from typing import Optional 6from collections.abc import Iterable 7 8 9class SimpleExcelWriter: 10 def __init__(self, default_sheet_name: str = "sheet1"): 11 self.__book = xlwt.Workbook(encoding='utf-8', style_compression=0) 12 self.__sheet_dict = { 13 default_sheet_name: self.__book.add_sheet( 14 sheetname=default_sheet_name, cell_overwrite_ok=True) 15 } 16 self.__sheet_pos = { 17 default_sheet_name: (0, 0) # 记录各个sheet页已经写到什么位置了,当前值为还没有写的 18 } 19 self.__default_sheet_name = default_sheet_name 20 # 表头样式 21 self.__head_style = XFSTL() 22 # 内容样式 23 self.__content_style = XFSTL() 24 # 字体 25 ft = FT() 26 ft.bold = True 27 28 # 设置背景颜色 29 ptrn = PTRN() 30 ptrn.pattern = PTRN.SOLID_PATTERN 31 ptrn.pattern_fore_colour = 22 # 背景颜色 32 33 # 居中对齐 34 algmt = ALMT() 35 algmt.horz = ALMT.HORZ_CENTER # 水平方向 36 algmt.vert = ALMT.VERT_CENTER # 垂直方向 37 38 self.__head_style.font = ft 39 self.__head_style.alignment = algmt 40 self.__head_style.pattern = ptrn 41 self.__content_style.alignment = algmt 42 43 def __increment_y(self, sheet_name: str, value: int = 1) -> int: 44 if sheet_name in self.__sheet_pos.keys(): 45 x, y = self.__sheet_pos.get(sheet_name) 46 y = y + value 47 self.__sheet_pos[sheet_name] = (x, y) 48 return y 49 50 def __increment_x(self, sheet_name: str, value: int = 1) -> int: 51 if sheet_name in self.__sheet_pos.keys(): 52 x, y = self.__sheet_pos.get(sheet_name) 53 x = x + value 54 self.__sheet_pos[sheet_name] = (x, 0) 55 return x 56 57 def append_line(self, content: list, sheet_name: str = None): 58 sheet_name = self.__default_sheet_name if sheet_name is None else sheet_name 59 if sheet_name not in self.__sheet_dict.keys(): 60 print("error: sheet name '{}' not exist".format(sheet_name)) 61 return 62 sheet: Worksheet = self.__sheet_dict.get(sheet_name) 63 x, y = self.__sheet_pos.get(sheet_name) 64 for ele in content: 65 sheet.write(x, y, ele, style=self.__content_style) 66 y = self.__increment_y(sheet_name) 67 self.__increment_x(sheet_name) 68 69 def write_merge(self, x0: int, y0: int, x1: int, y1: int, content: typing.Any, 70 sheet_name: str = None): 71 sheet_name = self.__default_sheet_name if sheet_name is None else sheet_name 72 if sheet_name not in self.__sheet_dict.keys(): 73 print("error: sheet name '{}' not exist".format(sheet_name)) 74 return 75 sheet: Worksheet = self.__sheet_dict.get(sheet_name) 76 sheet.write_merge(x0, x1, y0, y1, content, style=self.__content_style) 77 78 def set_sheet_header(self, headers: Iterable, sheet_name: str = None): 79 """ 80 给sheet页设置表头 81 """ 82 sheet_name = self.__default_sheet_name if sheet_name is None else sheet_name 83 if sheet_name not in self.__sheet_dict.keys(): 84 print("error: sheet name '{}' not exist".format(sheet_name)) 85 return 86 x, y = self.__sheet_pos.get(sheet_name) 87 if x != 0 or y != 0: 88 print( 89 "error: pos of sheet '{}' is not (0,0). set_sheet_header must before write".format(sheet_name)) 90 return 91 sheet: Worksheet = self.__sheet_dict.get(sheet_name) 92 for h in headers: 93 sheet.write(x, y, h, self.__head_style) 94 y = self.__increment_y(sheet_name) 95 self.__increment_x(sheet_name) 96 97 def add_sheet(self, sheet_name: str, cell_overwrite_ok=True) -> Optional[xlwt.Worksheet]: 98 if sheet_name in self.__sheet_dict.keys(): 99 print("error: sheet name '{}' has exist".format(sheet_name)) 100 return 101 self.__sheet_dict[sheet_name] = self.__book.add_sheet( 102 sheetname=sheet_name, cell_overwrite_ok=cell_overwrite_ok) 103 self.__sheet_pos[sheet_name] = (0, 0) 104 return self.__sheet_dict.get(sheet_name) 105 106 def save(self, file_name: str): 107 self.__book.save(file_name) 108 109 110if __name__ == '__main__': 111 writer = SimpleExcelWriter(default_sheet_name="first") 112 writer.add_sheet("second") 113 writer.add_sheet("third") 114 writer.set_sheet_header(["h", "m", "n"]) 115 writer.append_line([1, 2, 3]) 116 writer.append_line([2, 3, 4], "second") 117 writer.append_line([3, 4, 5], "third") 118 writer.append_line([3, 2, 1]) 119 writer.save("demo.xls") 120