帮室友写了个脚本, 感觉还不错, 分享一波源码.

python + docx

前因

宿舍马大佬这两天在忙学生综合素质测评的工作. 马大佬给我们发了个word表格让我们填.

然而word表格不像execl, 它很不好计算.

为了减轻马大佬的工作量, 我帮马大佬用python写个程序, 读取二十多个word文件, 并提取其中的数据自动计算并生成目标文件作为结果.

经过投入使用, 最终效果还不错.

源码

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from docx import Document
from docx.shared import Inches
import numpy as np

the_number_of_files = 27 # 文件数
the_number_of_student = 27 # 学生数
the_number_of_item = 5 # 打分项目数

# 两个进度条函数需要的全局变量
the_number_of_times = 3 * the_number_of_files * the_number_of_student * the_number_of_item
times = 0

# 进度条函数
def show_progress():
per = round(30*(times / the_number_of_times))
print('['+'*'*per+' '*(30-per)+']')

def main():
global times
# 目标文件初始化
document_result = Document()
document_result.add_heading('学生互评分数计算结果')
table = document_result.add_table(rows=the_number_of_student+1, cols=the_number_of_item+1)

# 表格表头初始化
first_table = Document('1.docx').tables[0]
for n in range(1,the_number_of_item+1):
table.rows[0].cells[n].text = first_table.rows[2].cells[n].text

for n in range(1,the_number_of_student+1):
table.rows[n].cells[0].text = first_table.rows[3+n].cells[0].text


# 读文件, 取数据
data = [[[0]*(the_number_of_item+1)]*(the_number_of_student+1)]*(the_number_of_student+1)
arr = np.array(data)
for index_of_file in range(1,the_number_of_files+1):
source = Document(str(index_of_file)+'.docx').tables[0]
show_progress()
for index_of_rows in range(1,the_number_of_student+1):
for index_of_cells in range(1,the_number_of_item+1):
times += 2
# 有些憨憨把空空着不写, 得判断下
if len(source.rows[index_of_rows+3].cells[index_of_cells].text) > 0:
arr[index_of_file][index_of_rows][index_of_cells] = float(source.rows[index_of_rows+3].cells[index_of_cells].text)
else :
arr[index_of_file][index_of_rows][index_of_cells] = -1

# 算结果
for a in range(1,the_number_of_student+1):
show_progress()
for b in range(1,the_number_of_item+1):
temp = []
for c in range(1,the_number_of_files+1):
times += 1
if arr[c][a][b] > 0:
temp.append(arr[c][a][b])

# 删除最大值和最小值
del temp[temp.index(max(temp))]
del temp[temp.index(min(temp))]
table.rows[a].cells[b].text = str(round(sum(temp)/len(temp),2))

# 保存成目标文件
document_result.save('result.docx')

if __name__ == "__main__":
main()

后果

一时兴起的产物.

虽然代码写得很烂, 算法也朴实无华…

但确实帮到了室友, 我也学到了东西, 这让我感觉很棒.

也是第一次用python处理word, 感觉很有潜力, 未来可能还会深入的学习使用, 特别的来记录下.

2019/9/4 更新

  • 改善进度条的效果
  • 表头初始化优化, 大大缩短代码
  • 加入了更多注释
  • 修改了某些细节

或者点击下方为我打赏, 鼓励我写出更优质的脚本吧(手动滑稽)