通过VBA和Python把excel的结果数据转化成word点评
前言:我有一项月度工作,需要对代理商进行指标分析,有十几个指标,每个指标有一定的比例,最后得出每个代理商的分数和排名。成品的样子是这样的:
但是到这里仅仅是excel,领导觉得还不够,需要转化为word的点评,成品是这样的:
如果光靠手动写的话,不仅需要很长时间,而且还很容易出错,所以我第一步做了一个辅助sheet,使得结果能够根据标准得出具体的文字:
其中C1的数值是做了有效性,可以根据筛选,使得A4:E16的结果变化,在F20做了公式,使得结果直接出来,G20则是选择性黏贴的结果。
但是到这里还不够,因为代理商比较多,我还需要一个个手动筛选并复制黏贴,而且每个月的代理商排名不同导致最后复制黏贴的顺序也不同,所以使用VBA先把所有代理商的结果批量复制黏贴出来,同时排序,成品如下:
VBA代码如下:
Sub 文字刷新()
Dim i As Integer
For i = 2 To 13
Sheets("文字结果").Range("A" & i).Copy Sheets("模板").Range("C1")
Sheets("模板").Select
Range("F20").Select
Selection.Copy
Sheets("文字结果").Select
Range("E" & i).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next
'下面的代码就是把顺序排列了一下
Range("D3").Select
ActiveWorkbook.Worksheets("文字结果").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("文字结果").Sort.SortFields.Add2 Key:=Range("D3"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("文字结果").Sort
.SetRange Range("A2:E13")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
接下来再用Python把单元格的结果根据顺序导出到txt(其实可以直接word,后续再优化),代码如下:
import os
from win32com.client import Dispatch
def chinese_rank(jjc_range):
if jjc_range == 1:
return "第一名:"
elif jjc_range == 2:
return "第二名:"
elif jjc_range == 3:
return "第三名:"
elif jjc_range == 4:
return "第四名:"
elif jjc_range == 5:
return "第五名:"
elif jjc_range == 6:
return "第六名:"
else:
print("好像有点问题,确认一下代码或者代理商数量!")
this_path = os.path.abspath('.')
excel_path = this_path + '\\2018年浦东实体门店和代理商月度评估.xlsm'
xl = Dispatch("Excel.Application")
xl.Visible = False #True是显示, False是隐藏
xl.DisplayAlerts = 0
xlBook = xl.Workbooks.Open(excel_path,False)
xs = xlBook.Sheets('文字结果')
with open('代理商点评.txt', 'a', encoding='gbk') as file:
for i in range(2,14):
name = xs.Cells(i, 1).Value
score = str(float('%.1f' % xs.Cells(i, 2).Value))
jjc_range = xs.Cells(i, 3).Value
total_range = xs.Cells(i, 4).Value
dianping = xs.Cells(i, 5).Value
zyjjc_rank = chinese_rank(jjc_range)
file.write(zyjjc_rank + name + '(' + score + '分)')
file.write('\n')
file.write(dianping)
file.write('\n')
xl.quit()
最后成品如下: