Foren
Neue Beiträge
Foren durchsuchen
Was ist neu?
Neue Beiträge
Profilnachrichten
Online
Anmelden
Registrieren
Aktuelles
Suche
Suche
Nur Titel durchsuchen
Von:
Neue Beiträge
Foren durchsuchen
Menü
Anmelden
Registrieren
App installieren
Installieren
Programmierung
JavaScript
Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen
JavaScript ist deaktiviert. Für eine bessere Darstellung aktiviere bitte JavaScript in deinem Browser, bevor du fortfährst.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen
alternativen Browser
verwenden.
Auf Thema antworten
Beitrag
[QUOTE="Sempervivum, post: 14070, member: 3917"] Den Namen muss man dann auch bei der Formatierung ausgeben. Ich habe mal versucht, alles Neue in meine Version einzuarbeiten, einschl. deiner Formatierung und Ausgabe. Auch das Zählen der MA, die in Pause sind, hatte ich in der Zwischenzeit ergänzt. [CODE]<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Excel-Daten auslesen</title> <style> #dropZone { border: 2px dashed #ccc; width: 300px; height: 200px; line-height: 200px; text-align: center; font-size: 18px; margin: 20px auto; } #loadingText { text-align: center; font-size: 18px; margin-bottom: 20px; display: none; /* Verstecke den Text standardmäßig */ } #outputTable th:nth-child(4), #outputTable td:nth-child(4) { display: none; /* Blende die Spalte "Dienstzeiten" aus */ } #pausenzeiten { display: block; height: auto; } </style> </head> <body> <h1>Excel-Daten auslesen</h1> <div id="loadingText">Daten werden berechnet...</div> <div id="dropZone">Datei hier ablegen</div> <table id="outputTable"> <thead> <tr> <th>Name</th> <th>Status</th> <th>Team</th> <th>Dienstzeiten</th> <th>Reale Dienstzeiten</th> </tr> </thead> <tbody id="outputBody"></tbody> </table> <div> <button>Pausenzeiten berechnen</button> </div> <div id="pausenzeiten"></div> <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> <script> const dropZone = document.getElementById('dropZone'); const outputBody = document.getElementById('outputBody'); const loadingText = document.getElementById('loadingText'); const excludedStatus = ['K', 'X', 'KU', 'ZA', 'U', 'x', 'PF']; // Liste der auszuschließenden Status // Datei per Drag & Drop hochladen dropZone.addEventListener('dragover', handleDragOver, false); dropZone.addEventListener('drop', handleFileSelect, false); function handleDragOver(e) { e.preventDefault(); } function handleFileSelect(e) { e.preventDefault(); const file = e.dataTransfer.files[0]; const reader = new FileReader(); loadingText.style.display = 'block'; // Zeige den Lade-Text an reader.onload = function (e) { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = getSheetName(); // Funktion, um den passenden Tabellennamen zu ermitteln const worksheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); let bereinigteDienstzeiten = []; for (let i = 5; i < 108; i++) { const name = jsonData[i][1]; const status = jsonData[i][0]; const team = jsonData[i][36]; // Spalte AK const dienstzeiten = getDienstzeiten(jsonData[i]); bereinigteDienstzeiten.push(getBereinigteDienstzeit(jsonData[i])); } console.log(bereinigteDienstzeiten); loadingText.style.display = 'none'; // Verstecke den Lade-Text, nachdem die Daten berechnet wurden let startEnd = {}; document.querySelector('button').addEventListener('click', startEnd = calculateBreakTimes.bind(bereinigteDienstzeiten) ); }; reader.readAsArrayBuffer(file); } function getSheetName() { const date = new Date(); const day = date.getDate(); const month = date.getMonth() + 1; const year = date.getFullYear(); const sheetName = `${getDayName(date.getDay())}${day}.${month < 10 ? '0' + month : month}.${year}`; return sheetName; } function getDayName(dayIndex) { const days = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']; return days[dayIndex]; } function getDienstzeiten(rowData) { let earliestTime = ''; let latestTime = ''; for (let i = 2; i < rowData.length; i++) { if (rowData[i] === 'T' || rowData[i] === 'M' || rowData[i] === 'R' || rowData[i] === 'W' || rowData[i] === 'E' || rowData[i] === 'H') { const startTime = getTimeFromIndex(i); const endTime = getTimeFromIndex(i + 1); if (!earliestTime) { earliestTime = startTime; } latestTime = endTime; } } if (earliestTime && latestTime) { return `${earliestTime} - ${latestTime}`; } else { return ''; } } function getTimeFromIndex(index) { const hours = Math.floor(index / 2) + 5; const minutes = index % 2 === 0 ? '00' : '30'; return `${hours < 10 ? '0' + hours : hours}:${minutes}`; } function getMinutes(timeStr) { const matches = timeStr.match(/(\d{2}):(\d{2})/); return Number(matches[1]) * 60 + Number(matches[2]); } function getTimeStr(minutes) { return String(Math.floor(minutes / 60)).padStart(2, '0') + ':' + String((minutes % 60)).padStart(2, '0'); } function getBereinigteDienstzeit(rowData) { let bereinigteDienstzeit = []; let startTime = null; let endTime = null; const name = rowData[1], team = rowData[36]; for (let i = 2; i < rowData.length - 1; i++) { const currentStatus = rowData[i]; if (currentStatus === 'P' || currentStatus === 'S') { if (startTime && endTime) { bereinigteDienstzeit.push({ name: name, team: team, fromStr: startTime, from: getMinutes(startTime), toStr: endTime, to: getMinutes(endTime) }); startTime = null; endTime = null; } } else if (currentStatus === 'T' || currentStatus === 'M' || currentStatus === 'H' || currentStatus === 'R' || currentStatus === 'W' || currentStatus === 'E') { if (!startTime) { startTime = getTimeFromIndex(i); } if (i + 1 < rowData.length) { endTime = getTimeFromIndex(i + 1); } } } if (startTime && endTime) { bereinigteDienstzeit.push({ name: name, team: team, fromStr: startTime, from: getMinutes(startTime), toStr: endTime, to: getMinutes(endTime) }); } return bereinigteDienstzeit; } </script> <script> function formatierePausenzeiten(pausenzeiten) { let formattedPausenzeiten = ''; pausenzeiten.forEach((item, idx) => { const mitarbeiterPausen = item.filter(dienstzeit => dienstzeit.pausenzeiten.length > 0); if (mitarbeiterPausen.length > 0) { formattedPausenzeiten += `<p><strong>Mitarbeiter ${mitarbeiterPausen[0].name}:</strong></p>`; mitarbeiterPausen.forEach(dienstzeit => { const pausenZeiten = dienstzeit.pausenzeiten.map(pausenzeit => getTimeStr(pausenzeit)); formattedPausenzeiten += `<p>Pausenzeiten: ${pausenZeiten.join(', ')}</p>`; }); } }); return formattedPausenzeiten; } function calculateBreakTimes(event) { const gewuenschtePausendauer = 10; // Gewünschte Pausendauer in Minuten const minPausenabstand = 40; // Mindestabstand zwischen den Pausen in Minuten const minPausenstart = 40; // Mindestzeit nach Dienstbeginn für die erste Pause in Minuten const maxMitarbeiter = 7; // Maximale Anzahl von Mitarbeitern zur selben Zeit let startDienstzeit = Infinity, endeDienstzeit = 0; let pausenzeiten = this.map((item, idx) => { item.forEach((dienstzeit, idx) => { if (dienstzeit.from < startDienstzeit) startDienstzeit = dienstzeit.from; if (dienstzeit.to > endeDienstzeit) endeDienstzeit = dienstzeit.to; // Leeres Array mit den Pausenzeiten einfügen dienstzeit.pausenzeiten = []; // Start- und Endezeit für die Pausen festlegen let pausenzeit = dienstzeit.from + minPausenstart; let letztePausenzeit = dienstzeit.to - minPausenabstand - gewuenschtePausendauer; // Solange die Endezeit nicht erreicht ist while (pausenzeit < letztePausenzeit) { // Pause einfügen dienstzeit.pausenzeiten.push(pausenzeit); pausenzeit += (minPausenabstand + gewuenschtePausendauer); } }); return item; }); // Anzahl der Mitarbeiter in Pause ermitteln let // Anzahl der Mitarbeiter in Pause für ein Zeitraster von 10 Minuten anzahlInPauseGesamt = [], // Anzahl der Pausen pro Team anzahlInPauseTeam = {}; pausenzeiten.forEach(item => { item.forEach(dienstzeit => { if (!anzahlInPauseTeam[dienstzeit.team]) anzahlInPauseTeam[dienstzeit.team] = [] dienstzeit.pausenzeiten.forEach(pause => { if (!anzahlInPauseGesamt[pause]) { anzahlInPauseGesamt[pause] = 1; } else { anzahlInPauseGesamt[pause]++; } if (!anzahlInPauseTeam[dienstzeit.team][pause]) { anzahlInPauseTeam[dienstzeit.team][pause] = 1; } else { anzahlInPauseTeam[dienstzeit.team][pause]++; } }); }); }); console.log(pausenzeiten); console.log(startDienstzeit, endeDienstzeit); anzahlInPauseGesamt.forEach((item, idx) => { console.log(idx, item); }); for (team in anzahlInPauseTeam) { anzahlInPauseTeam[team].forEach((item, idx) => { console.log('team:' + team + ' zeit:' + idx + ' anzahl:' + item); }); } // Den Inhalt des 'pausenzeiten'-Arrays in das 'pausenzeiten'-<div> einfügen const pausenzeitenDiv = document.getElementById('pausenzeiten'); pausenzeitenDiv.innerHTML = formatierePausenzeiten(pausenzeiten); } </script> </body> </html>[/CODE] [/QUOTE]
Zitate
Authentifizierung
Antworten
Programmierung
JavaScript
Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen
Oben
Unten