<?php /*** * CONFIGURATION - SET THESE */ $folder = "/mnt/hgfs/PentestOS/RootShell/cal_xls/"; // the path to the folder containing the XLS files dump $user = "Ross Marks"; // name in column A to search for /*** * MAIN PROGRAM DO NOT EDIT BELOW */ use Shuchkin\SimpleXLSX; $usermap = ""; // to store which sheet contains user details $concatMap = array(); // to store job lengths require_once __DIR__.'/SimpleXLSX.php'; // find latest file $files = glob($folder."*.xlsx"); $files = array_combine($files, array_map("filemtime", $files)); arsort($files); $latest_file = key($files); if ( $xlsx = SimpleXLSX::parse($latest_file) ) { // first find the users sheet for($i = 0; $i <= sizeof($xlsx->sheetNames()); $i++){ //echo $i." : ".$xlsx->sheetName($i)."\n"; if($xlsx->sheetName($i) == "User Map"){ $usermap = $i; //echo "Users sheet: $usermap\n"; } } //echo "User: ".$user."\n"; $ical = "BEGIN:VCALENDAR VERSION:2.0 PRODID:-//$user, Inc.//EN"; // all other sheets != usermap for($i = 0; $i <= sizeof($xlsx->sheetNames())-1; $i++){ if($xlsx->sheetName($i) != "User Map"){ // populate map of jobs > 1 day long foreach( $xlsx->worksheet($i)->mergeCells->mergeCell as $c ) { $vals = explode(":", $c['ref']); $concatMap[$i.'-'.$vals[0]] = $vals[1]; } //echo "### ".$xlsx->sheetName($i)." ###\n"; foreach( $xlsx->rowsEx($i) as $rowsEx){ for($j=1; $j<= sizeof($rowsEx)-2; $j++){ if(trim($rowsEx[0]['value']) == $user){ // found user if(trim($rowsEx[$j]['value']) <> "" && trim($rowsEx[$j]['value']) <> "."){ // if contains data //echo $j." ".$xlsx->sheetName($i)." : " .$rowsEx[$j]['value']."\n"; //print_r($rowsEx[$j]); $diff = 1; if(isset($concatMap[$i."-" .$rowsEx[$j]['name']])){ //echo "more than 1 day! \n"; $diff += getDiff($i."-" .$rowsEx[$j]['name'], $concatMap[$i."-" .$rowsEx[$j]['name']]); //echo $diff."\n"; } $ical .= " BEGIN:VEVENT UID:" .md5(uniqid(mt_rand(), true))." DTSTAMP:".gmdate("Ymd")."T".gmdate("His")."Z DTSTART:".date("Ymd", strtotime($j." ".$xlsx->sheetName($i))); if($diff >= 1) $ical .= "\nDTEND:".date("Ymd", strtotime($j." ".$xlsx->sheetName($i) ." +$diff day")); $ical .= " SUMMARY:Booking for ".$rowsEx[$j]['value']." END:VEVENT"; } } } } } } $ical .= " END:VCALENDAR"; header("Content-type: text/calendar; charset=utf-8"); header("Content-Disposition: inline; filename=calendar.ics"); echo $ical; } else { echo SimpleXLSX::parseError(); } function getDiff($start, $end){ $start = preg_replace("/[^A-Z]+/", "", $start); $end = preg_replace("/[^A-Z]+/", "", $end); $s1 = alphabet_to_number($start); $e1 = alphabet_to_number($end); return $e1 - $s1; //return 2; } function alphabet_to_number($string) { $string = strtoupper($string); $length = strlen($string); $number = 0; $level = 1; while ($length >= $level ) { $char = $string[$length - $level]; $c = ord($char) - 64; $number += $c * (26 ** ($level-1)); $level++; } return $number; } ?>