主要用插件 XlsxWriter(https://xlsxwriter.readthedocs.io/index.html)
好处
1.合并单元格,颜色,都比较方便,据说比xlwt 屌
按钮触发
xxxxxxxxxx
1
multi .
2
def export_train_run_notice_excel(self):
3
return {
4
'type': 'ir.actions.act_url',
5
'target': 'self',
6
'url': '/construction_dispatch/train_run_notice_excel',
7
}
8
已复制
通过url 去触发controller
controller 端,通过ByteIO,写内存,然后respone返回
xxxxxxxxxx
1
from io import BytesIO
2
3
route('/construction_dispatch/train_run_notice_excel', type='http', auth="user") .
4
def export_train_run_notice_excel(self, **kwargs):
5
buffer_xlsx = BytesIO()
6
workbook = xlsxwriter.Workbook(buffer_xlsx)
7
worksheet = workbook.add_worksheet()
8
9
。。。
10
11
workbook.close()
12
buffer_xlsx.seek(0)
13
response = request.make_response(buffer_xlsx.read(),
14
headers=[('Content-Type', 'application/vnd.ms-excel'),
15
('Content-Disposition', 'attachment; filename={}'.format(
16
"行车通告.xlsx".encode().decode('latin-1')
17
))],
18
cookies={'fileToken': '123'}) #token没啥用样
19
return response
已复制
测试代码,xlsxwiter的
xxxxxxxxxx
1
import xlsxwriter
2
3
4
def writeImport():
5
# 1,048,576 limit row
6
workbook = xlsxwriter.Workbook('hello.xlsx', {'constant_memory': True})
7
worksheet = workbook.add_worksheet()
8
9
COLOR_MAP = {
10
'yes': 'red',
11
'no': '#50bf85',
12
'no_electric_grand_line': '#159588',
13
'repeatedly_electric': '#e36c09'
14
}
15
16
merge_format_title = workbook.add_format({ #可以设置color 给font设置颜色
17
'font_size': '20',
18
'bold': True,
19
'border': 1,
20
'align': 'center', # 水平居中
21
'valign': 'vcenter', # 垂直居中
22
})
23
format_title1 = workbook.add_format({
24
'font_size': '16',
25
'bold': True,
26
'border': 1,
27
'align': 'center', # 水平居中
28
'valign': 'vcenter', # 垂直居中
29
})
30
format_title2 = workbook.add_format({
31
'font_size': '11',
32
'bold': True,
33
'border': 1,
34
'align': 'center', # 水平居中
35
'valign': 'vcenter', # 垂直居中
36
})
37
format_row = workbook.add_format({
38
'font_size': '10',
39
'bold': True,
40
'border': 1,
41
'align': 'center', # 水平居中
42
'valign': 'vcenter', # 垂直居中
43
'text_wrap': True
44
})
45
46
# 设置默认列宽度
47
worksheet.set_column('A:A', 5)
48
worksheet.set_column('B:B', 18)
49
worksheet.set_column('C:C', 18)
50
worksheet.set_column('D:D', 18)
51
worksheet.set_column('E:E', 28)
52
worksheet.set_column('F:F', 28)
53
worksheet.set_column('G:G', 34)
54
worksheet.set_column('H:H', 17)
55
worksheet.set_column('I:I', 22)
56
worksheet.set_column('J:J', 15)
57
worksheet.set_column('K:K', 32)
58
59
row_num = 0
60
MAX_COL = 10
61
62
def writeDateTitle(row_num, text):
63
worksheet.merge_range(row_num, 0, row_num, MAX_COL,
64
'2018年11月22日(周三)', format_title1)
65
worksheet.set_row(row_num, 25)
66
67
def writePlanTypeRow(row_num, text):
68
for i in range(MAX_COL+1):
69
if i == 0:
70
worksheet.write(row_num, i, text, format_title2)
71
else:
72
worksheet.write(row_num, i, '', format_row)
73
74
def writePlanTitleRow(row_num, row_count):
75
TITLES = ['项', '作业令号', '作业时间', '施工单位', '作业内容', '作业区域', '接触网供电安排',
76
'防护措施', '配合单位及内容', '施工负责人', '备注']
77
for i in range(MAX_COL+1):
78
worksheet.write(row_num, i, TITLES[i], format_title2)
79
worksheet.autofilter('A4:K4') #设置autofilter
80
81
# 第一行
82
worksheet.merge_range(row_num, 0, row_num, MAX_COL,
83
'施工及行车通告', merge_format_title) #合并单元格
84
row_num += 1
85
worksheet.set_row(0, 40)
86
87
writeDateTitle(row_num, '2018年11月22日(周三)')
88
row_num += 1
89
writePlanTypeRow(row_num, '周计划')
90
row_num += 1
91
92
rows = [
93
['1', '2', '3', '4', '5独立开发就算了会计法打死了解放路口的设计费两款手机发了多少解放路看时间分类看电视解放东路开始解放路口束带结发',
94
'6', '7', '8', '9', '10', '11'],
95
['2', '2', '3', '4', '5独立开发就算了会计法打死了解放路口的设计费两款手机发了多少解放路看时间分类看电视解放东路开始解放路口束带结发',
96
'6', '7', '8', '9', '10', '11'],
97
]
98
99
writePlanTitleRow(row_num, len(rows))
100
row_num += 1
101
102
for row in rows:
103
for i in range(MAX_COL+1):
104
if i < len(row):
105
worksheet.write(row_num, i, row[i], format_row)
106
else:
107
worksheet.write(row_num, i, '', format_row)
108
row_num += 1
109
110
#...loop
111
writeDateTitle(row_num, '2018年11月22日(周三)')
112
row_num += 1
113
writePlanTypeRow(row_num, '周计划')
114
row_num += 1
115
116
rows = [
117
['1', '2', '3', '4', '5独立开发就算了会计法打死了解放路口的设计费两款手机发了多少解放路看时间分类看电视解放东路开始解放路口束带结发',
118
'6', '7', '8', '9', '10', '11'],
119
['2', '2', '3', '4', '5独立开发就算了会计法打死了解放路口的设计费两款手机发了多少解放路看时间分类看电视解放东路开始解放路口束带结发',
120
'6', '7', '8', '9', '10', '11'],
121
]
122
123
writePlanTitleRow(row_num, len(rows))
124
row_num += 1
125
for row in rows:
126
for i in range(MAX_COL+1):
127
if i < len(row):
128
worksheet.write(row_num, i, row[i], format_row)
129
else:
130
worksheet.write(row_num, i, '', format_row)
131
row_num += 1
132
133
workbook.close()
134
135
136
writeImport()
137
已复制