自写类实现:新建工作薄 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 xlwt
from xlwt import Style


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

# 将列数据加入到col_data字典中
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)]
# 在0行0列写入一行数据
myObj.write_row(0,0,l1)
# 在1行1列写入一行数据
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']]
# 在0行0列开始按行写入多组数据
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)]
# 在0行0列写入一列数据
myObj.write_col(0, 0, l3)

ls2 = [[1, 2, 3], ['a', 'b', 'c', 'd'], ['A', 'B', 'C', 'D', 'E']]
# 在0行1列开始写入多列数据
myObj.write_cols(0, 1, ls2)

# 保存xls
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']]
# 使用自写的创建单元格格式方法来创建以下两种格式
# Times New Roman 字体,20号大小,加粗,水平居中,垂直居中
h_s = myObj.diy_style('Times New Roman', 20)
# Times New Roman 字体,10号大小,不加粗,水平左对齐,垂直居中
s2 = myObj.diy_style('Times New Roman', 10, False, 1)
# 写入数据
# 0行,1列 按行写入数据 格式 h_s
myObj.write_row(0, 1, l4, h_s)
# 1行,0列 按列写入数据 格式 h_s
myObj.write_col(1, 0, l5, h_s)
# 1行,1列 按行写入多组数据 格式 s2
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)
# 设置第0列宽度为 15
myObj.set_col_width(0, 15)
# 设置第1、3列宽度为 20
myObj.set_col_width([1, 3], 20)
# 设置第0、1、2 行高度为 25
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')

示例图

统一设置行高方法