Запуск script1.Vbs:
cscript //nologo script1.vbs data1.xml
-
Создали скрипт script2.vbs, считывающий информацию об успеваемости студентов группы из data1.xml, заносящий её в книгу Excel и сохраняющий последний документ под именем «Название группы.xls» в каталоге, из которого запущен скрипт. Заносить необходимо следующую информацию: наименования дисциплин, по которым студенты сдавали зачёт, и количество студентов, сдавших зачёт (для каждой дисциплины); наименования предметов, по которым студенты сдавали экзамен, и средний балл за экзамен по каждому предмету.
На рисунке 5 представлено содержимое папки после выполнения script2.vbs
Рисунок 5 — Папка после выполнения script2.vbs
На рисунке 6 показано содержимое обрабатываемой скриптом книги Excel.
Рисунок 6 — Результат работы script2.vbs
Текст script2.Vbs:
REM---------------------------------------Функция позволяет получить значение текста в
REM --------------------------------------первом дочернем узле tagName узла tagNode
Function GetTagVal(tagNode, tagName)
Dim Value
Set Value=tagNode.getElementsByTagName(tagName)
If Value.length>0 Then
GetTagVal=Value.item(0).text
Else GetTagVal=""
End If
End Function
REM------------------------------------------
Dim docXML, objExcel, WBE, objArgs, root, group, groupStud, z, dicZ, dicStudZ
Dim count, dicEkz, dicStudEkz, sum
Set docXML=WScript.CreateObject("Microsoft.XMLDOM")
Set objArgs=WScript.Arguments
If NOT(docXML.load(objArgs(0))) Then
WScript.Echo "Ошибка при загрузке списка студентов xml"
WScript.Quit
End If
REM--------------------------------------Корневой узел документа xml(УспеваемостьСтудентов)
Set root=docXML.documentElement
REM--------------------------------------Узел "Группа" (единственный для документа)
Set group=root.childnodes.item(0)
Set objExcel=WScript.CreateObject("Excel.Application")
REM-----------------------------------Объект Dictionary для создания коллекции данных
REM---------------------------------- (ассоциативная структура "ключ"-"значение")
REM-------------------------------------DicZ для хранения названий зачётных предметов
Set dicZ=WScript.CreateObject("Scripting.Dictionary")
REM-------------------------------------DicStudZ для хранения числа студентов, получивших
REM----------------------------------------------------------зачёт по зачётным предметам
Set dicStudZ=WScript.CreateObject("Scripting.Dictionary")
REM----------------------------------------------------------DicEkz для хранения названий
REM----------------------------------------------------------экзаменационных предметов
Set dicEkz=WScript.CreateObject("Scripting.Dictionary")
REM----------------------------------------------------------DicStudEkz для хранения среднего балла
REM----------------------------------------------------------по каждому экзамену
Set dicStudEkz=WScript.CreateObject("Scripting.Dictionary")
REM----------------------------------------------------------Новая книга Excel
Set WBE=objExcel.WorkBooks.Add
objExcel.Visible=true
objExcel.Cells(1,1).Value="Зачёт"
REM----------------------------------------------------------Коллекция узлов "Студент"
Set groupStud=group.GetElementsByTagName("Студент")
For Each stud in groupStud
REM---------------------------------------Коллекция узлов "Предмет" (для каждого)
REM--------------------------------------------------------------студента
Set predmet=stud.GetElementsByTagName("Предмет")
REM------------------------------------------Знаем, что предметов 5, выбираем студента,
REM---------------------------------который сдал все предметы, чтобы отобрать зачётные
if predmet.length=5 Then
for each pr in predmet
REM---------------------------------------------Коллекция узлов "Семестр" (для каждого)
REM-----------------------------------------------------------------предмета
Set semestr=pr.GetElementsByTagName("Семестр")
for each sem in semestr
Set z=sem.GetElementsByTagName("Зачёт")
REM-------------------------------------Если в семестре есть узел "Зачёт",добавляем
REM----------------------------------------название предмета в словарь DicZ под ключом,
REM-------------------------------------------------------соответствующим названию предмета
if z.length<>0 Then
dicZ.Add GetTagVal(pr, "НазваниеПредмета"), GetTagVal(pr, "НазваниеПредмета")
Exit For
End if
Next
Next
Exit For
End If
Next
REM-----------Вводим в книгу названия зачётных предметов (со 2 строки, в 1 столбец)
i=2
For each key in dicZ
objExcel.Cells(i, 1).Value=dicZ.item(key)
i=i+1
Next
REM--счётчик студентов, получивших зачёт по предмету
count=0
REM-------------------Для каждого зачётного предмета (перебор в словаре по ключу)
For each key in dicZ
For Each stud in groupStud
Set predmet=stud.GetElementsByTagName("Предмет")
for each pr in predmet
REM-------------------------------------------------------------------------Если предмет зачётный
if GetTagVal(pr, "НазваниеПредмета")=dicZ.item(key) Then
Set semestr=pr.GetElementsByTagName("Семестр")
for each sem in semestr
Set z=sem.GetElementsByTagName("Зачёт")
REM------------------------------Если у студента зачёт, увеличиваем счётчик на 1
if z.item(0).text="зачтено" Then
count=count+1
Exit For
End if
Next
Exit for
End if
Next
Next
REM------------------------Добавляем под ключом, соответствующим названию предмета,
REM---------------в нужную библиотеку число студентов, получивших по предмету зачёт
dicStudZ.Add key, count
REM----------------------Для нового предмета счётчик обнуляется
count=0
Next
i=2
REM-----------Вводим в книгу количества студентов (со 2 строки, во 2 столбец)
For each key in dicStudZ
objExcel.Cells(i, 2).Value=dicStudZ.item(key)
i=i+1
Next
objExcel.Cells(1,5).Value="Экзамен"
REM------------------------Составление списка предметов с экзаменом
For Each stud in groupStud
Set predmet=stud.GetElementsByTagName("Предмет")
if predmet.length=5 Then
for each pr in predmet
Set semestr=pr.GetElementsByTagName("Семестр")
for each sem in semestr
Set z=sem.GetElementsByTagName("Экзамен")
if z.length<>0 Then
dicEkz.Add GetTagVal(pr, "НазваниеПредмета"), GetTagVal(pr, "НазваниеПредмета")
Exit For
End if
Next
Next
Exit For
End If
Next
i=2
REM-----Вводим в книгу названия зэкзаменационных предметов (со 2 строки, в 5 столбец)
For each key in dicEkz
objExcel.Cells(i, 5).Value=dicEkz.item(key)
i=i+1
Next
REM-----------count -- число студентов, сдававших экзамен
count=0
REM-----------sum -- общая сумма баллов по экзамену
sum=0
For each key in dicEkz
For Each stud in groupStud
Set predmet=stud.GetElementsByTagName("Предмет")
for each pr in predmet
if GetTagVal(pr, "НазваниеПредмета")=dicEkz.item(key) Then
Set semestr=pr.GetElementsByTagName("Семестр")
for each sem in semestr
Set z=sem.GetElementsByTagName("Экзамен")
REM----------------------------------------Если в семестре был экзамен
if z.length<>0 Then
REM-----------------------------------------Увеличиваем число сдавших студентов
count=count+1
REM-------------------------------------------------Увеличиваем сумму баллов на балл студента
sum=sum+CInt(z.item(0).text)
Exit for
End if
Next
Exit for
End if
Next
Next
REM----------------Вычисляем средний балл по предмету
sum=sum/count
REM-------------------------Запись среднего балла в соответствующую библиотеку с ключом,
REM--------------------------соответствующим названию предмета
dicStudEkz.Add key, sum
count=0
sum=0
Next
i=2
REM-----------Вводим в книгу средние баллы (со 2 строки, 6 столбец)
For each key in dicStudEkz
objExcel.Cells(i, 6).Value=dicStudEkz.item(key)
i=i+1
Next
objExcel.ActiveWorkBook.SaveAs("C:\LR7\"&group.childnodes.item(0).text&".xls")
REM-------------------------------
REM-----------Закрываем книгу
WBE.Close
REM-----------Очищение объектов-библиотек от данных
dicZ.RemoveAll
dicStudZ.RemoveAll
dicEkz.RemoveAll
dicStudEkz.RemoveAll