Skip to main content

Rapporten

Inleiding

Om rapporten te maken voor studenten is een klein Python script gemaakt.

Zorg ervoor dat Python3 is geïnstalleerd, en dat  via PIP de juiste library's zijn geïnstalleerd.

pip install pandas

Benodigde bestanden

studenten.csv
Nr;Klas;Canvas Id;Student nr;Naam
1;3B;20576;2033543;Leonard Cranary
2;3C;26328;2140079;Walid Sallek
...

Dit bestand is een export van de Canvasmonitor waarbij niet relevante kolommen zijn weggehaald.

Dit bestand is leidend en de Id's worden gebruikt om een koppeling te maken met andere Excel lijsten.

De kolomnamen kunnen worden gebruikt om teksten in de template te vervangen. Zo kun je wordt _Klas_ in een template vervangen door de klas in dit overzicht.

template.docx

Dit is een Word-template (template.docx) waarbij de in-te-vullen velden worden gekenmerkt door een pre-fix en post fix, bijvoorbeeld:

_studentNaam_
Ander bestanden

Ander bestanden, presentie, blokken, kennis-check,.....

Afhankelijk van de gegevens die je nodig hebt kan je meerdere bestanden inlezen. Elk bestand dient een ID-kolom te hebben. Dit id moet het studentennummer bevatten dat overeenkomt met het studentnummer in de stundenten.csv.

De bestanden worden ingelezen in het codeblok vanaf regel 51.

Vanaf regel 90 worden de velden uit de template vervangen. 

Voorbeeld:

replace_text_in_doc(doc, "_kennis_", str(kennis.get(student_number, '???')))

In een van de ingelezen bestanden staat een kolom kennis. Deze wordt gematched uit kennis.csv via het student_number veld (uit studenten.csv).

Aanpassen in de code

Plaats de docenten en de klassen in de dictionary (regel 12 v/d code).

Code

import os, sys
# import chardet
import pandas as pd
from shutil import copyfile
from docx import Document


# Load the Excel file
cmon_excel = './studenten.csv'
word_template = './template.docx'
base_output_folder = './'
docent = { '3A':'Mina Ulas - Bicer', '3B':'Muhammed Çagli / Anton Boutkam', '3C':'Max Bisschop'}



# Define the function to replace text in the document
def replace_text_in_doc(doc, old_text, new_text):
    for paragraph in doc.paragraphs:
        if old_text in paragraph.text:
            paragraph.text = paragraph.text.replace(old_text, new_text)
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                replace_text_in_doc(cell, old_text, new_text)



def readExcel(excel_path):
    # with open(excel_path, 'rb') as file:
    #     result = chardet.detect(file.read())
    # print(f'Encoding {excel_path}: '+result['encoding'])
    try:
        excel_data = pd.read_csv(excel_path, sep=';', encoding='ISO-8859-1')
    except FileNotFoundError:
        sys.exit(f"The file {excel_path} was not found.")
    except pd.errors.EmptyDataError:
        sys.exit(f"The file {excel_path} is empty.")
    except pd.errors.ParserError:
        sys.exit(f"The file {excel_path} is probably not a CSV file or it is badly formatted.")
    except Exception as e:
        sys.exit(f"An unexpected error occurred in readExcel {excel_path}: {e}")
    return (excel_data)

def getDataFromExcel(file_name, column_name):
    data = readExcel(file_name)
    dict = {}
    for index, row in data.iterrows():
        dict[row['ID']] = row[column_name]
    return(dict)

presentie = getDataFromExcel('./presentie.csv', 'presentie')
kennis = getDataFromExcel('./kennis.csv', 'kennis')
# praktijk = getDataFromExcel('./canvas.csv', 'praktijk')
blok7 = getDataFromExcel('./canvas.csv', 'blok7')
blok8 = getDataFromExcel('./canvas.csv', 'blok8')
studieduur = getDataFromExcel('./canvas.csv', 'studieduur')

cmon = readExcel(cmon_excel)

# don't use the first column
# for index, row in cmon.iterrows():
#     print('---')
#     print(row)
#     print('---')


for index, row in cmon.iterrows():
    print(f"Processing {row['Naam']}")
    person_name = row['Naam']  # Adjust the column name as necessary
    group_name = row['Klas']  # Adjust the column name as necessary
    student_number = row['Student nr']

    # Create a new file name with prefix "voortgang"
    new_file_name = f"voortgang {student_number} {person_name} {group_name}.docx"

    # Create a path for the new group folder if it doesn't exist
    group_folder_path = os.path.join(base_output_folder, group_name)
    if not os.path.exists(group_folder_path):
        os.makedirs(group_folder_path)

    # Define the full path for the new file within the group folder
    new_file_path = os.path.join(group_folder_path, new_file_name)

    # Copy the template to the new file name in the group folder

    doc = Document(word_template)
    replace_text_in_doc(doc, "_studentnaam_", person_name)
    replace_text_in_doc(doc, "_docentnaam_", str(docent.get(group_name, '???')))
    replace_text_in_doc(doc, "_studentnummer_", str(student_number))
    replace_text_in_doc(doc, "_presentie_", str(presentie.get(student_number, '???')))
    replace_text_in_doc(doc, "_kennis_", str(kennis.get(student_number, '???')))
    replace_text_in_doc(doc, "_praktijk_", str(praktijk.get(student_number, '???')))
    replace_text_in_doc(doc, "_blok7_", str(blok7.get(student_number, '???')))
    replace_text_in_doc(doc, "_blok8_", str(blok8.get(student_number, '???')))
    replace_text_in_doc(doc, "_studieduur_", str(studieduur.get(student_number, '???')))
    doc.save(new_file_path)
    print(f"File created for: {person_name} in group: {group_name}")
    # sys.exit("Test")

print("All files have been created.")

Voorbeeld extra databestanden

(bovenstaande code werkt met deze bestanden).template.docx

presentie.csv
Deelnemer;% Aanwezig;Nr;ID;presentie
2186011 - Yusuf Aksari;96;1;2186011;96
2132925 - Ibrahim Azarfane;13;2;2132925;13
...

canvas.csv (voor voortgang blokken, uit de Canvas monitor)

Rank;ID;Klas;Student;Studentnaam;Tot;blok7;blok8;Voortgang;studieduur;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;;praktijk;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;Naam
7350;2184477;3D;Student;Giovanni Deniz;36;Ja;Ja;3653;3-;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;100;;0;100;100;100;100;100;0;100;100;13;100;100;100;100;100;40;GiovanniD|/public/index|code|935315184868c08dc18c67ff3f4d3645
.....

kennis.csv (voor kennis-check)

ID;Naam;kennis
2202160;Alie Abduka;73,0
2197436;André Romburg;76,5
...