Python xlwt操作Excel表格实例:按行按列写入、自定义格式方法、自动调整列宽等

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')

文件截图:

 Python xlwt操作Excel表格实例:按行按列写入、自定义格式方法、自动调整列宽等

 

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')

文件截图:

Python xlwt操作Excel表格实例:按行按列写入、自定义格式方法、自动调整列宽等
按列写入代码:

 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')

 


文件截图:

 Python xlwt操作Excel表格实例:按行按列写入、自定义格式方法、自动调整列宽等

三、创建格式方法
代码:

 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')

 


文件截图:

 Python xlwt操作Excel表格实例:按行按列写入、自定义格式方法、自动调整列宽等

四、自写设置行高列宽方法
代码:

 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')

 


文件截图:

Python xlwt操作Excel表格实例:按行按列写入、自定义格式方法、自动调整列宽等
五、根据单元格内容自动调整列宽、统一设置行高方法
代码:

 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')

 


文件截图:

 Python xlwt操作Excel表格实例:按行按列写入、自定义格式方法、自动调整列宽等

结尾:
以上就是本篇博客的全部内容了,感谢阅读。

上一篇:xlwt 模块_python


下一篇:使用PlantUML展示类与类的关系