From fc7e25992b9a3c91d9578b962c809c68393b0dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Wed, 24 Jun 2009 08:08:25 +0000 Subject: [PATCH] Statistiken Umstellung auf Datenbankklasse --- content/lvplanung/lehrveranstaltungDBDML.php | 4 +- .../lvplanung/lehrveranstaltungoverlay.js.php | 4 +- content/statistik/absolventen.xls.php | 22 +- content/statistik/absolventenstatistik.php | 61 +- content/statistik/alvsstatistik.php | 30 +- content/statistik/anwesenheitsliste.php | 18 +- content/statistik/bewerberstatistik.php | 56 +- content/statistik/bewerberstatistik.svg.php | 96 +- content/statistik/bewerberstatistik.xls.php | 275 -- content/statistik/dokumente.xls.php | 39 +- content/statistik/koordinatorstunden.php | 22 +- content/statistik/laenderstatistik.php | 157 - content/statistik/lehrauftragsgesamtliste.php | 38 +- .../statistik/lehrauftragsliste_gst.xls.php | 39 +- .../statistik/lehrauftragsliste_mail.xls.php | 62 +- content/statistik/lektorenstatistik.php | 54 +- content/statistik/lvplanung.php | 43 +- content/statistik/lvplanung.xls.php | 133 +- content/statistik/lvplanunggesamtsj.php | 49 +- content/statistik/mitarbeiterexport.xls.php | 57 +- content/statistik/mitarbeiterstatistik.php | 28 +- content/statistik/notenspiegel.php | 70 +- content/statistik/oeh_beitraege.xls.php | 269 +- content/statistik/projektarbeitexport.xls.php | 39 +- content/statistik/studentenexport.xls.php | 205 +- .../statistik/studentenexportextended.xls.php | 209 +- content/statistik/studentenprosemester.php | 35 +- content/statistik/studentenstatistik.php | 68 +- include/Excel/Workbook.php | 3119 +++++++++-------- include/basis_db.class.php | 4 +- include/pgsql.class.php | 8 + 31 files changed, 2457 insertions(+), 2856 deletions(-) delete mode 100644 content/statistik/bewerberstatistik.xls.php delete mode 100644 content/statistik/laenderstatistik.php diff --git a/content/lvplanung/lehrveranstaltungDBDML.php b/content/lvplanung/lehrveranstaltungDBDML.php index 42557a3be..d9b733ec9 100644 --- a/content/lvplanung/lehrveranstaltungDBDML.php +++ b/content/lvplanung/lehrveranstaltungDBDML.php @@ -100,9 +100,9 @@ if(!$error) FROM lehre.tbl_lehrveranstaltung, lehre.tbl_lehreinheit, lehre.tbl_lehrfach WHERE tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id AND tbl_lehreinheit.lehrfach_id=tbl_lehrfach.lehrfach_id AND lehreinheit_id='".addslashes($_POST['lehreinheit_id'])."'"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - if($row = pg_fetch_object($result)) + if($row = $db->db_fetch_object($result)) { if(!$rechte->isBerechtigt('admin', $row->studiengang_kz, 'suid') && !$rechte->isBerechtigt('assistenz', $row->studiengang_kz, 'suid') && diff --git a/content/lvplanung/lehrveranstaltungoverlay.js.php b/content/lvplanung/lehrveranstaltungoverlay.js.php index e07d311a3..eca48933f 100644 --- a/content/lvplanung/lehrveranstaltungoverlay.js.php +++ b/content/lvplanung/lehrveranstaltungoverlay.js.php @@ -1779,7 +1779,7 @@ function LehrveranstaltungNotenDelete() col = tree.columns ? tree.columns["lehrveranstaltung-noten-tree-studiensemester_kurzbz"] : "lehrveranstaltung-noten-tree-studiensemester_kurzbz"; stsem = tree.view.getCellText(tree.currentIndex,col); - if(confirm('Wollen Sie diese Note wirklich löschen')) + if(confirm('Wollen Sie diese Note wirklich l�schen')) { var url = 'content/student/studentDBDML.php'; var req = new phpRequest(url,'',''); @@ -1823,7 +1823,7 @@ function LeMitarbeiterGesamtkosten() else gesamtkosten = 0; - document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-gesamtkosten').value=gesamtkosten.toFixed(2)+' €'; + document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-gesamtkosten').value=gesamtkosten.toFixed(2)+' €'; if(gesamtkosten<=0) document.getElementById('lehrveranstaltung-lehreinheitmitarbeiter-label-gesamtkosten').setAttribute("style",'color: red'); diff --git a/content/statistik/absolventen.xls.php b/content/statistik/absolventen.xls.php index 5151faa42..699e25841 100644 --- a/content/statistik/absolventen.xls.php +++ b/content/statistik/absolventen.xls.php @@ -24,35 +24,33 @@ * Exportiert eine Liste der Absolventen in ein Excel File. * Das betreffende Studiensemester wird uebergeben. */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/Excel/excel.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/studiensemester.class.php'); -// Datenbank Verbindung -if (!$conn = pg_pconnect(CONN_STRING)) - die('Es konnte keine Verbindung zum Server aufgebaut werden!'); - //Parameter holen $studiensemester_kurzbz = isset($_GET['studiensemester_kurzbz'])?$_GET['studiensemester_kurzbz']:''; +$db = new basis_db(); if($studiensemester_kurzbz!='') { // Creating a workbook $workbook = new Spreadsheet_Excel_Writer(); - + $workbook->setVersion(8); // sending HTTP headers $workbook->send("Absolventenstatistik". "_".$studiensemester_kurzbz.".xls"); // Creating a worksheet $worksheet =& $workbook->addWorksheet("Absolventenstatistik"); - + $worksheet->setInputEncoding('utf-8'); + $format_bold =& $workbook->addFormat(); $format_bold->setBold(); $stg_arr=array(); - $studiengang = new studiengang($conn); + $studiengang = new studiengang(); $studiengang->getAll('typ, kurzbzlang', false); foreach ($studiengang->result as $row) $stg_arr[$row->studiengang_kz] = $row->kuerzel; @@ -85,9 +83,9 @@ if($studiensemester_kurzbz!='') public.get_rolle_prestudent (prestudent_id, '$studiensemester_kurzbz')='Absolvent' ORDER BY studiengang_kz, nachname, vorname"; - if($result = pg_query($conn, $qry)) + if($db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { $zeile++; $spalte=0; @@ -113,6 +111,8 @@ if($studiensemester_kurzbz!='') $maxlength[$spalte]=strlen($row->geschlecht); } } + else + die('Fehlerhafte Qry:'.$qry); //Die Breite der Spalten setzen foreach($maxlength as $i=>$breite) @@ -137,7 +137,7 @@ else echo '
'; echo 'Studiensemester: '; - $studsem = new studiensemester($conn); + $studsem = new studiensemester(); $studsem->getAll(); foreach ($studsem->studiensemester as $stsemester) @@ -101,33 +98,33 @@ if($stsem!='') //Bachelor $qry = "SELECT studiengang_kz, kurzbz, typ, kurzbzlang, bezeichnung, orgform_kurzbz, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' ) a) AS gesamt_stg, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND typ='b' + WHERE status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND typ='b' ) a) AS gesamt_alle, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND orgform_kurzbz='BB' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND orgform_kurzbz='BB' ) a) AS bb, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND orgform_kurzbz='VZ' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND orgform_kurzbz='VZ' ) a) AS vz, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='w' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='w' ) a) AS w, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' ) a) AS m, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' AND nation_code='A' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' AND nation_code='A' ) a) AS herkunft_at, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' AND eu AND nation_code<>'A' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' AND eu AND nation_code<>'A' ) a) AS herkunft_eu, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' AND NOT eu + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' AND NOT eu ) a) AS herkunft_noteu, true FROM @@ -135,8 +132,8 @@ if($stsem!='') WHERE studiengang_kz>0 AND studiengang_kz<10000 AND aktiv AND typ='b' ORDER BY typ, kurzbzlang; "; - //echo '
'.$qry.'


'; - if($result = pg_query($conn, $qry)) + $db = new basis_db(); + if($db->db_query($qry)) { $gesamt=0; @@ -148,11 +145,11 @@ if($stsem!='') $gesamt_at=0; $gesamt_eu=0; $gesamt_noteu=0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { echo ''; echo ' '; - echo "".strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)"; + echo "".mb_strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)"; $prozent = ($row->gesamt_alle!=0?$row->gesamt_stg/$row->gesamt_alle*100:0); echo "$row->gesamt_stg / ".sprintf('%0.2f', $prozent)." %"; echo "$row->bb / $row->vz"; @@ -198,33 +195,33 @@ if($stsem!='') '; $qry = "SELECT studiengang_kz, kurzbz, typ, kurzbzlang, bezeichnung, orgform_kurzbz, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' ) AS gesamt_stg, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND typ='m' + WHERE status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND typ='m' ) AS gesamt_alle, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND orgform_kurzbz='BB' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND orgform_kurzbz='BB' ) AS bb, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND orgform_kurzbz='VZ' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND orgform_kurzbz='VZ' ) AS vz, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='w' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='w' ) AS w, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' ) AS m, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' AND nation_code='A' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' AND nation_code='A' ) AS herkunft_at, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' AND eu AND nation_code<>'A' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' AND eu AND nation_code<>'A' ) AS herkunft_eu, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' AND NOT eu + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Absolvent' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' AND NOT eu ) AS herkunft_noteu, true FROM @@ -232,8 +229,8 @@ if($stsem!='') WHERE studiengang_kz>0 AND studiengang_kz<10000 AND aktiv AND typ='m' ORDER BY typ, kurzbzlang; "; - //echo '
'.$qry.'


'; - if($result = pg_query($conn, $qry)) + + if($db->db_query($qry)) { $gesamt=0; @@ -245,11 +242,11 @@ if($stsem!='') $gesamt_at=0; $gesamt_eu=0; $gesamt_noteu=0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { echo ''; echo ' '; - echo "".strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)"; + echo "".mb_strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)"; $prozent = ($row->gesamt_alle!=0?$row->gesamt_stg/$row->gesamt_alle*100:0); echo "$row->gesamt_stg / ".sprintf('%0.2f', $prozent)." %"; echo "$row->bb / $row->vz"; diff --git a/content/statistik/alvsstatistik.php b/content/statistik/alvsstatistik.php index 28fb32a54..8b97dd807 100644 --- a/content/statistik/alvsstatistik.php +++ b/content/statistik/alvsstatistik.php @@ -19,30 +19,26 @@ * Andreas Oesterreicher and * Rudolf Hangl . */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/fachbereich.class.php'); require_once('../../include/Excel/excel.php'); -if(!$conn = pg_pconnect(CONN_STRING)) - die('Fehler beim Connecten zur Datenbank'); - $user = get_uid(); -loadVariables($conn, $user); +loadVariables($user); $stsem = (isset($_GET['stsem'])?$_GET['stsem']:$semester_aktuell); - $format = (isset($_GET['format'])?$_GET['format']:''); -$studiengang = new studiengang($conn); +$studiengang = new studiengang(); $studiengang->getAll('typ, kurzbz', false); $stg_arr = array(); foreach ($studiengang->result as $row) $stg_arr[$row->studiengang_kz] = $row->kuerzel.' ('.$row->kurzbzlang.')'; -$fachbereich = new fachbereich($conn); +$fachbereich = new fachbereich(); $fachbereich->getAll(); $fb_arr = array(); @@ -60,7 +56,7 @@ SELECT * FROM ( lehre.tbl_lehreinheitmitarbeiter WHERE tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id AND - tbl_lehreinheit.studiensemester_kurzbz='$stsem' AND + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($stsem)."' AND tbl_lehreinheit.lehrfach_id = tbl_lehrfach.lehrfach_id AND tbl_lehreinheitmitarbeiter.semesterstunden<>0 AND faktor<>0 AND @@ -70,13 +66,13 @@ SELECT * FROM ( ) as a JOIN public.tbl_studiengang USING(studiengang_kz) ORDER BY typ, tbl_studiengang.kurzbz, fachbereich_kurzbz "; - -if(!$result = pg_query($conn, $qry)) +$db = new basis_db(); +if(!$db->db_query($qry)) die('Fehler bei Datenbankabfrage'); $fachbereiche = array(); -while($row = pg_fetch_object($result)) +while($row = $db->db_fetch_object()) { if(!in_array($row->fachbereich_kurzbz, $fachbereiche)) $fachbereiche[] = $row->fachbereich_kurzbz; @@ -100,13 +96,13 @@ WHERE tbl_projektbetreuer.faktor<>0 AND tbl_projektbetreuer.stunden<>0 AND tbl_projektbetreuer.stundensatz<>0 AND - tbl_lehreinheit.studiensemester_kurzbz='$stsem' + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($stsem)."' GROUP BY studiengang_kz"; -if(!$result = pg_query($conn, $qry)) +if(!$result = $db->db_query($qry)) die('Fehler bei DB-Abfrage'); -while($row = pg_fetch_object($result)) +while($row = $db->db_fetch_object()) $data[$row->studiengang_kz]['betreuungen']=$row->stunden; if($format=='xls') @@ -116,10 +112,10 @@ if($format=='xls') // sending HTTP headers $workbook->send("ALVSStatistik_".$stsem.".xls"); - + $workbook->setVersion(8); // Creating a worksheet $worksheet =& $workbook->addWorksheet("ALVSStatistik"); - + $worksheet->setInputEncoding('utf-8'); //Formate Definieren $format_bold =& $workbook->addFormat(); $format_bold->setBold(); diff --git a/content/statistik/anwesenheitsliste.php b/content/statistik/anwesenheitsliste.php index e90e13ccd..73b272adb 100644 --- a/content/statistik/anwesenheitsliste.php +++ b/content/statistik/anwesenheitsliste.php @@ -22,16 +22,13 @@ /* * Generiert eine Anwesenheitsliste mit Fotos */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/datum.class.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/akte.class.php'); -if (!$conn = pg_pconnect(CONN_STRING)) - $error_msg='Es konnte keine Verbindung zum Server aufgebaut werden!'; - -$stg_obj = new studiengang($conn); +$stg_obj = new studiengang(); $stg_obj->getAll('typ, kurzbzlang', false); //Uebergabeparameter abpruefen @@ -109,23 +106,24 @@ else $qry.=" AND lehreinheit_id='".addslashes($lehreinheit_id)."'"; } -echo ' +echo ' + Anwesenheitsliste

Studentenliste - '.date('d.m.Y').'


'; - -if($result = pg_query($conn, $qry)) +$db = new basis_db(); +if($result = $db->db_query($qry)) { echo ""; echo ''; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { echo ''; if($row->foto!='') { - $akte = new akte($conn); + $akte = new akte(); $akte->getAkten($row->person_id, 'Lichtbil'); echo ""; diff --git a/content/statistik/bewerberstatistik.php b/content/statistik/bewerberstatistik.php index 0370bb6bc..05345ee97 100644 --- a/content/statistik/bewerberstatistik.php +++ b/content/statistik/bewerberstatistik.php @@ -40,7 +40,7 @@ * studiengang_kz ... gibt den Studiengang an der angezeigt werden soll, wenn showdetails=true */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/functions.inc.php'); @@ -49,20 +49,17 @@ require_once('../../include/datum.class.php'); require_once('../../include/aufmerksamdurch.class.php'); require_once('../../include/studiengang.class.php'); -if(!$conn = pg_pconnect(CONN_STRING)) - die('Fehler beim Connecten zur DB'); - if(isset($_GET['stsem'])) $stsem = $_GET['stsem']; else $stsem = ''; - +$db = new basis_db(); // Wenn der Parameter Mail per GET oder Commandline Argument uebergeben wird, // dann wird die Statistik per Mail versandt if(isset($_GET['mail']) || (isset($_SERVER['argv']) && in_array('mail',$_SERVER['argv']))) { $mail=true; - $stsem_obj = new studiensemester($conn); + $stsem_obj = new studiensemester(); $stsem_obj->getNextStudiensemester(); $stsem = $stsem_obj->studiensemester_kurzbz; } @@ -74,7 +71,7 @@ else //das Mail enthaelt alle Studiengaenge if(!$mail) { - $rechte = new benutzerberechtigung($conn); + $rechte = new benutzerberechtigung(); $rechte->getBerechtigungen(get_uid()); } $content=''; @@ -119,7 +116,7 @@ if(isset($_GET['showdetails'])) $studiengang_kz = $_GET['studiengang_kz']; $stgwhere = " AND studiengang_kz='".addslashes($studiengang_kz)."'"; - $stg_obj = new studiengang($conn); + $stg_obj = new studiengang(); if(!$stg_obj->load($studiengang_kz)) die('Studiengang existiert nicht'); @@ -146,9 +143,10 @@ if(isset($_GET['showdetails'])) "; - if($result = pg_query($conn, $qry)) + + if($db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { $content.=''; $content.=""; @@ -177,9 +175,9 @@ if(isset($_GET['showdetails'])) "; - if($result = pg_query($conn, $qry)) + if($db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { $content.=''; $content.=""; @@ -202,7 +200,7 @@ $content.=' if(!$mail) { $content.= 'Studiensemester:
FotoNachnameVornameGruppe
$row->beschreibung
$row->berufstaetigkeit_bez
@@ -355,7 +353,7 @@ if($stsem!='') $student3sem_m_sum = 0; $student3sem_w_sum = 0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $content.= "\n"; $content.= ''; @@ -507,9 +505,9 @@ if($stsem!='') studiengang_kz>0 AND studiengang_kz<10000 AND aktiv $stgwhere AND orgform_kurzbz='VBB' ORDER BY kurzbzlang; "; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - if(pg_num_rows($result)>0) + if($db->db_num_rows($result)>0) { $content.= "

Aufsplittung Mischformen


"; $content.= "\n
@@ -550,11 +548,11 @@ if($stsem!='') $student3sem_bb_sum = 0; $student3sem_fst_sum = 0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $content.= "\n"; $content.= ''; - $content.= ""; + $content.= ""; $content.= ""; $content.= ""; $content.= ""; @@ -630,11 +628,11 @@ if($stsem!='') "; - if($result = pg_query($conn, $qry)) + if($db->db_query($qry)) { $summestudenten=0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { $summestudenten += $row->anzahlpers; $content.= "\n"; @@ -655,14 +653,14 @@ if($stsem!='') $stgwhere=' AND studiengang_kz in('; foreach ($stgs as $stg) $stgwhere.="'$stg',"; - $stgwhere = substr($stgwhere,0, strlen($stgwhere)-1); + $stgwhere = mb_substr($stgwhere,0, mb_strlen($stgwhere)-1); $stgwhere.=' )'; } } else $stgwhere=''; - $stsem_obj = new studiensemester($conn); + $stsem_obj = new studiensemester(); $stsem = $stsem_obj->getPreviousFrom($stsem); // voriges semester $stsem = $stsem_obj->getPreviousFrom($stsem); // voriges jahr @@ -756,7 +754,7 @@ if($stsem!='') studiengang_kz>0 AND studiengang_kz<10000 AND aktiv $stgwhere ORDER BY typ, kurzbz; "; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { $content.= "\n
".strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)".mb_strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)$row->interessenten_vz / $row->interessenten_bb / $row->interessenten_fst$row->interessentenzgv_vz / $row->interessentenzgv_bb / $row->interessentenzgv_fst$row->interessentenrtanmeldung_vz / $row->interessentenrtanmeldung_bb / $row->interessentenrtanmeldung_fst
$row->anzahlpers$row->anzahlstg
@@ -792,11 +790,11 @@ if($stsem!='') $student3sem_m_sum = 0; $student3sem_w_sum = 0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $content.= "\n"; $content.= ''; - $content.= ""; + $content.= ""; $content.= ""; $content.= ""; $content.= ""; @@ -869,11 +867,11 @@ if($stsem!='') "; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { $summestudenten=0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $summestudenten += $row->anzahlpers; $content.= "\n"; diff --git a/content/statistik/bewerberstatistik.svg.php b/content/statistik/bewerberstatistik.svg.php index db5506a14..c2175f033 100644 --- a/content/statistik/bewerberstatistik.svg.php +++ b/content/statistik/bewerberstatistik.svg.php @@ -20,42 +20,49 @@ * Rudolf Hangl and * Gerald Simane-Sequens */ - require_once('../../vilesci/config.inc.php'); + require_once('../../config/vilesci.config.inc.php'); + require_once('../../include/basis_db.class.php'); require_once('../../include/ezcomponents/Base/src/ezc_bootstrap.php'); - - if(!$conn = pg_connect(CONN_STRING)) - die('Fehler beim der Datenbankverbindung'); - + require_once('../../include/studiengang.class.php'); + if(!$graph = new ezcGraphLineChart()) die('Fehler beim Initialisieren von EZComponents'); - $stsem = $_GET['stsem']; - $studiengang_kz = $_GET['studiengang_kz']; - //$graph->title = $stsem.' 1.Semester'; + $stsem = (isset($_GET['stsem'])?$_GET['stsem']:''); + $studiengang_kz = (isset($_GET['studiengang_kz'])?$_GET['studiengang_kz']:''); + $db = new basis_db(); $hlp=array(); + + $stg = new studiengang($studiengang_kz); + $studienplaetze = ($stg->studienplaetze!=''?$stg->studienplaetze:0); + + //Interessenten holen $qry = "SELECT date_part('month', datum) as monat, date_part('year', datum) as jahr, - count(*) as anzahl + count(*) as anzahl FROM public.tbl_studiengang JOIN public.tbl_prestudent USING(studiengang_kz) JOIN public.tbl_prestudentstatus USING(prestudent_id) WHERE tbl_prestudentstatus.status_kurzbz='Interessent' - AND studiensemester_kurzbz='$stsem' - AND studiengang_kz='$studiengang_kz' + AND studiensemester_kurzbz='".addslashes($stsem)."' + AND studiengang_kz='".addslashes($studiengang_kz)."' AND ausbildungssemester=1 GROUP BY date_part('month', datum), date_part('year',datum) ORDER BY jahr, monat"; - if($result = pg_query($conn, $qry)) + + if($db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { $hlp['Interessent'][$row->jahr.sprintf('%02s',$row->monat)]=$row->anzahl; $keys[] = $row->jahr.sprintf('%02s',$row->monat); } } + + //Bewerber holen $qry = "SELECT date_part('month', datum) as monat, date_part('year', datum) as jahr, @@ -66,37 +73,40 @@ JOIN public.tbl_prestudentstatus USING(prestudent_id) WHERE tbl_prestudentstatus.status_kurzbz='Bewerber' - AND studiensemester_kurzbz='$stsem' - AND studiengang_kz='$studiengang_kz' + AND studiensemester_kurzbz='".addslashes($stsem)."' + AND studiengang_kz='".addslashes($studiengang_kz)."' AND ausbildungssemester=1 GROUP BY date_part('month', datum), date_part('year',datum) ORDER BY jahr, monat"; - if($result = pg_query($conn, $qry)) + if($db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { $hlp['Bewerber'][$row->jahr.sprintf('%02s',$row->monat)]=$row->anzahl; $keys[] = $row->jahr.sprintf('%02s',$row->monat); } } + + //Studenten holen $qry = "SELECT date_part('month', datum) as monat, date_part('year', datum) as jahr, - count(*) as anzahl + count(*) as anzahl FROM public.tbl_studiengang JOIN public.tbl_prestudent USING(studiengang_kz) JOIN public.tbl_prestudentstatus USING(prestudent_id) WHERE tbl_prestudentstatus.status_kurzbz='Student' - AND studiensemester_kurzbz='$stsem' - AND studiengang_kz='$studiengang_kz' + AND studiensemester_kurzbz='".addslashes($stsem)."' + AND studiengang_kz='".addslashes($studiengang_kz)."' AND ausbildungssemester=1 GROUP BY date_part('month', datum), date_part('year', datum) ORDER BY jahr, monat"; - if($result = pg_query($conn, $qry)) + + if($db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { $hlp['Student'][$row->jahr.sprintf('%02s',$row->monat)]=$row->anzahl; $keys[] = $row->jahr.sprintf('%02s',$row->monat); @@ -105,18 +115,18 @@ $graph->xAxis->axisLabelRenderer = new ezcGraphAxisRotatedLabelRenderer(); $graph->xAxis->axisLabelRenderer->angle = 0; - //$graph->xAxis->axisSpace = .2; + if(empty($keys)) die('Keine Daten vorhanden'); asort($keys, SORT_NUMERIC); - //$keys = array_unique($keys); - //var_dump($keys); + + //Keys fuer alle Monate anlegen damit keine Luecken vorhanden sind $firstkey = $keys[0]; $lastkey = $keys[count($keys)-1]; - $year = substr($firstkey,0,4); - $month = substr($firstkey, 4); - $lastyear = substr($lastkey, 0, 4); - $lastmonth = substr($lastkey, 4); + $year = mb_substr($firstkey,0,4); + $month = mb_substr($firstkey, 4); + $lastyear = mb_substr($lastkey, 0, 4); + $lastmonth = mb_substr($lastkey, 4); for($i=$year;$i<=$lastyear;$i++) { @@ -124,7 +134,7 @@ $maxmonth=$lastmonth; else $maxmonth=12; - //echo "
$i==$lastyear:$maxmonth
"; + for($j=$month;$j<=$maxmonth;$j++) { if(!in_array($i.sprintf('%02s',$j), $keys)) @@ -134,37 +144,31 @@ } $keys = array_unique($keys); asort($keys, SORT_NUMERIC); - //var_dump($keys); + + //Array mit den Daten befuellen + //Die Daten muessen fuer jeden Status fuer alle Monate gesetzt werden, + //sonst gibts einen error foreach($hlp as $status=>$data) - { - + { reset($keys); $valuebefore=0; foreach ($keys as $key) { + //Studienplaetze fuer jedes Monat eintragen + $studienplaetzearr[$key]=$studienplaetze; if(!isset($data[$key])) $data[$key] = $valuebefore; else $data[$key] = $data[$key]+$valuebefore; $valuebefore=$data[$key]; - //echo $key.' '.$valuebefore.'
'; } ksort($data, SORT_NUMERIC); - //echo '
'.$status.'
'; - //var_dump($data); - /* - $oldvalue=0; - foreach ($data as $key=>$value) - { - $data[$key]=$data[$key]+$oldvalue; - $oldvalue = $data[$key]; - } - */ $graph->data[$status] = new ezcGraphArrayDataSet( $data ); - //$graph->data[$status]->highlight[9] = true; } - + //Sollstudienplaetze markieren + $graph->data['Studienplaetze'] = new ezcGraphArrayDataSet( $studienplaetzearr ); + $graph->renderToOutput( 500, 500); ?> \ No newline at end of file diff --git a/content/statistik/bewerberstatistik.xls.php b/content/statistik/bewerberstatistik.xls.php deleted file mode 100644 index 56542281b..000000000 --- a/content/statistik/bewerberstatistik.xls.php +++ /dev/null @@ -1,275 +0,0 @@ -, - * Andreas Oesterreicher and - * Rudolf Hangl . - */ -/** - * Exportiert die Studentendaten in ein Excel File. - * Die zu exportierenden Spalten werden per GET uebergeben. - * Die Adressen werden immer dazugehaengt - */ -require_once('../../vilesci/config.inc.php'); -require_once('../../include/functions.inc.php'); -require_once('../../include/Excel/excel.php'); -require_once('../../include/studiengang.class.php'); - -// Datenbank Verbindung -if (!$conn = pg_pconnect(CONN_STRING)) - $error_msg='Es konnte keine Verbindung zum Server aufgebaut werden!'; - -$user = get_uid(); - -if(isset($_GET['details'])) - $details = true; -else - $details = false; - -loadVariables($conn, $user); - - //Parameter holen - $studiensemester_kurzbz = isset($_GET['studiensemester_kurzbz'])?$_GET['studiensemester_kurzbz']:''; - - $maxlength= array(); - $zeile=1; - $stg_arr_2=array("227"=>"(B)BME","228"=>"(M)BMES","999"=>"(DI)bTec","11"=>"(DI)E","254"=>"(B)E","91"=>"(DI)EW", - "94"=>"(DI)EID","297"=>"(M)ES","1"=>"(M)EUE","329"=>"(M)GRT","300"=>"(M)IE","257"=>"(B)INF", - "182"=>"(DI)SET","327"=>"(B)SET","332"=>"(M)MTUM","298"=>"(M)TKIT","476"=>"(B)EUE","222"=>"(DI)VT", - "301"=>"(M)ITM","334"=>"(M)ITS","333"=>"(B)ITS","308"=>"(DI)IWI","335"=>"(B)IWI","336"=>"(M)IWI", - "330"=>"(B)MR","204"=>"(DI)MR","299"=>"(M)MMSE","92"=>"(DI)PW","328"=>"(M)SET","302"=>"(M)WI", - "145"=>"(DI)ICSS","258"=>"(B)ICSS","331"=>"(M)MR","256"=>"(B)WI","303"=>"(M)IMCS","255"=>"(B)EW"); - - // Creating a workbook - $workbook = new Spreadsheet_Excel_Writer(); - - // sending HTTP headers - $workbook->send("Bewerberstatistik". "_" . date("d_m_Y") . ".xls"); - - // Creating a worksheet - $worksheet =& $workbook->addWorksheet("Bewerberstatistik"); - - $format_bold =& $workbook->addFormat(); - $format_bold->setBold(); - - $format_title =& $workbook->addFormat(); - $format_title->setBold(); - // let's merge - $format_title->setAlign('merge'); - - //Zeilenueberschriften ausgeben - - for($i=0;$i<10;$i++) - $maxlength[$i]=0; - $i=9; - $stg_spalte=array(); - $studiengang = new studiengang($conn); - $studiengang->getAll('typ, kurzbzlang', false); - foreach ($studiengang->result as $row) - { - //btec, tw, LLLC und eak nicht anzeigen - if($row->studiengang_kz!='0' && $row->studiengang_kz!='203' && $row->studiengang_kz!='10001' && $row->studiengang_kz!='10002') - { - if(isset($stg_arr_2[$row->studiengang_kz])) - $worksheet->write(0,$i,$stg_arr_2[$row->studiengang_kz], $format_bold); - else - $worksheet->write(0,$i,'('.strtoupper($row->typ).') '.$row->kurzbzlang, $format_bold); - $maxlength[$i]=strlen('('.strtoupper($row->typ).') '.$row->kurzbzlang); - $stg_spalte[$row->studiengang_kz]=$i; - $i++; - } - } - - // Daten holen - $qry = "SELECT *, tbl_person.person_id - FROM - public.tbl_prestudentstatus, public.tbl_prestudent, public.tbl_person - WHERE - tbl_prestudentstatus.prestudent_id=tbl_prestudent.prestudent_id AND - tbl_prestudent.person_id=tbl_person.person_id AND - studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."' AND - status_kurzbz in('Interessent','Bewerber','Student','Abbrecher','Unterbrecher','Diplomand','Incoming', 'Praktikant', 'Abgewiesener') AND - studiengang_kz not in(0, 203, 10001, 10002) - ORDER BY nachname, vorname, tbl_prestudentstatus.datum, tbl_prestudentstatus.insertamum, tbl_prestudentstatus.ext_id"; - //'Outgoing', - - //echo $qry; - - if($result = pg_query($conn, $qry)) - { - $lastperson=''; - $zeile=0; - - while($row = pg_fetch_object($result)) - { - if($lastperson!=$row->person_id) - { - if($lastperson!='') - { - $anzahl_bewerbung=-1; - foreach ($rollen as $stg=>$status) - { - //ROLLEN - $worksheet->write($zeile,$stg_spalte[$stg],$status); - if($maxlength[$stg_spalte[$stg]]write($zeile,4,$anzahl_bewerbung); - if($maxlength[4]write($zeile,6,$anzahl_bewerbung); - if($maxlength[6]0) - $wert='M'; - else - $wert='E'; - - $worksheet->write($zeile,5,$wert); - if($maxlength[5]person_id; - - //DATUM - $worksheet->write($zeile,$i,date('d.m.y')); - if($maxlength[$i]write($zeile,++$i,$row->vorname); - if($maxlength[$i]vorname)) - $maxlength[$i]=strlen($row->vorname); - - //NACHNAME - $worksheet->write($zeile,++$i,$row->nachname); - if($maxlength[$i]nachname)) - $maxlength[$i]=strlen($row->nachname); - - //GESCHLECHT - $worksheet->write($zeile,++$i,strtoupper($row->geschlecht)); - if($maxlength[$i]geschlecht)) - $maxlength[$i]=strlen($row->geschlecht); - - //Spalten fuer Anzahl der Bewerbungen freilassen - $i++; - $i++; - $i++; - - //NACHNAME - $worksheet->write($zeile,++$i,$row->nachname); - if($maxlength[$i]nachname)) - $maxlength[$i]=strlen($row->nachname); - - //ZGV CODE - $worksheet->write($zeile,++$i,$row->zgv_code); - if($maxlength[$i]zgv_code)) - $maxlength[$i]=strlen($row->zgv_code); - } - - switch($row->status_kurzbz) - { - case 'Interessent': - $kuerzel = 'i'; - if($details) - { - $kuerzel2=''; - //Bei Interessenten wir zusaetzlich nach den stati zgv, reihungstest, und nicht rt - $qry2 = "SELECT anmeldungreihungstest, zgvmas_code, zgv_code FROM public.tbl_prestudent WHERE person_id='$row->person_id' AND studiengang_kz='$row->studiengang_kz'"; - if($result2 = pg_query($conn, $qry2)) - { - if($row2 = pg_fetch_object($result2)) - { - if($row2->anmeldungreihungstest!='') - $kuerzel2 = 'r'; - if($row2->zgvmas_code!='' || $row2->zgv_code!='') - $kuerzel2.= 'z'; - } - } - } - break; - case 'Bewerber': $kuerzel='b'; break; - case 'Student': $kuerzel='s'; break; - case 'Abbrecher': $kuerzel='a'; break; - case 'Unterbrecher': $kuerzel='u'; break; - case 'Diplomand': $kuerzel='s'; break; - case 'Incoming': $kuerzel='s'; break; - //case 'Outgoing': $kuerzel='s'; break; - case 'Praktikant': $kuerzel='s'; break; - case 'Abgewiesener': $kuerzel='x'; break; - default: $kuerzel=''; break; - } - if(isset($rollen[$row->studiengang_kz])) - { - if(strpos($rollen[$row->studiengang_kz],$kuerzel)===false) - { - $rollen[$row->studiengang_kz] .= $kuerzel.$row->ausbildungssemester; - } - } - else - $rollen[$row->studiengang_kz] = $kuerzel.$row->ausbildungssemester; - - - if($details) - { - if(isset($kuerzel2) && $kuerzel2!='') - { - $rollen[$row->studiengang_kz].=$kuerzel2; - $kuerzel2=''; - } - } - } - $anzahl_bewerbung=-1; - foreach ($rollen as $stg=>$status) - { - //ROLLEN - $worksheet->write($zeile,$stg_spalte[$stg],$status); - if($maxlength[$stg_spalte[$stg]]write($zeile,4,$anzahl_bewerbung); - if($maxlength[4]0) - $wert='M'; - else - $wert='E'; - - $worksheet->write($zeile,5,$wert); - if($maxlength[5]$breite) - $worksheet->setColumn($i, $i, $breite+2); - - $workbook->close(); - -?> diff --git a/content/statistik/dokumente.xls.php b/content/statistik/dokumente.xls.php index cabc55a0b..93ab20649 100644 --- a/content/statistik/dokumente.xls.php +++ b/content/statistik/dokumente.xls.php @@ -23,21 +23,18 @@ * Exportiert eine Liste der Absolventen in ein Excel File. * Das betreffende Studiensemester wird uebergeben. */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/Excel/excel.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/dokument.class.php'); -// Datenbank Verbindung -if (!$conn = pg_pconnect(CONN_STRING)) - die('Es konnte keine Verbindung zum Server aufgebaut werden!'); - -loadVariables($conn, get_uid()); +loadVariables(get_uid()); //Parameter holen $studiengang_kz = isset($_GET['studiengang_kz'])?$_GET['studiengang_kz']:''; $studiensemester_kurzbz = isseT($_GET['studiensemester_kurzbz'])?$_GET['studiensemester_kurzbz']:$semester_aktuell; +$db = new basis_db(); if($studiengang_kz!='') { @@ -46,10 +43,12 @@ if($studiengang_kz!='') // sending HTTP headers $workbook->send("Dokumente_".$studiensemester_kurzbz.".xls"); - + $workbook->setVersion(8); + // Creating a worksheet $worksheet =& $workbook->addWorksheet("Dokumente"); - + $worksheet->setInputEncoding('utf-8'); + $format_bold =& $workbook->addFormat(); $format_bold->setBold(); @@ -67,7 +66,7 @@ if($studiengang_kz!='') $worksheet->write($zeile,++$spalte,'STATUS',$format_bold); $maxlength[$spalte]=6; - $dokumente = new dokument($conn); + $dokumente = new dokument(); $dokumente->getDokumente($studiengang_kz); $dokumente_arr = array(); foreach ($dokumente->result as $row) @@ -90,33 +89,33 @@ if($studiengang_kz!='') (SELECT count(*) as anzahl FROM public.tbl_dokumentstudiengang WHERE dokument_kurzbz NOT IN( SELECT dokument_kurzbz FROM tbl_dokumentprestudent WHERE - prestudent_id=tbl_prestudent.prestudent_id) AND studiengang_kz='$studiengang_kz')<>0 - AND tbl_prestudentstatus.studiensemester_kurzbz='$studiensemester_kurzbz' AND studiengang_kz='$studiengang_kz' + prestudent_id=tbl_prestudent.prestudent_id) AND studiengang_kz='".addslashes($studiengang_kz)."')<>0 + AND tbl_prestudentstatus.studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."' AND studiengang_kz='".addslashes($studiengang_kz)."' ) ORDER BY nachname, vorname "; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $zeile++; $spalte=0; $worksheet->write($zeile,$spalte,$row->nachname); - if(strlen($row->nachname)>$maxlength[$spalte]) - $maxlength[$spalte]=strlen($row->nachname); + if(mb_strlen($row->nachname)>$maxlength[$spalte]) + $maxlength[$spalte]=mb_strlen($row->nachname); $worksheet->write($zeile,++$spalte, $row->vorname); - if(strlen($row->vorname)>$maxlength[$spalte]) - $maxlength[$spalte]=strlen($row->vorname); + if(mb_strlen($row->vorname)>$maxlength[$spalte]) + $maxlength[$spalte]=mb_strlen($row->vorname); $worksheet->write($zeile,++$spalte, $row->status); - if(strlen($row->status)>$maxlength[$spalte]) - $maxlength[$spalte]=strlen($row->status); + if(mb_strlen($row->status)>$maxlength[$spalte]) + $maxlength[$spalte]=mb_strlen($row->status); - $dokumente = new dokument($conn); + $dokumente = new dokument(); $dokumente->getPrestudentDokumente($row->prestudent_id); foreach ($dokumente->result as $docs) diff --git a/content/statistik/koordinatorstunden.php b/content/statistik/koordinatorstunden.php index 4551c0292..696ba8891 100644 --- a/content/statistik/koordinatorstunden.php +++ b/content/statistik/koordinatorstunden.php @@ -23,23 +23,20 @@ * Erstellt eine Liste der Koordinatoren eines Instituts und der Anzahl der Stunden * die er in den jeweiligen Studiengaengen unterrichtet */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/studiengang.class.php'); -echo ' +echo ' Koordinatorstunden '; -// Datenbank Verbindung -if (!$conn = pg_pconnect(CONN_STRING)) - die('Es konnte keine Verbindung zum Server aufgebaut werden!'); - $user = get_uid(); -loadVariables($conn, $user); +loadVariables($user); +$db = new basis_db(); if(isset($_GET['fachbereich_kurzbz'])) $fachbereich_kurzbz = $_GET['fachbereich_kurzbz']; @@ -53,7 +50,7 @@ $data = array(); $name = array(); //alle Studiengaenge holen -$studiengang = new studiengang($conn); +$studiengang = new studiengang(); $studiengang->getAll(); foreach ($studiengang->result as $row) @@ -61,8 +58,7 @@ foreach ($studiengang->result as $row) //Alle Fachbereichsleiter des uebergebenen Studienganges holen und //Die Anzahl der Stunden die dieser in den einzelnen Studiengaengen haelt ermitteln -$qry = "SET CLIENT_ENCODING TO 'UNICODE'; - SELECT +$qry = "SELECT distinct on(tbl_lehreinheit.lehreinheit_id) tbl_benutzerfunktion.uid, tbl_lehreinheitmitarbeiter.semesterstunden, @@ -87,13 +83,13 @@ $qry = "SET CLIENT_ENCODING TO 'UNICODE'; tbl_benutzer.person_id=tbl_person.person_id AND tbl_lehrfach.lehrfach_id=tbl_lehreinheit.lehrfach_id AND tbl_lehrfach.fachbereich_kurzbz='".addslashes($fachbereich_kurzbz)."' AND - tbl_lehreinheit.studiensemester_kurzbz='$semester_aktuell' + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($semester_aktuell)."' ORDER BY tbl_lehreinheit.lehreinheit_id, nachname, vorname "; -if($result = pg_query($conn, $qry)) +if($db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { if(array_key_exists($row->uid, $data)) { diff --git a/content/statistik/laenderstatistik.php b/content/statistik/laenderstatistik.php deleted file mode 100644 index 097ded3e4..000000000 --- a/content/statistik/laenderstatistik.php +++ /dev/null @@ -1,157 +0,0 @@ -getAll(null, false); -$stg_arr = array(); - -foreach ($stg_obj->result as $stg) - $stg_arr[$stg->studiengang_kz] = $stg->kuerzel; - -echo ' - -Studiengang - Details - -'; - - -// ********* Studenten LAND ************ -echo '

Studenten LAND

'; - -$qry = "SELECT - studiengang_kz, studiensemester_kurzbz, kurztext as geburtsnation, geschlecht, count(*) as anzahl - FROM - public.tbl_person, public.tbl_prestudent, public.tbl_prestudentstatus, bis.tbl_nation - WHERE - tbl_person.person_id=tbl_prestudent.person_id AND - tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id AND - tbl_prestudentstatus.status_kurzbz='Student' AND - tbl_nation.nation_code=tbl_person.geburtsnation - GROUP BY studiengang_kz, studiensemester_kurzbz, kurztext, geschlecht"; - -echo '
".strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)".mb_strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)$row->interessenten ($row->interessenten_m / $row->interessenten_w)k.A.$row->interessentenrtanmeldung ($row->interessentenrtanmeldung_m / $row->interessentenrtanmeldung_w)
$row->anzahlpers$row->anzahlstg
'; - -if($result = pg_query($conn, $qry)) -{ - while($row = pg_fetch_object($result)) - { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } -} - -echo '
StudiengangStudiensemesterLandm/wAnzahl
'.$stg_arr[$row->studiengang_kz].''.$row->studiensemester_kurzbz.''.$row->geburtsnation.''.$row->geschlecht.''.$row->anzahl.'
'; - -// ********* Bewerber LAND ************ -echo '

Bewerber LAND

'; - -$qry = "SELECT - studiengang_kz, studiensemester_kurzbz, kurztext as geburtsnation, geschlecht, count(*) as anzahl - FROM - public.tbl_person, public.tbl_prestudent, public.tbl_prestudentstatus, bis.tbl_nation - WHERE - tbl_person.person_id=tbl_prestudent.person_id AND - tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id AND - tbl_prestudentstatus.status_kurzbz='Bewerber' AND - tbl_nation.nation_code=tbl_person.geburtsnation - GROUP BY studiengang_kz, studiensemester_kurzbz, kurztext, geschlecht"; - -echo ''; - -if($result = pg_query($conn, $qry)) -{ - while($row = pg_fetch_object($result)) - { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } -} - -echo '
StudiengangStudiensemesterLandm/wAnzahl
'.$stg_arr[$row->studiengang_kz].''.$row->studiensemester_kurzbz.''.$row->geburtsnation.''.$row->geschlecht.''.$row->anzahl.'
'; - - -// ********* Studenten Bundesland ************ -echo '

Studenten Bundesland

'; - -$qry = "SELECT - studiengang_kz, studiensemester_kurzbz, bulabez, geschlecht, count(*) as anzahl - FROM - public.tbl_person, public.tbl_prestudent, public.tbl_prestudentstatus, public.tbl_adresse, bis.tbl_gemeinde - WHERE - tbl_person.person_id=tbl_prestudent.person_id AND - tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id AND - tbl_prestudentstatus.status_kurzbz='Student' AND - tbl_adresse.person_id=tbl_person.person_id AND - tbl_adresse.plz=tbl_gemeinde.plz AND - tbl_person.geburtsnation='A' - GROUP BY studiengang_kz, studiensemester_kurzbz, bulabez, geschlecht"; - -echo ''; - -if($result = pg_query($conn, $qry)) -{ - while($row = pg_fetch_object($result)) - { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } -} - -echo '
StudiengangStudiensemesterLandm/wAnzahl
'.$stg_arr[$row->studiengang_kz].''.$row->studiensemester_kurzbz.''.$row->bulabez.''.$row->geschlecht.''.$row->anzahl.'
'; - -// ********* Studenten Bundesland ************ -echo '

Bewerber Bundesland

'; - -$qry = "SELECT - studiengang_kz, studiensemester_kurzbz, bulabez, geschlecht, count(*) as anzahl - FROM - public.tbl_person, public.tbl_prestudent, public.tbl_prestudentstatus, public.tbl_adresse, bis.tbl_gemeinde - WHERE - tbl_person.person_id=tbl_prestudent.person_id AND - tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id AND - tbl_prestudentstatus.status_kurzbz='Bewerber' AND - tbl_adresse.person_id=tbl_person.person_id AND - tbl_adresse.plz=tbl_gemeinde.plz AND - tbl_person.geburtsnation='A' - GROUP BY studiengang_kz, studiensemester_kurzbz, bulabez, geschlecht"; - -echo ''; - -if($result = pg_query($conn, $qry)) -{ - while($row = pg_fetch_object($result)) - { - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } -} - -echo '
StudiengangStudiensemesterLandm/wAnzahl
'.$stg_arr[$row->studiengang_kz].''.$row->studiensemester_kurzbz.''.$row->bulabez.''.$row->geschlecht.''.$row->anzahl.'
'; - - -?> \ No newline at end of file diff --git a/content/statistik/lehrauftragsgesamtliste.php b/content/statistik/lehrauftragsgesamtliste.php index ac76a5834..80d9829aa 100644 --- a/content/statistik/lehrauftragsgesamtliste.php +++ b/content/statistik/lehrauftragsgesamtliste.php @@ -23,29 +23,24 @@ * Erstellt ein Excel File mit allen Lektoren und den Studiengaengen in denen diese Unterrichten * Diese Liste wird dann per Mail an die Geschaeftsstelle gesendet. */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/Excel/excel.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/mail.class.php'); -if (!$conn=pg_pconnect(CONN_STRING)) - die('Es konnte keine Verbindung zum Server aufgebaut werden!'); - -$stsem = new studiensemester($conn); +$stsem = new studiensemester(); $semester_aktuell = $stsem->getaktorNext(); $file = 'lehrauftragsgesamtliste.xls'; // Creating a workbook $workbook = new Spreadsheet_Excel_Writer($file); - -// sending HTTP headers -//$workbook->send("Lehrauftragsgesamtliste.xls"); - +$workbook->setVersion(8); // Creating a worksheet $worksheet =& $workbook->addWorksheet("Lektoren"); +$worksheet->setInputEncoding('utf-8'); //Formate Definieren $format_left =& $workbook->addFormat(); @@ -72,7 +67,7 @@ $format_number_bold->setBold(); $format_number_bold->setLeft(2); $i=0; -$studiensemester = new studiensemester($conn); +$studiensemester = new studiensemester(); $stsem = $studiensemester->getNearest(); $worksheet->write(0,0,'Erstellt am '.date('d.m.Y')." Studiensemester: $stsem", $format_bold); @@ -85,7 +80,7 @@ $maxlength[$spalte]=10; $worksheet->write($zeile+1,$spalte++,"Vorname", $format_bold); $maxlength[$spalte]=10; $worksheet->write($zeile+1,$spalte++,"UID", $format_bold); - +$db = new basis_db(); $qry = "SELECT distinct tbl_studiengang.studiengang_kz, UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel FROM @@ -93,16 +88,17 @@ $qry = "SELECT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) JOIN public.tbl_studiengang USING(studiengang_kz) WHERE - tbl_lehreinheit.studiensemester_kurzbz='$stsem' AND + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($stsem)."' AND tbl_lehreinheitmitarbeiter.faktor is not null AND tbl_lehreinheitmitarbeiter.faktor<>0 AND tbl_lehreinheitmitarbeiter.stundensatz is not null AND tbl_lehreinheitmitarbeiter.stundensatz<>0 AND tbl_lehreinheitmitarbeiter.semesterstunden is not null AND tbl_lehreinheitmitarbeiter.semesterstunden<>0 ORDER BY kuerzel"; -$result = pg_query($conn, $qry); +if(!$result = $db->db_query($qry)) + die('Fehler in qry'); -while($row = pg_fetch_object($result)) +while($row = $db->db_fetch_object($result)) { $worksheet->write($zeile, $spalte,$row->kuerzel, $format_bold_center); $worksheet->write($zeile, $spalte+1,$row->kuerzel, $format_bold_center); @@ -126,7 +122,7 @@ $maxspalten = $spalte; function drawStg($stg) { global $faktor_arr, $satz_arr, $stunden, $gesamt, $worksheet, $stg_spalte; - global $zeile, $row, $gesamtsumme, $format_number, $maxlength, $format_left; + global $zeile, $gesamtsumme, $format_number, $maxlength, $format_left; $faktoren = ''; $saetze = ''; @@ -187,7 +183,7 @@ FROM JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) WHERE - studiensemester_kurzbz='$stsem' AND + studiensemester_kurzbz='".addslashes($stsem)."' AND tbl_lehreinheitmitarbeiter.faktor is not null AND tbl_lehreinheitmitarbeiter.faktor<>0 AND tbl_lehreinheitmitarbeiter.stundensatz is not null AND @@ -197,13 +193,13 @@ WHERE GROUP BY mitarbeiter_uid, studiengang_kz, stundensatz, faktor, nachname, vorname ORDER BY nachname, vorname, studiengang_kz "; -if($result = pg_query($conn, $qry)) +if($result = $db->db_query($qry)) { $lastuid=''; $laststg=''; $zeile++; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { if($lastuid!=$row->mitarbeiter_uid) { @@ -263,9 +259,9 @@ if($result = pg_query($conn, $qry)) drawStg($laststg); drawGesamtsumme(); } -//foreach($maxlength as $i=>$breite) -// $worksheet->setColumn(0, $i, $breite+2); - +else + die('Fehler in qry'); + $workbook->close(); //Mail versenden mit Excel File im Anhang diff --git a/content/statistik/lehrauftragsliste_gst.xls.php b/content/statistik/lehrauftragsliste_gst.xls.php index a2c2abfba..980c642e1 100644 --- a/content/statistik/lehrauftragsliste_gst.xls.php +++ b/content/statistik/lehrauftragsliste_gst.xls.php @@ -23,14 +23,11 @@ * Erstellt ein Excel File mit einer Uebersicht der * Kosten fuer die Geschaeftsstelle */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/Excel/excel.php'); require_once('../../include/studiengang.class.php'); -if (!$conn=pg_pconnect(CONN_STRING)) - die('Es konnte keine Verbindung zum Server aufgebaut werden!'); - if(isset($_GET['studiengang_kz']) && is_numeric($_GET['studiengang_kz'])) $studiengang_kz=$_GET['studiengang_kz']; else @@ -42,20 +39,20 @@ else $semester=''; $user = get_uid(); -loadVariables($conn, $user); +loadVariables($user); //Studiengang laden -$studiengang = new studiengang($conn, $studiengang_kz); +$studiengang = new studiengang($studiengang_kz); // Creating a workbook $workbook = new Spreadsheet_Excel_Writer(); - +$workbook->setVersion(8); // sending HTTP headers $workbook->send("Lehrauftragsliste_".$semester_aktuell."_".$studiengang->kuerzel.($semester!=''?'_'.$semester:'').".xls"); // Creating a worksheet $worksheet =& $workbook->addWorksheet("Lehrauftragsliste"); - +$worksheet->setInputEncoding('utf-8'); //Formate Definieren $format_bold =& $workbook->addFormat(); $format_bold->setBold(); @@ -94,12 +91,12 @@ $qry = "SELECT * FROM ( tbl_lehreinheitmitarbeiter.mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid AND tbl_lehreinheit.lehreinheit_id=tbl_lehreinheitmitarbeiter.lehreinheit_id AND tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id AND - studiengang_kz='$studiengang_kz' AND studiensemester_kurzbz='$semester_aktuell' AND + studiengang_kz='".addslashes($studiengang_kz)."' AND studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND tbl_lehreinheitmitarbeiter.semesterstunden<>0 AND tbl_lehreinheitmitarbeiter.semesterstunden is not null AND tbl_lehreinheitmitarbeiter.stundensatz<>0 AND tbl_lehreinheitmitarbeiter.faktor<>0 AND EXISTS (SELECT * FROM lehre.tbl_lehreinheitgruppe WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id)"; if($semester!='') - $qry.=" AND semester='$semester'"; + $qry.=" AND semester='".addslashes($semester)."'"; //Projektsbetreuungen $qry.= " UNION @@ -116,22 +113,22 @@ $qry.= " UNION tbl_benutzer.person_id=tbl_projektbetreuer.person_id AND tbl_projektarbeit.projektarbeit_id = tbl_projektbetreuer.projektarbeit_id AND tbl_projektarbeit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id AND - tbl_lehreinheit.studiensemester_kurzbz = '$semester_aktuell' AND + tbl_lehreinheit.studiensemester_kurzbz = '".addslashes($semester_aktuell)."' AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND - tbl_lehrveranstaltung.studiengang_kz='$studiengang_kz' AND + tbl_lehrveranstaltung.studiengang_kz='".addslashes($studiengang_kz)."' AND tbl_person.person_id=tbl_projektbetreuer.person_id"; if($semester!='') - $qry.=" AND tbl_lehrveranstaltung.semester='$semester'"; + $qry.=" AND tbl_lehrveranstaltung.semester='".addslashes($semester)."'"; $qry.=") as foo"; $qry.=" ORDER BY nachname, vorname, mitarbeiter_uid"; -//echo $qry; -if($result = pg_query($conn, $qry)) +$db = new basis_db(); +if($result = $db->db_query($qry)) { $zeile=3; $gesamtkosten = 0; $liste=array(); - while($row=pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { //Gesamtstunden und Kosten ermitteln if(array_key_exists($row->mitarbeiter_uid, $liste)) @@ -159,13 +156,13 @@ if($result = pg_query($conn, $qry)) WHERE tbl_projektbetreuer.person_id=tbl_benutzer.person_id AND tbl_benutzer.uid='$uid' AND tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND student_uid=vw_student.uid AND tbl_lehreinheit.lehreinheit_id=tbl_projektarbeit.lehreinheit_id AND tbl_lehreinheit.lehrfach_id=tbl_lehrfach.lehrfach_id AND - tbl_lehreinheit.studiensemester_kurzbz='$semester_aktuell' AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND - tbl_lehrveranstaltung.studiengang_kz='$studiengang_kz'"; + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_lehrveranstaltung.studiengang_kz='".addslashes($studiengang_kz)."'"; if($semester!='') - $qry.=" AND tbl_lehrveranstaltung.semester='$semester'"; - if($result = pg_query($conn, $qry)) + $qry.=" AND tbl_lehrveranstaltung.semester='".addslashes($semester)."'"; + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $liste[$uid]['gesamtstunden'] = $liste[$uid]['gesamtstunden'] + $row->stunden; $liste[$uid]['gesamtkosten'] = $liste[$uid]['gesamtkosten'] + ($row->stunden*$row->stundensatz*$row->faktor); diff --git a/content/statistik/lehrauftragsliste_mail.xls.php b/content/statistik/lehrauftragsliste_mail.xls.php index 0b5526c12..954c7f570 100644 --- a/content/statistik/lehrauftragsliste_mail.xls.php +++ b/content/statistik/lehrauftragsliste_mail.xls.php @@ -24,17 +24,14 @@ * Kosten fuer die Geschaeftsstelle und markiert die Zeilen die in den letzten * 31 Tagen veraendert wurden. Dieses File wirde dann per Mail versandt */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/Excel/excel.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/mail.class.php'); -if (!$conn=pg_pconnect(CONN_STRING)) - die('Es konnte keine Verbindung zum Server aufgebaut werden!'); - -$stsem = new studiensemester($conn); +$stsem = new studiensemester(); $semester_aktuell = $stsem->getaktorNext(); $file = 'lehrauftragsliste.xls'; @@ -43,12 +40,8 @@ $file = 'lehrauftragsliste.xls'; echo 'Lehrauftragslisten werden erstellt. Bitte warten!
'; flush(); $workbook = new Spreadsheet_Excel_Writer($file); - +$workbook->setVersion(8); //Studiengaenge ermitteln bei denen sich die lektorzuordnung innerhalb der letzten 31 Tage geaendert haben -//(tbl_lehreinheitmitarbeiter.updateamum>now()- interval '31 days' OR -// tbl_lehreinheitmitarbeiter.insertamum>now()- interval '31 days') AND -//(tbl_projektbetreuer.updateamum>now()-interval '31 days' OR -// tbl_projektbetreuer.insertamum>now()-interval '31 days') AND $qry_stg = "SELECT distinct studiengang_kz FROM ( SELECT @@ -57,7 +50,7 @@ $qry_stg = "SELECT distinct studiengang_kz lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) WHERE - lehre.tbl_lehreinheit.studiensemester_kurzbz='$semester_aktuell' AND + lehre.tbl_lehreinheit.studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND tbl_lehreinheitmitarbeiter.semesterstunden<>0 AND tbl_lehreinheitmitarbeiter.semesterstunden is not null AND tbl_lehreinheitmitarbeiter.stundensatz<>0 AND @@ -68,7 +61,7 @@ $qry_stg = "SELECT distinct studiengang_kz FROM lehre.tbl_projektbetreuer, lehre.tbl_projektarbeit, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung WHERE - lehre.tbl_lehreinheit.studiensemester_kurzbz='$semester_aktuell' AND + lehre.tbl_lehreinheit.studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND tbl_projektbetreuer.projektarbeit_id=tbl_projektarbeit.projektarbeit_id AND tbl_projektarbeit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id @@ -77,18 +70,21 @@ $qry_stg = "SELECT distinct studiengang_kz $liste_gesamt = array(); $gesamt =& $workbook->addWorksheet('Gesamt'); +$gesamt->setInputEncoding('utf-8'); $gesamtsheet_row=1; +$db = new basis_db(); -if($result_stg = pg_query($conn, $qry_stg)) +if($result_stg = $db->db_query($qry_stg)) { - while($row_stg = pg_fetch_object($result_stg)) + while($row_stg = $db->db_fetch_object($result_stg)) { //Studiengang laden - $studiengang = new studiengang($conn, $row_stg->studiengang_kz); + $studiengang = new studiengang($row_stg->studiengang_kz); $studiengang_kz=$row_stg->studiengang_kz; // Creating a worksheet $worksheet =& $workbook->addWorksheet($studiengang->kuerzel); + $worksheet->setInputEncoding('utf-8'); //echo "Writing $studiengang->kuerzel ...".microtime()."
"; //Formate Definieren $format_bold =& $workbook->addFormat(); @@ -156,19 +152,19 @@ if($result_stg = pg_query($conn, $qry_stg)) tbl_lehreinheitmitarbeiter.mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid AND tbl_lehreinheit.lehreinheit_id=tbl_lehreinheitmitarbeiter.lehreinheit_id AND tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id AND - studiengang_kz='$studiengang_kz' AND studiensemester_kurzbz='$semester_aktuell' AND + studiengang_kz='".addslashes($studiengang_kz)."' AND studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND tbl_lehreinheitmitarbeiter.semesterstunden<>0 AND tbl_lehreinheitmitarbeiter.semesterstunden is not null AND tbl_lehreinheitmitarbeiter.stundensatz<>0 AND tbl_lehreinheitmitarbeiter.faktor<>0 AND EXISTS (SELECT lehreinheit_id FROM lehre.tbl_lehreinheitgruppe WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id) ORDER BY nachname, vorname, tbl_mitarbeiter.mitarbeiter_uid"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { $zeile=3; $gesamtkosten = 0; $liste=array(); $gesamtsheet_row++; - while($row=pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { //Gesamtstunden und Kosten ermitteln if(array_key_exists($row->mitarbeiter_uid, $liste)) @@ -208,9 +204,9 @@ if($result_stg = pg_query($conn, $qry_stg)) tbl_mitarbeiter.mitarbeiter_uid=tbl_benutzer.uid AND tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND - tbl_lehreinheit.studiensemester_kurzbz='$semester_aktuell' AND + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND - tbl_lehrveranstaltung.studiengang_kz='$studiengang_kz' AND + tbl_lehrveranstaltung.studiengang_kz='".addslashes($studiengang_kz)."' AND NOT EXISTS (SELECT mitarbeiter_uid FROM @@ -218,18 +214,18 @@ if($result_stg = pg_query($conn, $qry_stg)) WHERE mitarbeiter_uid=tbl_benutzer.uid AND tbl_lehrveranstaltung.lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id AND - tbl_lehrveranstaltung.studiengang_kz='$studiengang_kz' AND + tbl_lehrveranstaltung.studiengang_kz='".addslashes($studiengang_kz)."' AND tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND tbl_lehreinheitmitarbeiter.semesterstunden<>0 AND tbl_lehreinheitmitarbeiter.semesterstunden is not null AND tbl_lehreinheitmitarbeiter.stundensatz<>0 AND tbl_lehreinheitmitarbeiter.faktor<>0 AND EXISTS (SELECT lehreinheit_id FROM lehre.tbl_lehreinheitgruppe WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id) AND - tbl_lehreinheit.studiensemester_kurzbz='$semester_aktuell');"; + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($semester_aktuell)."');"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { if(!isset($liste[$row->uid])) { @@ -254,15 +250,15 @@ if($result_stg = pg_query($conn, $qry_stg)) $qry = "SELECT tbl_projektbetreuer.faktor, tbl_projektbetreuer.stunden, tbl_projektbetreuer.stundensatz, CASE WHEN COALESCE(tbl_projektbetreuer.updateamum, tbl_projektbetreuer.insertamum)>now()-interval '31 days' THEN 't' ELSE 'f' END as geaendert FROM lehre.tbl_projektbetreuer, lehre.tbl_lehreinheit, lehre.tbl_lehrfach, lehre.tbl_lehrveranstaltung, public.tbl_benutzer, lehre.tbl_projektarbeit, campus.vw_student - WHERE tbl_projektbetreuer.person_id=tbl_benutzer.person_id AND tbl_benutzer.uid='$uid' AND + WHERE tbl_projektbetreuer.person_id=tbl_benutzer.person_id AND tbl_benutzer.uid='".addslashes($uid)."' AND tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND student_uid=vw_student.uid AND tbl_lehreinheit.lehreinheit_id=tbl_projektarbeit.lehreinheit_id AND tbl_lehreinheit.lehrfach_id=tbl_lehrfach.lehrfach_id AND - tbl_lehreinheit.studiensemester_kurzbz='$semester_aktuell' AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND - tbl_lehrveranstaltung.studiengang_kz='$studiengang_kz'"; + tbl_lehreinheit.studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_lehrveranstaltung.studiengang_kz='".addslashes($studiengang_kz)."'"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $liste[$uid]['gesamtstunden'] = $liste[$uid]['gesamtstunden'] + $row->stunden; $liste[$uid]['gesamtkosten'] = $liste[$uid]['gesamtkosten'] + ($row->stunden*$row->stundensatz*$row->faktor); @@ -427,6 +423,7 @@ if($result_stg = pg_query($conn, $qry_stg)) //Betreuerstunden $worksheet =& $workbook->addWorksheet('Betreuerstunden'); + $worksheet->setInputEncoding('utf-8'); $qry = "SELECT studiensemester_kurzbz, nachname, vorname, sum(stunden) AS stunden, titelpre, sum(tbl_projektbetreuer.stundensatz*stunden*tbl_projektbetreuer.faktor)::numeric(6,2) AS euro, person_id @@ -435,7 +432,7 @@ if($result_stg = pg_query($conn, $qry_stg)) JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) WHERE - studiensemester_kurzbz='$semester_aktuell' AND + studiensemester_kurzbz='".addslashes($semester_aktuell)."' AND stunden>0 GROUP BY studiensemester_kurzbz,person_id,nachname,vorname, titelpre @@ -454,10 +451,10 @@ if($result_stg = pg_query($conn, $qry_stg)) $worksheet->write(2,++$i,"Stunden", $format_bold); $worksheet->write(2,++$i,"Kosten", $format_bold); - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { $zeile=3; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $i=0; //Studiensemester @@ -488,7 +485,6 @@ if($result_stg = pg_query($conn, $qry_stg)) $fileatttype = "application/xls"; $fileattname = "lehrauftragsliste_".date('Y_m_d').".xls"; - $headers = "From: $from"; $mail = new mail(MAIL_GST, 'vilesci@'.DOMAIN, $subject, $message); $mail->addAttachmentBinary($file, $fileatttype, $fileattname); diff --git a/content/statistik/lektorenstatistik.php b/content/statistik/lektorenstatistik.php index ed7cfa651..c0096d2f9 100644 --- a/content/statistik/lektorenstatistik.php +++ b/content/statistik/lektorenstatistik.php @@ -26,22 +26,20 @@ * Bei einem klick auf das Institut wird die Detailansicht angezeigt, in der die einzelnen * Lektoren Namentlich aufscheinen. */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/functions.inc.php'); require_once('../../include/fachbereich.class.php'); -if(!$conn = pg_pconnect(CONN_STRING)) - die('Fehler beim Connecten zur DB'); - $ws=''; $ss=''; +$db = new basis_db(); if(isset($_GET['stsem'])) $stsem = $_GET['stsem']; else { - $stsem_obj = new studiensemester($conn); + $stsem_obj = new studiensemester(); $stsem = $stsem_obj->getaktorNext(); } echo ' @@ -54,13 +52,11 @@ echo ' '; - - if(isset($_GET['details']) && isset($_GET['fachbereich_kurzbz'])) { $ss = (isset($_GET['ss'])?$_GET['ss']:''); $ws = (isset($_GET['ws'])?$_GET['ws']:''); - $fachbereich = new fachbereich($conn); + $fachbereich = new fachbereich(); if(!$fachbereich->load($_GET['fachbereich_kurzbz'])) die('Institut existiert nicht'); @@ -72,14 +68,14 @@ if(isset($_GET['details']) && isset($_GET['fachbereich_kurzbz'])) JOIN public.tbl_mitarbeiter USING(mitarbeiter_uid) JOIN public.tbl_benutzer ON(uid=mitarbeiter_uid) JOIN public.tbl_person USING(person_id) - WHERE studiensemester_kurzbz in('$ws','$ss') + WHERE studiensemester_kurzbz in('".addslashes($ws)."','".addslashes($ss)."') AND fachbereich_kurzbz='".addslashes($fachbereich->fachbereich_kurzbz)."' AND fixangestellt ORDER BY nachname, vorname"; - if($result = pg_query($conn, $qry)) + if($db->db_query($qry)) { - echo "Fixangestellt - Anzahl: ".pg_num_rows($result)." + echo "Fixangestellt - Anzahl: ".$db->db_num_rows()." @@ -91,7 +87,7 @@ if(isset($_GET['details']) && isset($_GET['fachbereich_kurzbz'])) "; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { echo ''; echo ""; @@ -110,14 +106,13 @@ if(isset($_GET['details']) && isset($_GET['fachbereich_kurzbz'])) JOIN public.tbl_mitarbeiter USING(mitarbeiter_uid) JOIN public.tbl_benutzer ON(uid=mitarbeiter_uid) JOIN public.tbl_person USING(person_id) - WHERE studiensemester_kurzbz in('$ws','$ss') + WHERE studiensemester_kurzbz in('".addslashes($ws)."','".addslashes($ss)."') AND fachbereich_kurzbz='".addslashes($fachbereich->fachbereich_kurzbz)."' AND NOT fixangestellt ORDER BY nachname, vorname"; - - - if($result = pg_query($conn, $qry)) + + if($db->db_query($qry)) { - echo "

Freiangestellt - Anzahl: ".pg_num_rows($result)." + echo "

Freiangestellt - Anzahl: ".$db->db_num_rows()."
$row->titelpre
@@ -129,7 +124,7 @@ if(isset($_GET['details']) && isset($_GET['fachbereich_kurzbz'])) "; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object()) { echo ''; echo ""; @@ -137,7 +132,7 @@ if(isset($_GET['details']) && isset($_GET['fachbereich_kurzbz'])) echo ""; echo ""; echo ""; - } + } } echo '
$row->titelpre$row->vorname$row->titelpost
'; } @@ -145,13 +140,13 @@ else { if(substr($stsem, 0, 2)=='WS') { - $stsem_obj = new studiensemester($conn); + $stsem_obj = new studiensemester(); $ss = $stsem_obj->getNextFrom($stsem); $ws = $stsem; } else { - $stsem_obj = new studiensemester($conn); + $stsem_obj = new studiensemester(); $ws = $stsem_obj->getPreviousFrom($stsem); $ss = $stsem; } @@ -159,7 +154,7 @@ else echo ''.date('d.m.Y').'
'; echo ''; echo 'Studiensemester: '; - $stsem = new studiensemester($conn); + $stsem = new studiensemester(); $stsem_akt = $stsem->getaktorNext(); $stsem->getAll(); diff --git a/content/statistik/projektarbeitexport.xls.php b/content/statistik/projektarbeitexport.xls.php index 3ddea4553..01376c591 100644 --- a/content/statistik/projektarbeitexport.xls.php +++ b/content/statistik/projektarbeitexport.xls.php @@ -24,18 +24,15 @@ * Die zu exportierenden Spalten werden per GET uebergeben. * Die Adressen werden immer dazugehaengt */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/datum.class.php'); require_once('../../include/Excel/excel.php'); -// Datenbank Verbindung -if (!$conn = pg_pconnect(CONN_STRING)) - $error_msg='Es konnte keine Verbindung zum Server aufgebaut werden!'; - +$db = new basis_db(); $user = get_uid(); $datum_obj = new datum(); -loadVariables($conn, $user); +loadVariables($user); //Parameter holen $studiengang_kz = isset($_GET['studiengang_kz'])?$_GET['studiengang_kz']:''; @@ -50,13 +47,15 @@ loadVariables($conn, $user); // Creating a workbook $workbook = new Spreadsheet_Excel_Writer(); - + $workbook->setVersion(8); + // sending HTTP headers $workbook->send("Projektarbeit". "_" . date("d_m_Y") . ".xls"); // Creating a worksheet $worksheet =& $workbook->addWorksheet("Studenten"); - + $worksheet->setInputEncoding('utf-8'); + $format_bold =& $workbook->addFormat(); $format_bold->setBold(); @@ -75,7 +74,7 @@ loadVariables($conn, $user); foreach ($headline as $title) { $worksheet->write(0,$i,$title, $format_bold); - $maxlength[$i]=strlen($title); + $maxlength[$i]=mb_strlen($title); $i++; } @@ -102,9 +101,9 @@ loadVariables($conn, $user); //echo $qry; $zeile=1; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_array($result)) + while($row = $db->db_fetch_array($result)) { $zeile++; $i=0; @@ -115,8 +114,8 @@ loadVariables($conn, $user); if(is_numeric($idx)) { $worksheet->write($zeile, $i, $content); - if(strlen($content)>$maxlength[$i]) - $maxlength[$i]=strlen($content); + if(mb_strlen($content)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($content); $i++; } } @@ -126,9 +125,9 @@ loadVariables($conn, $user); $qry_betreuer = "SELECT betreuerart_kurzbz, COALESCE(titelpre,'') || ' ' || COALESCE(vorname,'') || ' ' || COALESCE(nachname,'') || ' ' || COALESCE(titelpost,''), tbl_note.anmerkung, faktor, name, punkte, stunden, stundensatz FROM (lehre.tbl_projektbetreuer JOIN tbl_person USING(person_id)) LEFT JOIN lehre.tbl_note USING(note) WHERE projektarbeit_id='".$row['projektarbeit_id']."'"; - if($result_betreuer = pg_query($conn, $qry_betreuer)) + if($result_betreuer = $db->db_query($qry_betreuer)) { - if(pg_num_rows($result_betreuer)>0) + if($db->db_num_rows($result_betreuer)>0) { $headline=array('Betreuerart','Betreuer','Note','Faktor','Name','Punkte','Stunden','Stundensatz'); @@ -137,13 +136,13 @@ loadVariables($conn, $user); foreach ($headline as $title) { $worksheet->write($zeile,$i,$title, $format_bold); - if(strlen($title)>$maxlength[$i]) - $maxlength[$i]=strlen($title); + if(mb_strlen($title)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($title); $i++; } $zeile++; - while($row_betreuer = pg_fetch_array($result_betreuer)) + while($row_betreuer = $db->db_fetch_array($result_betreuer)) { $i=1; @@ -152,8 +151,8 @@ loadVariables($conn, $user); if(is_numeric($idx)) { $worksheet->write($zeile, $i, $content); - if(strlen($content)>$maxlength[$i]) - $maxlength[$i]=strlen($content); + if(mb_strlen($content)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($content); $i++; } } diff --git a/content/statistik/studentenexport.xls.php b/content/statistik/studentenexport.xls.php index 2bccab5b7..a7a49c8ff 100644 --- a/content/statistik/studentenexport.xls.php +++ b/content/statistik/studentenexport.xls.php @@ -24,7 +24,7 @@ * Die zu exportierenden Spalten werden per GET uebergeben. * Die Adressen werden immer dazugehaengt */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/person.class.php'); require_once('../../include/benutzer.class.php'); @@ -33,13 +33,10 @@ require_once('../../include/prestudent.class.php'); require_once('../../include/datum.class.php'); require_once('../../include/Excel/excel.php'); -// Datenbank Verbindung -if (!$conn = pg_pconnect(CONN_STRING)) - $error_msg='Es konnte keine Verbindung zum Server aufgebaut werden!'; - +$db = new basis_db(); $user = get_uid(); $datum_obj = new datum(); -loadVariables($conn, $user); +loadVariables($user); //Parameter holen $data = $_POST['data']; @@ -52,9 +49,9 @@ loadVariables($conn, $user); //ZGV laden $qry = "SELECT * FROM bis.tbl_zgv ORDER BY zgv_kurzbz"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $zgv_arr[$row->zgv_code]=$row->zgv_kurzbz; } @@ -62,9 +59,9 @@ loadVariables($conn, $user); //ZGV Master laden $qry = "SELECT * FROM bis.tbl_zgvmaster ORDER BY zgvmas_kurzbz"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $zgvmas_arr[$row->zgvmas_code]=$row->zgvmas_kurzbz; } @@ -72,13 +69,14 @@ loadVariables($conn, $user); // Creating a workbook $workbook = new Spreadsheet_Excel_Writer(); - + $workbook->setVersion(8); // sending HTTP headers $workbook->send("Studenten". "_" . date("d_m_Y") . ".xls"); // Creating a worksheet $worksheet =& $workbook->addWorksheet("Studenten"); - + $worksheet->setInputEncoding('utf-8'); + $format_bold =& $workbook->addFormat(); $format_bold->setBold(); @@ -179,27 +177,30 @@ loadVariables($conn, $user); { if($prestudent_ids!='') $prestudent_ids .= ','; - $prestudent_ids .= "'$id'"; + $prestudent_ids .= "'".addslashes($id)."'"; } } // Student holen $qry = "SELECT * FROM public.tbl_prestudent JOIN public.tbl_person USING(person_id) LEFT JOIN public.tbl_student USING(prestudent_id) WHERE prestudent_id in($prestudent_ids) ORDER BY nachname, vorname"; - if($result = pg_query($conn, $qry)) - while($row = pg_fetch_object($result)) + if($result = $db->db_query($qry)) + { + while($row = $db->db_fetch_object($result)) { draw_content($row); $zeile++; } - + } + function draw_content($row) { global $maxlength, $datum_obj; - global $zeile, $worksheet, $conn; + global $zeile, $worksheet; global $zgv_arr, $zgvmas_arr; global $studiensemester_kurzbz; + $db = new basis_db(); - $prestudent = new prestudent($conn, null, null); + $prestudent = new prestudent(); $prestudent->getLastStatus($row->prestudent_id); $status = $prestudent->status_kurzbz; $orgform = $prestudent->orgform_kurzbz; @@ -207,44 +208,44 @@ loadVariables($conn, $user); $i=0; //Anrede - if(strlen($row->anrede)>$maxlength[$i]) - $maxlength[$i] = strlen($row->anrede); + if(mb_strlen($row->anrede)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->anrede); $worksheet->write($zeile,$i, $row->anrede); $i++; //Titelpre - if(strlen($row->titelpre)>$maxlength[$i]) - $maxlength[$i] = strlen($row->titelpre); + if(mb_strlen($row->titelpre)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->titelpre); $worksheet->write($zeile,$i, $row->titelpre); $i++; //Nachname - if(strlen($row->nachname)>$maxlength[$i]) - $maxlength[$i] = strlen($row->nachname); + if(mb_strlen($row->nachname)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->nachname); $worksheet->write($zeile,$i, $row->nachname); $i++; //Vorname - if(strlen($row->vorname)>$maxlength[$i]) - $maxlength[$i] = strlen($row->vorname); + if(mb_strlen($row->vorname)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->vorname); $worksheet->write($zeile,$i, $row->vorname); $i++; //Titelpost - if(strlen($row->titelpost)>$maxlength[$i]) - $maxlength[$i] = strlen($row->titelpost); + if(mb_strlen($row->titelpost)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->titelpost); $worksheet->write($zeile,$i, $row->titelpost); $i++; //Email Privat //ZustellEmailAdresse aus der Datenbank holen und dazuhaengen $qry_1 = "SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id='$row->person_id' AND zustellung=true ORDER BY kontakt_id DESC LIMIT 1"; - if($result_1 = pg_query($conn, $qry_1)) + if($result_1 = $db->db_query($qry_1)) { - if($row_1 = pg_fetch_object($result_1)) + if($row_1 = $db->db_fetch_object($result_1)) { - if(strlen($row_1->kontakt)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->kontakt); + if(mb_strlen($row_1->kontakt)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->kontakt); $worksheet->write($zeile,$i, $row_1->kontakt); } } @@ -253,27 +254,27 @@ loadVariables($conn, $user); //Zustelladresse //Zustelladresse aus der Datenbank holen und dazuhaengen $qry_1 = "SELECT * FROM public.tbl_adresse WHERE person_id='$row->person_id' AND zustelladresse=true LIMIT 1"; - if($result_1 = pg_query($conn, $qry_1)) + if($result_1 = $db->db_query($qry_1)) { - if($row_1 = pg_fetch_object($result_1)) + if($row_1 = $db->db_fetch_object($result_1)) { - if(strlen($row_1->strasse)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->strasse); + if(mb_strlen($row_1->strasse)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->strasse); $worksheet->write($zeile,$i, $row_1->strasse); $i++; - if(strlen($row_1->plz)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->plz); + if(mb_strlen($row_1->plz)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->plz); $worksheet->writeString($zeile,$i, $row_1->plz); $i++; - if(strlen($row_1->ort)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->ort); + if(mb_strlen($row_1->ort)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->ort); $worksheet->write($zeile,$i, $row_1->ort); $i++; - if(strlen($row_1->nation)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->nation); + if(mb_strlen($row_1->nation)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->nation); $worksheet->write($zeile,$i, $row_1->nation); $i++; } @@ -284,48 +285,48 @@ loadVariables($conn, $user); $i+=4; //Geburtsdatum - if(strlen($row->gebdatum)>$maxlength[$i]) - $maxlength[$i] = strlen($row->gebdatum); + if(mb_strlen($row->gebdatum)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->gebdatum); $worksheet->write($zeile,$i, $datum_obj->convertISODate($row->gebdatum)); $i++; //Personenkennzeichen if(isset($row->matrikelnr)) { - if(strlen($row->matrikelnr)>$maxlength[$i]) - $maxlength[$i] = strlen($row->matrikelnr); + if(mb_strlen($row->matrikelnr)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->matrikelnr); $worksheet->writeString($zeile,$i, $row->matrikelnr); } $i++; //Staatsbuergerschaft - if(strlen($row->staatsbuergerschaft)>$maxlength[$i]) - $maxlength[$i] = strlen($row->staatsbuergerschaft); + if(mb_strlen($row->staatsbuergerschaft)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->staatsbuergerschaft); $worksheet->write($zeile,$i, $row->staatsbuergerschaft); $i++; //SVNR - if(strlen($row->svnr)>$maxlength[$i]) - $maxlength[$i] = strlen($row->svnr); + if(mb_strlen($row->svnr)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->svnr); $worksheet->write($zeile,$i, $row->svnr); $i++; //Ersatzkennzeichen - if(strlen($row->ersatzkennzeichen)>$maxlength[$i]) - $maxlength[$i] = strlen($row->ersatzkennzeichen); + if(mb_strlen($row->ersatzkennzeichen)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->ersatzkennzeichen); $worksheet->write($zeile,$i, $row->ersatzkennzeichen); $i++; //Geschlecht - if(strlen($row->geschlecht)>$maxlength[$i]) - $maxlength[$i] = strlen($row->geschlecht); + if(mb_strlen($row->geschlecht)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->geschlecht); $worksheet->write($zeile,$i, $row->geschlecht); $i++; - $qry = "SELECT * FROM public.tbl_studentlehrverband JOIN public.tbl_student USING(student_uid) WHERE prestudent_id='$row->prestudent_id' AND studiensemester_kurzbz='$studiensemester_kurzbz'"; - if($result_sem = pg_query($conn, $qry)) + $qry = "SELECT * FROM public.tbl_studentlehrverband JOIN public.tbl_student USING(student_uid) WHERE prestudent_id='$row->prestudent_id' AND studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."'"; + if($result_sem = $db->db_query($qry)) { - if($row_sem = pg_fetch_object($result_sem)) + if($row_sem = $db->db_fetch_object($result_sem)) { $semester = $row_sem->semester; $verband = $row_sem->verband; @@ -341,8 +342,8 @@ loadVariables($conn, $user); //Semester if(isset($semester)) { - if(strlen($semester)>$maxlength[$i]) - $maxlength[$i] = strlen($semester); + if(mb_strlen($semester)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($semester); $worksheet->write($zeile,$i, $semester); } $i++; @@ -350,8 +351,8 @@ loadVariables($conn, $user); //Verband if(isset($verband)) { - if(strlen($verband)>$maxlength[$i]) - $maxlength[$i] = strlen($verband); + if(mb_strlen($verband)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($verband); $worksheet->write($zeile,$i, $verband); } $i++; @@ -359,8 +360,8 @@ loadVariables($conn, $user); //Gruppe if(isset($gruppe)) { - if(strlen($gruppe)>$maxlength[$i]) - $maxlength[$i] = strlen($gruppe); + if(mb_strlen($gruppe)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($gruppe); $worksheet->write($zeile,$i, $gruppe); } $i++; @@ -368,56 +369,56 @@ loadVariables($conn, $user); //ZGV if($row->zgv_code!='' && isset($zgv_arr[$row->zgv_code])) { - if(strlen($zgv_arr[$row->zgv_code])>$maxlength[$i]) - $maxlength[$i] = strlen($zgv_arr[$row->zgv_code]); + if(mb_strlen($zgv_arr[$row->zgv_code])>$maxlength[$i]) + $maxlength[$i] = mb_strlen($zgv_arr[$row->zgv_code]); $worksheet->write($zeile,$i, $zgv_arr[$row->zgv_code]); } $i++; //ZGV Ort - if(strlen($row->zgvort)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvort); + if(mb_strlen($row->zgvort)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvort); $worksheet->write($zeile,$i, $row->zgvort); $i++; //ZGV Datum - if(strlen($row->zgvdatum)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvdatum); + if(mb_strlen($row->zgvdatum)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvdatum); $worksheet->write($zeile,$i, $row->zgvdatum); $i++; //ZGV Master if($row->zgvmas_code!='' && isset($zgvmas_arr[$row->zgvmas_code])) { - if(strlen($zgvmas_arr[$row->zgvmas_code])>$maxlength[$i]) - $maxlength[$i] = strlen($zgvmas_arr[$row->zgvmas_code]); + if(mb_strlen($zgvmas_arr[$row->zgvmas_code])>$maxlength[$i]) + $maxlength[$i] = mb_strlen($zgvmas_arr[$row->zgvmas_code]); $worksheet->write($zeile,$i, $zgvmas_arr[$row->zgvmas_code]); } $i++; //ZGV Master Ort - if(strlen($row->zgvmaort)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvmaort); + if(mb_strlen($row->zgvmaort)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvmaort); $worksheet->write($zeile,$i, $row->zgvmaort); $i++; //ZGV Master Datum - if(strlen($row->zgvmadatum)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvmadatum); + if(mb_strlen($row->zgvmadatum)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvmadatum); $worksheet->write($zeile,$i, $row->zgvmadatum); $i++; //Status - if(strlen($status)>$maxlength[$i]) - $maxlength[$i] = strlen($status); + if(mb_strlen($status)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($status); $worksheet->write($zeile,$i, $status); $i++; //Email Intern if(isset($row->student_uid)) { - if(strlen($row->student_uid.'@'.DOMAIN)>$maxlength[$i]) - $maxlength[$i] = strlen($row->student_uid.'@'.DOMAIN); + if(mb_strlen($row->student_uid.'@'.DOMAIN)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->student_uid.'@'.DOMAIN); $worksheet->write($zeile,$i, $row->student_uid.'@'.DOMAIN); } $i++; @@ -425,22 +426,22 @@ loadVariables($conn, $user); //Nebenwohnsitz //Nebenwohnsitz aus der Datenbank holen und dazuhaengen $qry_1 = "SELECT * FROM public.tbl_adresse WHERE person_id='$row->person_id' AND typ='n' LIMIT 1"; - if($result_1 = pg_query($conn, $qry_1)) + if($result_1 = $db->db_query($qry_1)) { - if($row_1 = pg_fetch_object($result_1)) + if($row_1 = $db->db_fetch_object($result_1)) { - if(strlen($row_1->strasse)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->strasse); + if(mb_strlen($row_1->strasse)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->strasse); $worksheet->write($zeile,$i, $row_1->strasse); $i++; - if(strlen($row_1->plz)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->plz); + if(mb_strlen($row_1->plz)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->plz); $worksheet->writeString($zeile,$i, $row_1->plz); $i++; - if(strlen($row_1->ort)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->ort); + if(mb_strlen($row_1->ort)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->ort); $worksheet->write($zeile,$i, $row_1->ort); $i++; } @@ -452,12 +453,12 @@ loadVariables($conn, $user); //Telefon $qry_1 = "SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp in('mobil','telefon','so.tel') AND person_id='$row->person_id' AND zustellung=true LIMIT 1"; - if($result_1 = pg_query($conn, $qry_1)) + if($result_1 = $db->db_query($qry_1)) { - if($row_1 = pg_fetch_object($result_1)) + if($row_1 = $db->db_fetch_object($result_1)) { - if(strlen($row_1->kontakt)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->kontakt); + if(mb_strlen($row_1->kontakt)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->kontakt); $worksheet->writeString($zeile,$i, $row_1->kontakt); } } @@ -465,10 +466,10 @@ loadVariables($conn, $user); //Spezialgruppen $grps=''; - $qry_1 = "SELECT gruppe_kurzbz FROM public.tbl_student JOIN public.tbl_benutzergruppe ON (student_uid=uid) WHERE tbl_student.prestudent_id='$row->prestudent_id' AND tbl_benutzergruppe.studiensemester_kurzbz='$studiensemester_kurzbz'"; - if($result_1 = pg_query($conn, $qry_1)) + $qry_1 = "SELECT gruppe_kurzbz FROM public.tbl_student JOIN public.tbl_benutzergruppe ON (student_uid=uid) WHERE tbl_student.prestudent_id='$row->prestudent_id' AND tbl_benutzergruppe.studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."'"; + if($result_1 = $db->db_query($qry_1)) { - while($row_1 = pg_fetch_object($result_1)) + while($row_1 = $db->db_fetch_object($result_1)) { if($grps!='') $grps.=','; @@ -476,29 +477,29 @@ loadVariables($conn, $user); $grps.=$row_1->gruppe_kurzbz; } } - if(strlen($grps)>$maxlength[$i]) - $maxlength[$i]=strlen($grps); + if(mb_strlen($grps)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($grps); $worksheet->write($zeile,$i, $grps); $i++; //UID if(isset($row->student_uid)) { - if(strlen($row->student_uid)>$maxlength[$i]) - $maxlength[$i] = strlen($row->student_uid); + if(mb_strlen($row->student_uid)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->student_uid); $worksheet->write($zeile,$i, $row->student_uid); } $i++; //Orgform - if(strlen($orgform)>$maxlength[$i]) - $maxlength[$i] = strlen($orgform); + if(mb_strlen($orgform)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($orgform); $worksheet->write($zeile,$i, $orgform); $i++; //Vornamen - if(strlen($row->vornamen)>$maxlength[$i]) - $maxlength[$i] = strlen($row->vornamen); + if(mb_strlen($row->vornamen)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->vornamen); $worksheet->write($zeile,$i, $row->vornamen); $i++; } diff --git a/content/statistik/studentenexportextended.xls.php b/content/statistik/studentenexportextended.xls.php index 68f1524ba..22fb7222b 100644 --- a/content/statistik/studentenexportextended.xls.php +++ b/content/statistik/studentenexportextended.xls.php @@ -29,7 +29,7 @@ * POST: * data ... Liste der PrestudentIDs der Personen die im Export aufscheinen sollen getrennt durch ',' */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/person.class.php'); require_once('../../include/benutzer.class.php'); @@ -38,18 +38,15 @@ require_once('../../include/prestudent.class.php'); require_once('../../include/datum.class.php'); require_once('../../include/Excel/excel.php'); -// Datenbank Verbindung -if (!$conn = pg_pconnect(CONN_STRING)) - $error_msg='Es konnte keine Verbindung zum Server aufgebaut werden!'; - $user = get_uid(); $datum_obj = new datum(); -loadVariables($conn, $user); +$db = new basis_db(); +loadVariables($user); //Parameter holen $data = $_REQUEST['data']; $studiensemester_kurzbz = $_GET['studiensemester_kurzbz']; - //$typ = $_GET['typ']; + $maxlength= array(); $zeile=1; $zgv_arr=array(); @@ -57,9 +54,9 @@ loadVariables($conn, $user); //ZGV laden $qry = "SELECT * FROM bis.tbl_zgv ORDER BY zgv_kurzbz"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $zgv_arr[$row->zgv_code]=$row->zgv_kurzbz; } @@ -67,9 +64,9 @@ loadVariables($conn, $user); //ZGV Master laden $qry = "SELECT * FROM bis.tbl_zgvmaster ORDER BY zgvmas_kurzbz"; - if($result = pg_query($conn, $qry)) + if($result = $db->db_query($qry)) { - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $zgvmas_arr[$row->zgvmas_code]=$row->zgvmas_kurzbz; } @@ -77,13 +74,15 @@ loadVariables($conn, $user); // Creating a workbook $workbook = new Spreadsheet_Excel_Writer(); - + $workbook->setVersion(8); + // sending HTTP headers $workbook->send("Studenten". "_" . date("d_m_Y") . ".xls"); // Creating a worksheet $worksheet =& $workbook->addWorksheet("Studenten"); - + $worksheet->setInputEncoding('utf-8'); + $format_bold =& $workbook->addFormat(); $format_bold->setBold(); @@ -175,27 +174,32 @@ loadVariables($conn, $user); { if($prestudent_ids!='') $prestudent_ids .= ','; - $prestudent_ids .= "'$id'"; + $prestudent_ids .= "'".addslashes($id)."'"; } } // Student holen - $qry = "SELECT *, tbl_prestudent.studiengang_kz as prestgkz FROM public.tbl_prestudent JOIN public.tbl_person USING(person_id) LEFT JOIN public.tbl_student USING(prestudent_id) WHERE prestudent_id in($prestudent_ids) ORDER BY nachname, vorname"; + $qry = "SELECT *, tbl_prestudent.studiengang_kz as prestgkz + FROM public.tbl_prestudent JOIN public.tbl_person USING(person_id) LEFT JOIN public.tbl_student USING(prestudent_id) + WHERE prestudent_id in($prestudent_ids) ORDER BY nachname, vorname"; - if($result = pg_query($conn, $qry)) - while($row = pg_fetch_object($result)) + if($db->db_query($qry)) + { + while($row = $db->db_fetch_object()) { draw_content($row); $zeile++; } - + } + function draw_content($row) { global $maxlength, $datum_obj; - global $zeile, $worksheet, $conn; + global $zeile, $worksheet; global $zgv_arr, $zgvmas_arr; global $studiensemester_kurzbz; + $db = new basis_db(); - $prestudent = new prestudent($conn, null, null); + $prestudent = new prestudent(); $prestudent->getLastStatus($row->prestudent_id); $status = $prestudent->status_kurzbz; $orgform = $prestudent->orgform_kurzbz; @@ -203,92 +207,96 @@ loadVariables($conn, $user); $i=0; //Anrede - if(strlen($row->anrede)>$maxlength[$i]) - $maxlength[$i] = strlen($row->anrede); + if(mb_strlen($row->anrede)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->anrede); $worksheet->write($zeile,$i, $row->anrede); $i++; //Titelpre - if(strlen($row->titelpre)>$maxlength[$i]) - $maxlength[$i] = strlen($row->titelpre); + if(mb_strlen($row->titelpre)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->titelpre); $worksheet->write($zeile,$i, $row->titelpre); $i++; //Nachname - if(strlen($row->nachname)>$maxlength[$i]) - $maxlength[$i] = strlen($row->nachname); + if(mb_strlen($row->nachname)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->nachname); $worksheet->write($zeile,$i, $row->nachname); $i++; //Vorname - if(strlen($row->vorname)>$maxlength[$i]) - $maxlength[$i] = strlen($row->vorname); + if(mb_strlen($row->vorname)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->vorname); $worksheet->write($zeile,$i, $row->vorname); $i++; //Titelpost - if(strlen($row->titelpost)>$maxlength[$i]) - $maxlength[$i] = strlen($row->titelpost); + if(mb_strlen($row->titelpost)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->titelpost); $worksheet->write($zeile,$i, $row->titelpost); $i++; //Email Privat //ZustellEmailAdresse aus der Datenbank holen und dazuhaengen - $qry_1 = "SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id='$row->person_id' AND zustellung=true ORDER BY kontakt_id DESC LIMIT 1"; - if($result_1 = pg_query($conn, $qry_1)) + $qry_1 = "SELECT kontakt FROM public.tbl_kontakt + WHERE kontakttyp='email' AND person_id='".addslashes($row->person_id)."' AND zustellung=true + ORDER BY kontakt_id DESC LIMIT 1"; + if($db->db_query($qry_1)) { - if($row_1 = pg_fetch_object($result_1)) + if($row_1 = $db->db_fetch_object()) { - if(strlen($row_1->kontakt)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->kontakt); + if(mb_strlen($row_1->kontakt)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->kontakt); $worksheet->write($zeile,$i, $row_1->kontakt); } } $i++; //Geburtsdatum - if(strlen($row->gebdatum)>$maxlength[$i]) - $maxlength[$i] = strlen($row->gebdatum); + if(mb_strlen($row->gebdatum)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->gebdatum); $worksheet->write($zeile,$i, $datum_obj->convertISODate($row->gebdatum)); $i++; //Personenkennzeichen if(isset($row->matrikelnr)) { - if(strlen($row->matrikelnr)>$maxlength[$i]) - $maxlength[$i] = strlen($row->matrikelnr); + if(mb_strlen($row->matrikelnr)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->matrikelnr); $worksheet->writeString($zeile,$i, $row->matrikelnr); } $i++; //Staatsbuergerschaft - if(strlen($row->staatsbuergerschaft)>$maxlength[$i]) - $maxlength[$i] = strlen($row->staatsbuergerschaft); + if(mb_strlen($row->staatsbuergerschaft)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->staatsbuergerschaft); $worksheet->write($zeile,$i, $row->staatsbuergerschaft); $i++; //SVNR - if(strlen($row->svnr)>$maxlength[$i]) - $maxlength[$i] = strlen($row->svnr); + if(mb_strlen($row->svnr)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->svnr); $worksheet->write($zeile,$i, $row->svnr); $i++; //Ersatzkennzeichen - if(strlen($row->ersatzkennzeichen)>$maxlength[$i]) - $maxlength[$i] = strlen($row->ersatzkennzeichen); + if(mb_strlen($row->ersatzkennzeichen)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->ersatzkennzeichen); $worksheet->write($zeile,$i, $row->ersatzkennzeichen); $i++; //Geschlecht - if(strlen($row->geschlecht)>$maxlength[$i]) - $maxlength[$i] = strlen($row->geschlecht); + if(mb_strlen($row->geschlecht)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->geschlecht); $worksheet->write($zeile,$i, $row->geschlecht); $i++; - $qry = "SELECT * FROM public.tbl_studentlehrverband JOIN public.tbl_student USING(student_uid) WHERE prestudent_id='$row->prestudent_id' AND studiensemester_kurzbz='$studiensemester_kurzbz'"; - if($result_sem = pg_query($conn, $qry)) + $qry = "SELECT * FROM public.tbl_studentlehrverband JOIN public.tbl_student USING(student_uid) + WHERE prestudent_id='".addslashes($row->prestudent_id)."' + AND studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."'"; + if($db->db_query($qry)) { - if($row_sem = pg_fetch_object($result_sem)) + if($row_sem = $db->db_fetch_object()) { $semester = $row_sem->semester; $verband = $row_sem->verband; @@ -304,8 +312,8 @@ loadVariables($conn, $user); //Semester if(isset($semester)) { - if(strlen($semester)>$maxlength[$i]) - $maxlength[$i] = strlen($semester); + if(mb_strlen($semester)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($semester); $worksheet->write($zeile,$i, $semester); } $i++; @@ -313,8 +321,8 @@ loadVariables($conn, $user); //Verband if(isset($verband)) { - if(strlen($verband)>$maxlength[$i]) - $maxlength[$i] = strlen($verband); + if(mb_strlen($verband)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($verband); $worksheet->write($zeile,$i, $verband); } $i++; @@ -322,8 +330,8 @@ loadVariables($conn, $user); //Gruppe if(isset($gruppe)) { - if(strlen($gruppe)>$maxlength[$i]) - $maxlength[$i] = strlen($gruppe); + if(mb_strlen($gruppe)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($gruppe); $worksheet->write($zeile,$i, $gruppe); } $i++; @@ -331,48 +339,48 @@ loadVariables($conn, $user); //ZGV if($row->zgv_code!='' && isset($zgv_arr[$row->zgv_code])) { - if(strlen($zgv_arr[$row->zgv_code])>$maxlength[$i]) - $maxlength[$i] = strlen($zgv_arr[$row->zgv_code]); + if(mb_strlen($zgv_arr[$row->zgv_code])>$maxlength[$i]) + $maxlength[$i] = mb_strlen($zgv_arr[$row->zgv_code]); $worksheet->write($zeile,$i, $zgv_arr[$row->zgv_code]); } $i++; //ZGV Ort - if(strlen($row->zgvort)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvort); + if(mb_strlen($row->zgvort)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvort); $worksheet->write($zeile,$i, $row->zgvort); $i++; //ZGV Datum - if(strlen($row->zgvdatum)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvdatum); + if(mb_strlen($row->zgvdatum)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvdatum); $worksheet->write($zeile,$i, $row->zgvdatum); $i++; //ZGV Master if($row->zgvmas_code!='' && isset($zgvmas_arr[$row->zgvmas_code])) { - if(strlen($zgvmas_arr[$row->zgvmas_code])>$maxlength[$i]) - $maxlength[$i] = strlen($zgvmas_arr[$row->zgvmas_code]); + if(mb_strlen($zgvmas_arr[$row->zgvmas_code])>$maxlength[$i]) + $maxlength[$i] = mb_strlen($zgvmas_arr[$row->zgvmas_code]); $worksheet->write($zeile,$i, $zgvmas_arr[$row->zgvmas_code]); } $i++; //ZGV Master Ort - if(strlen($row->zgvmaort)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvmaort); + if(mb_strlen($row->zgvmaort)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvmaort); $worksheet->write($zeile,$i, $row->zgvmaort); $i++; //ZGV Master Datum - if(strlen($row->zgvmadatum)>$maxlength[$i]) - $maxlength[$i] = strlen($row->zgvmadatum); + if(mb_strlen($row->zgvmadatum)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->zgvmadatum); $worksheet->write($zeile,$i, $row->zgvmadatum); $i++; //Status - if(strlen($status)>$maxlength[$i]) - $maxlength[$i] = strlen($status); + if(mb_strlen($status)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($status); $worksheet->write($zeile,$i, $status); $i++; @@ -380,39 +388,40 @@ loadVariables($conn, $user); $stati=''; $qry_1 = "SELECT UPPER(typ::varchar(1) || kurzbz) as stg, get_rolle_prestudent(prestudent_id, null) as status FROM public.tbl_prestudent JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE person_id='$row->person_id' AND tbl_prestudent.studiengang_kz<>'$row->prestgkz'"; + WHERE person_id='".addslashes($row->person_id)."' AND tbl_prestudent.studiengang_kz<>'".addslashes($row->prestgkz)."'"; - if($result_1 = pg_query($conn, $qry_1)) + if($db->db_query($qry_1)) { - while($row_1 = pg_fetch_object($result_1)) + while($row_1 = $db->db_fetch_object()) { if($stati!='') $stati.=', '; $stati.= $row_1->status.' ('.$row_1->stg.')'; } } - if(strlen($stati)>$maxlength[$i]) - $maxlength[$i] = strlen($stati); + if(mb_strlen($stati)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($stati); $worksheet->write($zeile,$i, $stati); $i++; //Email Intern if(isset($row->student_uid)) { - if(strlen($row->student_uid.'@'.DOMAIN)>$maxlength[$i]) - $maxlength[$i] = strlen($row->student_uid.'@'.DOMAIN); + if(mb_strlen($row->student_uid.'@'.DOMAIN)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->student_uid.'@'.DOMAIN); $worksheet->write($zeile,$i, $row->student_uid.'@'.DOMAIN); } $i++; //Telefon - $qry_1 = "SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp in('mobil','telefon','so.tel') AND person_id='$row->person_id' AND zustellung=true LIMIT 1"; - if($result_1 = pg_query($conn, $qry_1)) + $qry_1 = "SELECT kontakt FROM public.tbl_kontakt + WHERE kontakttyp in('mobil','telefon','so.tel') AND person_id='".addslashes($row->person_id)."' AND zustellung=true LIMIT 1"; + if($db->db_query($qry_1)) { - if($row_1 = pg_fetch_object($result_1)) + if($row_1 = $db->db_fetch_object()) { - if(strlen($row_1->kontakt)>$maxlength[$i]) - $maxlength[$i]=strlen($row_1->kontakt); + if(mb_strlen($row_1->kontakt)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($row_1->kontakt); $worksheet->writeString($zeile,$i, $row_1->kontakt); } } @@ -420,10 +429,12 @@ loadVariables($conn, $user); //Spezialgruppen $grps=''; - $qry_1 = "SELECT gruppe_kurzbz FROM public.tbl_student JOIN public.tbl_benutzergruppe ON (student_uid=uid) WHERE tbl_student.prestudent_id='$row->prestudent_id' AND tbl_benutzergruppe.studiensemester_kurzbz='$studiensemester_kurzbz'"; - if($result_1 = pg_query($conn, $qry_1)) + $qry_1 = "SELECT gruppe_kurzbz FROM public.tbl_student JOIN public.tbl_benutzergruppe ON (student_uid=uid) + WHERE tbl_student.prestudent_id='".addslashes($row->prestudent_id)."' + AND tbl_benutzergruppe.studiensemester_kurzbz='".addslashes($studiensemester_kurzbz)."'"; + if($db->db_query($qry_1)) { - while($row_1 = pg_fetch_object($result_1)) + while($row_1 = $db->db_fetch_object()) { if($grps!='') $grps.=','; @@ -431,48 +442,48 @@ loadVariables($conn, $user); $grps.=$row_1->gruppe_kurzbz; } } - if(strlen($grps)>$maxlength[$i]) - $maxlength[$i]=strlen($grps); + if(mb_strlen($grps)>$maxlength[$i]) + $maxlength[$i]=mb_strlen($grps); $worksheet->write($zeile,$i, $grps); $i++; //UID if(isset($row->student_uid)) { - if(strlen($row->student_uid)>$maxlength[$i]) - $maxlength[$i] = strlen($row->student_uid); + if(mb_strlen($row->student_uid)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->student_uid); $worksheet->write($zeile,$i, $row->student_uid); } $i++; //Orgform - if(strlen($orgform)>$maxlength[$i]) - $maxlength[$i] = strlen($orgform); + if(mb_strlen($orgform)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($orgform); $worksheet->write($zeile,$i, $orgform); $i++; //Vornamen - if(strlen($row->vornamen)>$maxlength[$i]) - $maxlength[$i] = strlen($row->vornamen); + if(mb_strlen($row->vornamen)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->vornamen); $worksheet->write($zeile,$i, $row->vornamen); $i++; //RT_Punkte1 - if(strlen($row->rt_punkte1)>$maxlength[$i]) - $maxlength[$i] = strlen($row->rt_punkte1); + if(mb_strlen($row->rt_punkte1)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->rt_punkte1); $worksheet->write($zeile,$i, $row->rt_punkte1); $i++; //RT_Punkte2 - if(strlen($row->rt_punkte2)>$maxlength[$i]) - $maxlength[$i] = strlen($row->rt_punkte2); + if(mb_strlen($row->rt_punkte2)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->rt_punkte2); $worksheet->write($zeile,$i, $row->rt_punkte2); $i++; //RT_Gesamtpunkte - if(strlen($row->rt_gesamtpunkte)>$maxlength[$i]) - $maxlength[$i] = strlen($row->rt_gesamtpunkte); + if(mb_strlen($row->rt_gesamtpunkte)>$maxlength[$i]) + $maxlength[$i] = mb_strlen($row->rt_gesamtpunkte); $worksheet->write($zeile,$i, $row->rt_gesamtpunkte); $i++; } diff --git a/content/statistik/studentenprosemester.php b/content/statistik/studentenprosemester.php index 3b86f6907..b3afa3e0c 100644 --- a/content/statistik/studentenprosemester.php +++ b/content/statistik/studentenprosemester.php @@ -19,22 +19,19 @@ * Andreas Oesterreicher and * Rudolf Hangl . */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/functions.inc.php'); require_once('../../include/studiengang.class.php'); require_once('../../include/Excel/excel.php'); -if(!$conn = pg_pconnect(CONN_STRING)) - die('Fehler beim Connecten zur Datenbank'); - $user = get_uid(); -loadVariables($conn, $user); - +loadVariables($user); +$db = new basis_db(); $stsem = $semester_aktuell; $format = (isset($_GET['format'])?$_GET['format']:''); -$studiengang = new studiengang($conn); +$studiengang = new studiengang(); $studiengang->getAll('typ, kurzbz', false); $stg_arr = array(); @@ -45,22 +42,22 @@ $qry = " SELECT stdlvb.studiengang_kz, count(*) AS all, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=1 AND studiengang_kz=stdlvb.studiengang_kz ) AS s1, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=2 AND studiengang_kz=stdlvb.studiengang_kz ) AS s2, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=3 AND studiengang_kz=stdlvb.studiengang_kz ) AS s3, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=4 AND studiengang_kz=stdlvb.studiengang_kz ) AS s4, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=5 AND studiengang_kz=stdlvb.studiengang_kz ) AS s5, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=6 AND studiengang_kz=stdlvb.studiengang_kz ) AS s6, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=7 AND studiengang_kz=stdlvb.studiengang_kz ) AS s7, - (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='$stsem' AND semester=8 AND studiengang_kz=stdlvb.studiengang_kz ) AS s8 + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=1 AND studiengang_kz=stdlvb.studiengang_kz ) AS s1, + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=2 AND studiengang_kz=stdlvb.studiengang_kz ) AS s2, + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=3 AND studiengang_kz=stdlvb.studiengang_kz ) AS s3, + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=4 AND studiengang_kz=stdlvb.studiengang_kz ) AS s4, + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=5 AND studiengang_kz=stdlvb.studiengang_kz ) AS s5, + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=6 AND studiengang_kz=stdlvb.studiengang_kz ) AS s6, + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=7 AND studiengang_kz=stdlvb.studiengang_kz ) AS s7, + (SELECT count(*) FROM tbl_studentlehrverband WHERE studiensemester_kurzbz='".addslashes($stsem)."' AND semester=8 AND studiengang_kz=stdlvb.studiengang_kz ) AS s8 FROM tbl_studentlehrverband stdlvb JOIN tbl_studiengang USING(studiengang_kz) WHERE - studiensemester_kurzbz='$stsem' AND semester>0 AND semester<9 AND aktiv + studiensemester_kurzbz='".addslashes($stsem)."' AND semester>0 AND semester<9 AND aktiv GROUP BY typ, kurzbz, studiengang_kz ORDER BY typ, kurzbz, studiengang_kz "; -if(!$result = pg_query($conn, $qry)) +if(!$result = $db->db_query($qry)) die('Fehler bei Datenbankabfrage'); if($format=='xls') @@ -96,7 +93,7 @@ if($format=='xls') $worksheet->write($zeile,++$spalte,'8', $format_bold); $worksheet->write($zeile,++$spalte,'Gesamt', $format_bold); - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { $zeile++; $spalte=0; @@ -138,7 +135,7 @@ else echo ''; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { echo ""; echo ""; diff --git a/content/statistik/studentenstatistik.php b/content/statistik/studentenstatistik.php index a6d58d7d3..a9360287c 100644 --- a/content/statistik/studentenstatistik.php +++ b/content/statistik/studentenstatistik.php @@ -28,15 +28,13 @@ * - Geschlecht * - Herkunft (AT/EU/Nicht EU) */ -require_once('../../vilesci/config.inc.php'); +require_once('../../config/vilesci.config.inc.php'); require_once('../../include/studiensemester.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/functions.inc.php'); -if(!$conn = pg_pconnect(CONN_STRING)) - die('Fehler beim Connecten zur DB'); - -$stsem_obj = new studiensemester($conn); +$db = new basis_db(); +$stsem_obj = new studiensemester(); if(isset($_GET['stsem'])) $stsem = $_GET['stsem']; else @@ -59,7 +57,7 @@ echo ''.date('d.m.Y').'
'; echo ''; echo 'Studiensemester: '; echo ''; - echo ""; + echo ""; $prozent = ($row->gesamt_alle!=0?$row->gesamt_stg/$row->gesamt_alle*100:0); echo ""; echo ""; @@ -225,38 +223,38 @@ if($stsem!='') '; $qry = "SELECT studiengang_kz, kurzbz, typ, kurzbzlang, bezeichnung, orgform_kurzbz, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' ) AS gesamt_stg, (SELECT count(*) FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND typ='m' + WHERE status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND typ='m' ) AS gesamt_alle, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Incoming' AND studiensemester_kurzbz='$stsem' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Incoming' AND studiensemester_kurzbz='".addslashes($stsem)."' ) a) AS inc, (SELECT count(*) FROM (SELECT distinct student_uid FROM public.tbl_student JOIN bis.tbl_bisio USING (student_uid) - WHERE studiengang_kz=stg.studiengang_kz AND (bis>='$stsem_obj->start' OR bis is null) AND von<='$stsem_obj->ende' + WHERE studiengang_kz=stg.studiengang_kz AND (bis>='".addslashes($stsem_obj->start)."' OR bis is null) AND von<='".addslashes($stsem_obj->ende)."' ) a) AS out, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND orgform_kurzbz='BB' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND orgform_kurzbz='BB' ) a) AS bb, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND orgform_kurzbz='VZ' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND orgform_kurzbz='VZ' ) a) AS vz, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND geschlecht='w' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='w' ) a) AS w, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND geschlecht='m' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND geschlecht='m' ) a) AS m, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND nation_code='A' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND nation_code='A' ) a) AS herkunft_at, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND eu AND nation_code<>'A' + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND eu AND nation_code<>'A' ) a) AS herkunft_eu, (SELECT count(*) FROM (SELECT distinct prestudent_id FROM public.tbl_prestudent JOIN public.tbl_prestudentstatus USING (prestudent_id) JOIN public.tbl_person USING(person_id) JOIN bis.tbl_nation on(staatsbuergerschaft=nation_code) - WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='$stsem' AND NOT eu + WHERE studiengang_kz=stg.studiengang_kz AND status_kurzbz='Student' AND studiensemester_kurzbz='".addslashes($stsem)."' AND NOT eu ) a) AS herkunft_noteu, true FROM @@ -264,8 +262,8 @@ if($stsem!='') WHERE studiengang_kz>0 AND studiengang_kz<10000 AND aktiv AND typ='m' ORDER BY typ, kurzbzlang; "; - //echo '
'.$qry.'


'; - if($result = pg_query($conn, $qry)) + + if($result = $db->db_query($qry)) { $gesamt=0; @@ -279,11 +277,11 @@ if($stsem!='') $gesamt_noteu=0; $gesamt_inc=0; $gesamt_out=0; - while($row = pg_fetch_object($result)) + while($row = $db->db_fetch_object($result)) { echo ''; echo ''; - echo ""; + echo ""; $prozent = ($row->gesamt_alle!=0?$row->gesamt_stg/$row->gesamt_alle*100:0); echo ""; echo ""; diff --git a/include/Excel/Workbook.php b/include/Excel/Workbook.php index bdb1b8b7e..070f3ff62 100644 --- a/include/Excel/Workbook.php +++ b/include/Excel/Workbook.php @@ -1,1523 +1,1596 @@ - -* -* The majority of this is _NOT_ my code. I simply ported it from the -* PERL Spreadsheet::WriteExcel module. -* -* The author of the Spreadsheet::WriteExcel module is John McNamara -* -* -* I _DO_ maintain this code, and John McNamara has nothing to do with the -* porting of this code to PHP. Any questions directly related to this -* class library should be directed to me. -* -* License Information: -* -* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets -* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; either -* version 2.1 of the License, or (at your option) any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - - - -/** -* Class for generating Excel Spreadsheets -* -* @author Xavier Noguer -* @category FileFormats -* @package Spreadsheet_Excel_Writer -*/ - -class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwriter -{ - /** - * Filename for the Workbook - * @var string - */ - var $_filename; - - /** - * Formula parser - * @var object Parser - */ - var $_parser; - - /** - * Flag for 1904 date system (0 => base date is 1900, 1 => base date is 1904) - * @var integer - */ - var $_1904; - - /** - * The active worksheet of the workbook (0 indexed) - * @var integer - */ - var $_activesheet; - - /** - * 1st displayed worksheet in the workbook (0 indexed) - * @var integer - */ - var $_firstsheet; - - /** - * Number of workbook tabs selected - * @var integer - */ - var $_selected; - - /** - * Index for creating adding new formats to the workbook - * @var integer - */ - var $_xf_index; - - /** - * Flag for preventing close from being called twice. - * @var integer - * @see close() - */ - var $_fileclosed; - - /** - * The BIFF file size for the workbook. - * @var integer - * @see _calcSheetOffsets() - */ - var $_biffsize; - - /** - * The default sheetname for all sheets created. - * @var string - */ - var $_sheetname; - - /** - * The default XF format. - * @var object Format - */ - var $_tmp_format; - - /** - * Array containing references to all of this workbook's worksheets - * @var array - */ - var $_worksheets; - - /** - * Array of sheetnames for creating the EXTERNSHEET records - * @var array - */ - var $_sheetnames; - - /** - * Array containing references to all of this workbook's formats - * @var array - */ - var $_formats; - - /** - * Array containing the colour palette - * @var array - */ - var $_palette; - - /** - * The default format for URLs. - * @var object Format - */ - var $_url_format; - - /** - * The codepage indicates the text encoding used for strings - * @var integer - */ - var $_codepage; - - /** - * The country code used for localization - * @var integer - */ - var $_country_code; - - /** - * The temporary dir for storing the OLE file - * @var string - */ - var $_tmp_dir; - - /** - * number of bytes for sizeinfo of strings - * @var integer - */ - var $_string_sizeinfo_size; - - /** - * Class constructor - * - * @param string filename for storing the workbook. "-" for writing to stdout. - * @access public - */ - function Spreadsheet_Excel_Writer_Workbook($filename) - { - // It needs to call its parent's constructor explicitly - $this->Spreadsheet_Excel_Writer_BIFFwriter(); - - $this->_filename = $filename; - $this->_parser =& new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); - $this->_1904 = 0; - $this->_activesheet = 0; - $this->_firstsheet = 0; - $this->_selected = 0; - $this->_xf_index = 16; // 15 style XF's and 1 cell XF. - $this->_fileclosed = 0; - $this->_biffsize = 0; - $this->_sheetname = 'Sheet'; - $this->_tmp_format =& new Spreadsheet_Excel_Writer_Format($this->_BIFF_version); - $this->_worksheets = array(); - $this->_sheetnames = array(); - $this->_formats = array(); - $this->_palette = array(); - $this->_codepage = 0x04E4; // FIXME: should change for BIFF8 - $this->_country_code = -1; - $this->_string_sizeinfo = 3; - - // Add the default format for hyperlinks - $this->_url_format =& $this->addFormat(array('color' => 'blue', 'underline' => 1)); - $this->_str_total = 0; - $this->_str_unique = 0; - $this->_str_table = array(); - $this->_setPaletteXl97(); - $this->_tmp_dir = ''; - } - - /** - * Calls finalization methods. - * This method should always be the last one to be called on every workbook - * - * @access public - * @return mixed true on success. PEAR_Error on failure - */ - function close() - { - if ($this->_fileclosed) { // Prevent close() from being called twice. - return true; - } - $res = $this->_storeWorkbook(); - if ($this->isError($res)) { - return $this->raiseError($res->getMessage()); - } - $this->_fileclosed = 1; - return true; - } - - /** - * An accessor for the _worksheets[] array - * Returns an array of the worksheet objects in a workbook - * It actually calls to worksheets() - * - * @access public - * @see worksheets() - * @return array - */ - function sheets() - { - return $this->worksheets(); - } - - /** - * An accessor for the _worksheets[] array. - * Returns an array of the worksheet objects in a workbook - * - * @access public - * @return array - */ - function worksheets() - { - return $this->_worksheets; - } - - /** - * Sets the BIFF version. - * This method exists just to access experimental functionality - * from BIFF8. It will be deprecated ! - * Only possible value is 8 (Excel 97/2000). - * For any other value it fails silently. - * - * @access public - * @param integer $version The BIFF version - */ - function setVersion($version) - { - if ($version == 8) { // only accept version 8 - $version = 0x0600; - $this->_BIFF_version = $version; - // change BIFFwriter limit for CONTINUE records - $this->_limit = 8228; - $this->_tmp_format->_BIFF_version = $version; - $this->_url_format->_BIFF_version = $version; - $this->_parser->_BIFF_version = $version; - - $total_worksheets = count($this->_worksheets); - // change version for all worksheets too - for ($i = 0; $i < $total_worksheets; $i++) { - $this->_worksheets[$i]->_BIFF_version = $version; - } - - $total_formats = count($this->_formats); - // change version for all formats too - for ($i = 0; $i < $total_formats; $i++) { - $this->_formats[$i]->_BIFF_version = $version; - } - } - } - - /** - * Set the country identifier for the workbook - * - * @access public - * @param integer $code Is the international calling country code for the - * chosen country. - */ - function setCountry($code) - { - $this->_country_code = $code; - } - - /** - * Add a new worksheet to the Excel workbook. - * If no name is given the name of the worksheet will be Sheeti$i, with - * $i in [1..]. - * - * @access public - * @param string $name the optional name of the worksheet - * @return mixed reference to a worksheet object on success, PEAR_Error - * on failure - */ - function &addWorksheet($name = '') - { - $index = count($this->_worksheets); - $sheetname = $this->_sheetname; - - if ($name == '') { - $name = $sheetname.($index+1); - } - - // Check that sheetname is <= 31 chars (Excel limit before BIFF8). - if ($this->_BIFF_version != 0x0600) - { - if (strlen($name) > 31) { - return $this->raiseError("Sheetname $name must be <= 31 chars"); - } - } - - // Check that the worksheet name doesn't already exist: a fatal Excel error. - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - if ($this->_worksheets[$i]->getName() == $name) { - return $this->raiseError("Worksheet '$name' already exists"); - } - } - - $worksheet = new Spreadsheet_Excel_Writer_Worksheet($this->_BIFF_version, - $name, $index, - $this->_activesheet, $this->_firstsheet, - $this->_str_total, $this->_str_unique, - $this->_str_table, $this->_url_format, - $this->_parser); - - $this->_worksheets[$index] = &$worksheet; // Store ref for iterator - $this->_sheetnames[$index] = $name; // Store EXTERNSHEET names - $this->_parser->setExtSheet($name, $index); // Register worksheet name with parser - return $worksheet; - } - - /** - * Add a new format to the Excel workbook. - * Also, pass any properties to the Format constructor. - * - * @access public - * @param array $properties array with properties for initializing the format. - * @return &Spreadsheet_Excel_Writer_Format reference to an Excel Format - */ - function &addFormat($properties = array()) - { - $format = new Spreadsheet_Excel_Writer_Format($this->_BIFF_version, $this->_xf_index, $properties); - $this->_xf_index += 1; - $this->_formats[] = &$format; - return $format; - } - - /** - * Create new validator. - * - * @access public - * @return &Spreadsheet_Excel_Writer_Validator reference to a Validator - */ - function &addValidator() - { - require_once 'Validator.php'; - /* FIXME: check for successful inclusion*/ - $valid = new Spreadsheet_Excel_Writer_Validator($this->_parser); - return $valid; - } - - /** - * Change the RGB components of the elements in the colour palette. - * - * @access public - * @param integer $index colour index - * @param integer $red red RGB value [0-255] - * @param integer $green green RGB value [0-255] - * @param integer $blue blue RGB value [0-255] - * @return integer The palette index for the custom color - */ - function setCustomColor($index, $red, $green, $blue) - { - // Match a HTML #xxyyzz style parameter - /*if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { - @_ = ($_[0], hex $1, hex $2, hex $3); - }*/ - - // Check that the colour index is the right range - if ($index < 8 or $index > 64) { - // TODO: assign real error codes - return $this->raiseError("Color index $index outside range: 8 <= index <= 64"); - } - - // Check that the colour components are in the right range - if (($red < 0 or $red > 255) || - ($green < 0 or $green > 255) || - ($blue < 0 or $blue > 255)) - { - return $this->raiseError("Color component outside range: 0 <= color <= 255"); - } - - $index -= 8; // Adjust colour index (wingless dragonfly) - - // Set the RGB value - $this->_palette[$index] = array($red, $green, $blue, 0); - return($index + 8); - } - - /** - * Sets the colour palette to the Excel 97+ default. - * - * @access private - */ - function _setPaletteXl97() - { - $this->_palette = array( - array(0x00, 0x00, 0x00, 0x00), // 8 - array(0xff, 0xff, 0xff, 0x00), // 9 - array(0xff, 0x00, 0x00, 0x00), // 10 - array(0x00, 0xff, 0x00, 0x00), // 11 - array(0x00, 0x00, 0xff, 0x00), // 12 - array(0xff, 0xff, 0x00, 0x00), // 13 - array(0xff, 0x00, 0xff, 0x00), // 14 - array(0x00, 0xff, 0xff, 0x00), // 15 - array(0x80, 0x00, 0x00, 0x00), // 16 - array(0x00, 0x80, 0x00, 0x00), // 17 - array(0x00, 0x00, 0x80, 0x00), // 18 - array(0x80, 0x80, 0x00, 0x00), // 19 - array(0x80, 0x00, 0x80, 0x00), // 20 - array(0x00, 0x80, 0x80, 0x00), // 21 - array(0xc0, 0xc0, 0xc0, 0x00), // 22 - array(0x80, 0x80, 0x80, 0x00), // 23 - array(0x99, 0x99, 0xff, 0x00), // 24 - array(0x99, 0x33, 0x66, 0x00), // 25 - array(0xff, 0xff, 0xcc, 0x00), // 26 - array(0xcc, 0xff, 0xff, 0x00), // 27 - array(0x66, 0x00, 0x66, 0x00), // 28 - array(0xff, 0x80, 0x80, 0x00), // 29 - array(0x00, 0x66, 0xcc, 0x00), // 30 - array(0xcc, 0xcc, 0xff, 0x00), // 31 - array(0x00, 0x00, 0x80, 0x00), // 32 - array(0xff, 0x00, 0xff, 0x00), // 33 - array(0xff, 0xff, 0x00, 0x00), // 34 - array(0x00, 0xff, 0xff, 0x00), // 35 - array(0x80, 0x00, 0x80, 0x00), // 36 - array(0x80, 0x00, 0x00, 0x00), // 37 - array(0x00, 0x80, 0x80, 0x00), // 38 - array(0x00, 0x00, 0xff, 0x00), // 39 - array(0x00, 0xcc, 0xff, 0x00), // 40 - array(0xcc, 0xff, 0xff, 0x00), // 41 - array(0xcc, 0xff, 0xcc, 0x00), // 42 - array(0xff, 0xff, 0x99, 0x00), // 43 - array(0x99, 0xcc, 0xff, 0x00), // 44 - array(0xff, 0x99, 0xcc, 0x00), // 45 - array(0xcc, 0x99, 0xff, 0x00), // 46 - array(0xff, 0xcc, 0x99, 0x00), // 47 - array(0x33, 0x66, 0xff, 0x00), // 48 - array(0x33, 0xcc, 0xcc, 0x00), // 49 - array(0x99, 0xcc, 0x00, 0x00), // 50 - array(0xff, 0xcc, 0x00, 0x00), // 51 - array(0xff, 0x99, 0x00, 0x00), // 52 - array(0xff, 0x66, 0x00, 0x00), // 53 - array(0x66, 0x66, 0x99, 0x00), // 54 - array(0x96, 0x96, 0x96, 0x00), // 55 - array(0x00, 0x33, 0x66, 0x00), // 56 - array(0x33, 0x99, 0x66, 0x00), // 57 - array(0x00, 0x33, 0x00, 0x00), // 58 - array(0x33, 0x33, 0x00, 0x00), // 59 - array(0x99, 0x33, 0x00, 0x00), // 60 - array(0x99, 0x33, 0x66, 0x00), // 61 - array(0x33, 0x33, 0x99, 0x00), // 62 - array(0x33, 0x33, 0x33, 0x00), // 63 - ); - } - - /** - * Assemble worksheets into a workbook and send the BIFF data to an OLE - * storage. - * - * @access private - * @return mixed true on success. PEAR_Error on failure - */ - function _storeWorkbook() - { - // Ensure that at least one worksheet has been selected. - if ($this->_activesheet == 0) { - $this->_worksheets[0]->selected = 1; - } - - // Calculate the number of selected worksheet tabs and call the finalization - // methods for each worksheet - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - if ($this->_worksheets[$i]->selected) { - $this->_selected++; - } - $this->_worksheets[$i]->close($this->_sheetnames); - } - - // Add Workbook globals - $this->_storeBof(0x0005); - $this->_storeCodepage(); - if ($this->_BIFF_version == 0x0600) { - $this->_storeWindow1(); - } - if ($this->_BIFF_version == 0x0500) { - $this->_storeExterns(); // For print area and repeat rows - } - $this->_storeNames(); // For print area and repeat rows - if ($this->_BIFF_version == 0x0500) { - $this->_storeWindow1(); - } - $this->_storeDatemode(); - $this->_storeAllFonts(); - $this->_storeAllNumFormats(); - $this->_storeAllXfs(); - $this->_storeAllStyles(); - $this->_storePalette(); - $this->_calcSheetOffsets(); - - // Add BOUNDSHEET records - for ($i = 0; $i < $total_worksheets; $i++) { - $this->_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset); - } - - if ($this->_country_code != -1) { - $this->_storeCountry(); - } - - if ($this->_BIFF_version == 0x0600) { - //$this->_storeSupbookInternal(); - /* TODO: store external SUPBOOK records and XCT and CRN records - in case of external references for BIFF8 */ - //$this->_storeExternsheetBiff8(); - $this->_storeSharedStringsTable(); - } - - // End Workbook globals - $this->_storeEof(); - - // Store the workbook in an OLE container - $res = $this->_storeOLEFile(); - if ($this->isError($res)) { - return $this->raiseError($res->getMessage()); - } - return true; - } - - /** - * Sets the temp dir used for storing the OLE file - * - * @access public - * @param string $dir The dir to be used as temp dir - * @return true if given dir is valid, false otherwise - */ - function setTempDir($dir) - { - if (is_dir($dir)) { - $this->_tmp_dir = $dir; - return true; - } - return false; - } - - /** - * Store the workbook in an OLE container - * - * @access private - * @return mixed true on success. PEAR_Error on failure - */ - function _storeOLEFile() - { - $OLE = new OLE_PPS_File(OLE::Asc2Ucs('Book')); - if ($this->_tmp_dir != '') { - $OLE->setTempDir($this->_tmp_dir); - } - $res = $OLE->init(); - if ($this->isError($res)) { - return $this->raiseError("OLE Error: ".$res->getMessage()); - } - $OLE->append($this->_data); - - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - while ($tmp = $this->_worksheets[$i]->getData()) { - $OLE->append($tmp); - } - } - - $root = new OLE_PPS_Root(time(), time(), array($OLE)); - if ($this->_tmp_dir != '') { - $root->setTempDir($this->_tmp_dir); - } - - $res = $root->save($this->_filename); - if ($this->isError($res)) { - return $this->raiseError("OLE Error: ".$res->getMessage()); - } - return true; - } - - /** - * Calculate offsets for Worksheet BOF records. - * - * @access private - */ - function _calcSheetOffsets() - { - if ($this->_BIFF_version == 0x0600) { - $boundsheet_length = 12; // fixed length for a BOUNDSHEET record - } else { - $boundsheet_length = 11; - } - $EOF = 4; - $offset = $this->_datasize; - - if ($this->_BIFF_version == 0x0600) { - // add the length of the SST - /* TODO: check this works for a lot of strings (> 8224 bytes) */ - $offset += $this->_calculateSharedStringsSizes(); - if ($this->_country_code != -1) { - $offset += 8; // adding COUNTRY record - } - // add the lenght of SUPBOOK, EXTERNSHEET and NAME records - //$offset += 8; // FIXME: calculate real value when storing the records - } - $total_worksheets = count($this->_worksheets); - // add the length of the BOUNDSHEET records - for ($i = 0; $i < $total_worksheets; $i++) { - $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name); - } - $offset += $EOF; - - for ($i = 0; $i < $total_worksheets; $i++) { - $this->_worksheets[$i]->offset = $offset; - $offset += $this->_worksheets[$i]->_datasize; - } - $this->_biffsize = $offset; - } - - /** - * Store the Excel FONT records. - * - * @access private - */ - function _storeAllFonts() - { - // tmp_format is added by the constructor. We use this to write the default XF's - $format = $this->_tmp_format; - $font = $format->getFont(); - - // Note: Fonts are 0-indexed. According to the SDK there is no index 4, - // so the following fonts are 0, 1, 2, 3, 5 - // - for ($i = 1; $i <= 5; $i++){ - $this->_append($font); - } - - // Iterate through the XF objects and write a FONT record if it isn't the - // same as the default FONT and if it hasn't already been used. - // - $fonts = array(); - $index = 6; // The first user defined FONT - - $key = $format->getFontKey(); // The default font from _tmp_format - $fonts[$key] = 0; // Index of the default font - - $total_formats = count($this->_formats); - for ($i = 0; $i < $total_formats; $i++) { - $key = $this->_formats[$i]->getFontKey(); - if (isset($fonts[$key])) { - // FONT has already been used - $this->_formats[$i]->font_index = $fonts[$key]; - } else { - // Add a new FONT record - $fonts[$key] = $index; - $this->_formats[$i]->font_index = $index; - $index++; - $font = $this->_formats[$i]->getFont(); - $this->_append($font); - } - } - } - - /** - * Store user defined numerical formats i.e. FORMAT records - * - * @access private - */ - function _storeAllNumFormats() - { - // Leaning num_format syndrome - $hash_num_formats = array(); - $num_formats = array(); - $index = 164; - - // Iterate through the XF objects and write a FORMAT record if it isn't a - // built-in format type and if the FORMAT string hasn't already been used. - $total_formats = count($this->_formats); - for ($i = 0; $i < $total_formats; $i++) { - $num_format = $this->_formats[$i]->_num_format; - - // Check if $num_format is an index to a built-in format. - // Also check for a string of zeros, which is a valid format string - // but would evaluate to zero. - // - if (!preg_match("/^0+\d/", $num_format)) { - if (preg_match("/^\d+$/", $num_format)) { // built-in format - continue; - } - } - - if (isset($hash_num_formats[$num_format])) { - // FORMAT has already been used - $this->_formats[$i]->_num_format = $hash_num_formats[$num_format]; - } else{ - // Add a new FORMAT - $hash_num_formats[$num_format] = $index; - $this->_formats[$i]->_num_format = $index; - array_push($num_formats,$num_format); - $index++; - } - } - - // Write the new FORMAT records starting from 0xA4 - $index = 164; - foreach ($num_formats as $num_format) { - $this->_storeNumFormat($num_format,$index); - $index++; - } - } - - /** - * Write all XF records. - * - * @access private - */ - function _storeAllXfs() - { - // _tmp_format is added by the constructor. We use this to write the default XF's - // The default font index is 0 - // - $format = $this->_tmp_format; - for ($i = 0; $i <= 14; $i++) { - $xf = $format->getXf('style'); // Style XF - $this->_append($xf); - } - - $xf = $format->getXf('cell'); // Cell XF - $this->_append($xf); - - // User defined XFs - $total_formats = count($this->_formats); - for ($i = 0; $i < $total_formats; $i++) { - $xf = $this->_formats[$i]->getXf('cell'); - $this->_append($xf); - } - } - - /** - * Write all STYLE records. - * - * @access private - */ - function _storeAllStyles() - { - $this->_storeStyle(); - } - - /** - * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for - * the NAME records. - * - * @access private - */ - function _storeExterns() - { - // Create EXTERNCOUNT with number of worksheets - $this->_storeExterncount(count($this->_worksheets)); - - // Create EXTERNSHEET for each worksheet - foreach ($this->_sheetnames as $sheetname) { - $this->_storeExternsheet($sheetname); - } - } - - /** - * Write the NAME record to define the print area and the repeat rows and cols. - * - * @access private - */ - function _storeNames() - { - // Create the print area NAME records - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - // Write a Name record if the print area has been defined - if (isset($this->_worksheets[$i]->print_rowmin)) { - $this->_storeNameShort( - $this->_worksheets[$i]->index, - 0x06, // NAME type - $this->_worksheets[$i]->print_rowmin, - $this->_worksheets[$i]->print_rowmax, - $this->_worksheets[$i]->print_colmin, - $this->_worksheets[$i]->print_colmax - ); - } - } - - // Create the print title NAME records - $total_worksheets = count($this->_worksheets); - for ($i = 0; $i < $total_worksheets; $i++) { - $rowmin = $this->_worksheets[$i]->title_rowmin; - $rowmax = $this->_worksheets[$i]->title_rowmax; - $colmin = $this->_worksheets[$i]->title_colmin; - $colmax = $this->_worksheets[$i]->title_colmax; - - // Determine if row + col, row, col or nothing has been defined - // and write the appropriate record - // - if (isset($rowmin) && isset($colmin)) { - // Row and column titles have been defined. - // Row title has been defined. - $this->_storeNameLong( - $this->_worksheets[$i]->index, - 0x07, // NAME type - $rowmin, - $rowmax, - $colmin, - $colmax - ); - } elseif (isset($rowmin)) { - // Row title has been defined. - $this->_storeNameShort( - $this->_worksheets[$i]->index, - 0x07, // NAME type - $rowmin, - $rowmax, - 0x00, - 0xff - ); - } elseif (isset($colmin)) { - // Column title has been defined. - $this->_storeNameShort( - $this->_worksheets[$i]->index, - 0x07, // NAME type - 0x0000, - 0x3fff, - $colmin, - $colmax - ); - } else { - // Print title hasn't been defined. - } - } - } - - - - - /****************************************************************************** - * - * BIFF RECORDS - * - */ - - /** - * Stores the CODEPAGE biff record. - * - * @access private - */ - function _storeCodepage() - { - $record = 0x0042; // Record identifier - $length = 0x0002; // Number of bytes to follow - $cv = $this->_codepage; // The code page - - $header = pack('vv', $record, $length); - $data = pack('v', $cv); - - $this->_append($header . $data); - } - - /** - * Write Excel BIFF WINDOW1 record. - * - * @access private - */ - function _storeWindow1() - { - $record = 0x003D; // Record identifier - $length = 0x0012; // Number of bytes to follow - - $xWn = 0x0000; // Horizontal position of window - $yWn = 0x0000; // Vertical position of window - $dxWn = 0x25BC; // Width of window - $dyWn = 0x1572; // Height of window - - $grbit = 0x0038; // Option flags - $ctabsel = $this->_selected; // Number of workbook tabs selected - $wTabRatio = 0x0258; // Tab to scrollbar ratio - - $itabFirst = $this->_firstsheet; // 1st displayed worksheet - $itabCur = $this->_activesheet; // Active worksheet - - $header = pack("vv", $record, $length); - $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, - $grbit, - $itabCur, $itabFirst, - $ctabsel, $wTabRatio); - $this->_append($header . $data); - } - - /** - * Writes Excel BIFF BOUNDSHEET record. - * FIXME: inconsistent with BIFF documentation - * - * @param string $sheetname Worksheet name - * @param integer $offset Location of worksheet BOF - * @access private - */ - function _storeBoundsheet($sheetname,$offset) - { - $record = 0x0085; // Record identifier - if ($this->_BIFF_version == 0x0600) { - $length = 0x08 + strlen($sheetname); // Number of bytes to follow - } else { - $length = 0x07 + strlen($sheetname); // Number of bytes to follow - } - - $grbit = 0x0000; // Visibility and sheet type - $cch = strlen($sheetname); // Length of sheet name - - $header = pack("vv", $record, $length); - if ($this->_BIFF_version == 0x0600) { - $data = pack("Vvv", $offset, $grbit, $cch); - } else { - $data = pack("VvC", $offset, $grbit, $cch); - } - $this->_append($header.$data.$sheetname); - } - - /** - * Write Internal SUPBOOK record - * - * @access private - */ - function _storeSupbookInternal() - { - $record = 0x01AE; // Record identifier - $length = 0x0004; // Bytes to follow - - $header = pack("vv", $record, $length); - $data = pack("vv", count($this->_worksheets), 0x0104); - $this->_append($header . $data); - } - - /** - * Writes the Excel BIFF EXTERNSHEET record. These references are used by - * formulas. - * - * @param string $sheetname Worksheet name - * @access private - */ - function _storeExternsheetBiff8() - { - $total_references = count($this->_parser->_references); - $record = 0x0017; // Record identifier - $length = 2 + 6 * $total_references; // Number of bytes to follow - - $supbook_index = 0; // FIXME: only using internal SUPBOOK record - $header = pack("vv", $record, $length); - $data = pack('v', $total_references); - for ($i = 0; $i < $total_references; $i++) { - $data .= $this->_parser->_references[$i]; - } - $this->_append($header . $data); - } - - /** - * Write Excel BIFF STYLE records. - * - * @access private - */ - function _storeStyle() - { - $record = 0x0293; // Record identifier - $length = 0x0004; // Bytes to follow - - $ixfe = 0x8000; // Index to style XF - $BuiltIn = 0x00; // Built-in style - $iLevel = 0xff; // Outline style level - - $header = pack("vv", $record, $length); - $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); - $this->_append($header . $data); - } - - - /** - * Writes Excel FORMAT record for non "built-in" numerical formats. - * - * @param string $format Custom format string - * @param integer $ifmt Format index code - * @access private - */ - function _storeNumFormat($format, $ifmt) - { - $record = 0x041E; // Record identifier - - if ($this->_BIFF_version == 0x0600) { - $length = 5 + strlen($format); // Number of bytes to follow - $encoding = 0x0; - } elseif ($this->_BIFF_version == 0x0500) { - $length = 3 + strlen($format); // Number of bytes to follow - } - - $cch = strlen($format); // Length of format string - - $header = pack("vv", $record, $length); - if ($this->_BIFF_version == 0x0600) { - $data = pack("vvC", $ifmt, $cch, $encoding); - } elseif ($this->_BIFF_version == 0x0500) { - $data = pack("vC", $ifmt, $cch); - } - $this->_append($header . $data . $format); - } - - /** - * Write DATEMODE record to indicate the date system in use (1904 or 1900). - * - * @access private - */ - function _storeDatemode() - { - $record = 0x0022; // Record identifier - $length = 0x0002; // Bytes to follow - - $f1904 = $this->_1904; // Flag for 1904 date system - - $header = pack("vv", $record, $length); - $data = pack("v", $f1904); - $this->_append($header . $data); - } - - - /** - * Write BIFF record EXTERNCOUNT to indicate the number of external sheet - * references in the workbook. - * - * Excel only stores references to external sheets that are used in NAME. - * The workbook NAME record is required to define the print area and the repeat - * rows and columns. - * - * A similar method is used in Worksheet.php for a slightly different purpose. - * - * @param integer $cxals Number of external references - * @access private - */ - function _storeExterncount($cxals) - { - $record = 0x0016; // Record identifier - $length = 0x0002; // Number of bytes to follow - - $header = pack("vv", $record, $length); - $data = pack("v", $cxals); - $this->_append($header . $data); - } - - - /** - * Writes the Excel BIFF EXTERNSHEET record. These references are used by - * formulas. NAME record is required to define the print area and the repeat - * rows and columns. - * - * A similar method is used in Worksheet.php for a slightly different purpose. - * - * @param string $sheetname Worksheet name - * @access private - */ - function _storeExternsheet($sheetname) - { - $record = 0x0017; // Record identifier - $length = 0x02 + strlen($sheetname); // Number of bytes to follow - - $cch = strlen($sheetname); // Length of sheet name - $rgch = 0x03; // Filename encoding - - $header = pack("vv", $record, $length); - $data = pack("CC", $cch, $rgch); - $this->_append($header . $data . $sheetname); - } - - - /** - * Store the NAME record in the short format that is used for storing the print - * area, repeat rows only and repeat columns only. - * - * @param integer $index Sheet index - * @param integer $type Built-in name type - * @param integer $rowmin Start row - * @param integer $rowmax End row - * @param integer $colmin Start colum - * @param integer $colmax End column - * @access private - */ - function _storeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax) - { - $record = 0x0018; // Record identifier - $length = 0x0024; // Number of bytes to follow - - $grbit = 0x0020; // Option flags - $chKey = 0x00; // Keyboard shortcut - $cch = 0x01; // Length of text name - $cce = 0x0015; // Length of text definition - $ixals = $index + 1; // Sheet index - $itab = $ixals; // Equal to ixals - $cchCustMenu = 0x00; // Length of cust menu text - $cchDescription = 0x00; // Length of description text - $cchHelptopic = 0x00; // Length of help topic text - $cchStatustext = 0x00; // Length of status bar text - $rgch = $type; // Built-in name type - - $unknown03 = 0x3b; - $unknown04 = 0xffff-$index; - $unknown05 = 0x0000; - $unknown06 = 0x0000; - $unknown07 = 0x1087; - $unknown08 = 0x8005; - - $header = pack("vv", $record, $length); - $data = pack("v", $grbit); - $data .= pack("C", $chKey); - $data .= pack("C", $cch); - $data .= pack("v", $cce); - $data .= pack("v", $ixals); - $data .= pack("v", $itab); - $data .= pack("C", $cchCustMenu); - $data .= pack("C", $cchDescription); - $data .= pack("C", $cchHelptopic); - $data .= pack("C", $cchStatustext); - $data .= pack("C", $rgch); - $data .= pack("C", $unknown03); - $data .= pack("v", $unknown04); - $data .= pack("v", $unknown05); - $data .= pack("v", $unknown06); - $data .= pack("v", $unknown07); - $data .= pack("v", $unknown08); - $data .= pack("v", $index); - $data .= pack("v", $index); - $data .= pack("v", $rowmin); - $data .= pack("v", $rowmax); - $data .= pack("C", $colmin); - $data .= pack("C", $colmax); - $this->_append($header . $data); - } - - - /** - * Store the NAME record in the long format that is used for storing the repeat - * rows and columns when both are specified. This shares a lot of code with - * _storeNameShort() but we use a separate method to keep the code clean. - * Code abstraction for reuse can be carried too far, and I should know. ;-) - * - * @param integer $index Sheet index - * @param integer $type Built-in name type - * @param integer $rowmin Start row - * @param integer $rowmax End row - * @param integer $colmin Start colum - * @param integer $colmax End column - * @access private - */ - function _storeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax) - { - $record = 0x0018; // Record identifier - $length = 0x003d; // Number of bytes to follow - $grbit = 0x0020; // Option flags - $chKey = 0x00; // Keyboard shortcut - $cch = 0x01; // Length of text name - $cce = 0x002e; // Length of text definition - $ixals = $index + 1; // Sheet index - $itab = $ixals; // Equal to ixals - $cchCustMenu = 0x00; // Length of cust menu text - $cchDescription = 0x00; // Length of description text - $cchHelptopic = 0x00; // Length of help topic text - $cchStatustext = 0x00; // Length of status bar text - $rgch = $type; // Built-in name type - - $unknown01 = 0x29; - $unknown02 = 0x002b; - $unknown03 = 0x3b; - $unknown04 = 0xffff-$index; - $unknown05 = 0x0000; - $unknown06 = 0x0000; - $unknown07 = 0x1087; - $unknown08 = 0x8008; - - $header = pack("vv", $record, $length); - $data = pack("v", $grbit); - $data .= pack("C", $chKey); - $data .= pack("C", $cch); - $data .= pack("v", $cce); - $data .= pack("v", $ixals); - $data .= pack("v", $itab); - $data .= pack("C", $cchCustMenu); - $data .= pack("C", $cchDescription); - $data .= pack("C", $cchHelptopic); - $data .= pack("C", $cchStatustext); - $data .= pack("C", $rgch); - $data .= pack("C", $unknown01); - $data .= pack("v", $unknown02); - // Column definition - $data .= pack("C", $unknown03); - $data .= pack("v", $unknown04); - $data .= pack("v", $unknown05); - $data .= pack("v", $unknown06); - $data .= pack("v", $unknown07); - $data .= pack("v", $unknown08); - $data .= pack("v", $index); - $data .= pack("v", $index); - $data .= pack("v", 0x0000); - $data .= pack("v", 0x3fff); - $data .= pack("C", $colmin); - $data .= pack("C", $colmax); - // Row definition - $data .= pack("C", $unknown03); - $data .= pack("v", $unknown04); - $data .= pack("v", $unknown05); - $data .= pack("v", $unknown06); - $data .= pack("v", $unknown07); - $data .= pack("v", $unknown08); - $data .= pack("v", $index); - $data .= pack("v", $index); - $data .= pack("v", $rowmin); - $data .= pack("v", $rowmax); - $data .= pack("C", 0x00); - $data .= pack("C", 0xff); - // End of data - $data .= pack("C", 0x10); - $this->_append($header . $data); - } - - /** - * Stores the COUNTRY record for localization - * - * @access private - */ - function _storeCountry() - { - $record = 0x008C; // Record identifier - $length = 4; // Number of bytes to follow - - $header = pack('vv', $record, $length); - /* using the same country code always for simplicity */ - $data = pack('vv', $this->_country_code, $this->_country_code); - $this->_append($header . $data); - } - - /** - * Stores the PALETTE biff record. - * - * @access private - */ - function _storePalette() - { - $aref = $this->_palette; - - $record = 0x0092; // Record identifier - $length = 2 + 4 * count($aref); // Number of bytes to follow - $ccv = count($aref); // Number of RGB values to follow - $data = ''; // The RGB data - - // Pack the RGB data - foreach ($aref as $color) { - foreach ($color as $byte) { - $data .= pack("C",$byte); - } - } - - $header = pack("vvv", $record, $length, $ccv); - $this->_append($header . $data); - } - - /** - * Calculate - * Handling of the SST continue blocks is complicated by the need to include an - * additional continuation byte depending on whether the string is split between - * blocks or whether it starts at the beginning of the block. (There are also - * additional complications that will arise later when/if Rich Strings are - * supported). - * - * @access private - */ - function _calculateSharedStringsSizes() - { - /* Iterate through the strings to calculate the CONTINUE block sizes. - For simplicity we use the same size for the SST and CONTINUE records: - 8228 : Maximum Excel97 block size - -4 : Length of block header - -8 : Length of additional SST header information - = 8216 - */ - $continue_limit = 8216; - $block_length = 0; - $written = 0; - $this->_block_sizes = array(); - $continue = 0; - - foreach (array_keys($this->_str_table) as $string) { - $string_length = strlen($string); - - // Block length is the total length of the strings that will be - // written out in a single SST or CONTINUE block. - $block_length += $string_length; - - // We can write the string if it doesn't cross a CONTINUE boundary - if ($block_length < $continue_limit) { - $written += $string_length; - continue; - } - - // Deal with the cases where the next string to be written will exceed - // the CONTINUE boundary. If the string is very long it may need to be - // written in more than one CONTINUE record. - while ($block_length >= $continue_limit) { - - // We need to avoid the case where a string is continued in the first - // n bytes that contain the string header information. - $header_length = 3; // Min string + header size -1 - $space_remaining = $continue_limit - $written - $continue; - - - /* TODO: Unicode data should only be split on char (2 byte) - boundaries. Therefore, in some cases we need to reduce the - amount of available - */ - - if ($space_remaining > $header_length) { - // Write as much as possible of the string in the current block - $written += $space_remaining; - - // Reduce the current block length by the amount written - $block_length -= $continue_limit - $continue; - - // Store the max size for this block - $this->_block_sizes[] = $continue_limit; - - // If the current string was split then the next CONTINUE block - // should have the string continue flag (grbit) set unless the - // split string fits exactly into the remaining space. - if ($block_length > 0) { - $continue = 1; - } else { - $continue = 0; - } - } else { - // Store the max size for this block - $this->_block_sizes[] = $written + $continue; - - // Not enough space to start the string in the current block - $block_length -= $continue_limit - $space_remaining - $continue; - $continue = 0; - - } - - // If the string (or substr) is small enough we can write it in the - // new CONTINUE block. Else, go through the loop again to write it in - // one or more CONTINUE blocks - if ($block_length < $continue_limit) { - $written = $block_length; - } else { - $written = 0; - } - } - } - - // Store the max size for the last block unless it is empty - if ($written + $continue) { - $this->_block_sizes[] = $written + $continue; - } - - - /* Calculate the total length of the SST and associated CONTINUEs (if any). - The SST record will have a length even if it contains no strings. - This length is required to set the offsets in the BOUNDSHEET records since - they must be written before the SST records - */ - $total_offset = array_sum($this->_block_sizes); - // SST information - $total_offset += 8; - if (!empty($this->_block_sizes)) { - $total_offset += (count($this->_block_sizes)) * 4; // add CONTINUE headers - } - return $total_offset; - } - - /** - * Write all of the workbooks strings into an indexed array. - * See the comments in _calculate_shared_string_sizes() for more information. - * - * The Excel documentation says that the SST record should be followed by an - * EXTSST record. The EXTSST record is a hash table that is used to optimise - * access to SST. However, despite the documentation it doesn't seem to be - * required so we will ignore it. - * - * @access private - */ - function _storeSharedStringsTable() - { - $record = 0x00fc; // Record identifier - // sizes are upside down - $this->_block_sizes = array_reverse($this->_block_sizes); - $length = array_pop($this->_block_sizes) + 8; // First block size plus SST information - - // Write the SST block header information - $header = pack("vv", $record, $length); - $data = pack("VV", $this->_str_total, $this->_str_unique); - $this->_append($header . $data); - - - // Iterate through the strings to calculate the CONTINUE block sizes - $continue_limit = 8216; - $block_length = 0; - $written = 0; - $continue = 0; - - - /* TODO: not good for performance */ - foreach (array_keys($this->_str_table) as $string) { - - $string_length = strlen($string); - $encoding = 0; // assume there are no Unicode strings - $split_string = 0; - - // Block length is the total length of the strings that will be - // written out in a single SST or CONTINUE block. - // - $block_length += $string_length; - - - // We can write the string if it doesn't cross a CONTINUE boundary - if ($block_length < $continue_limit) { - $this->_append($string); - $written += $string_length; - continue; - } - - // Deal with the cases where the next string to be written will exceed - // the CONTINUE boundary. If the string is very long it may need to be - // written in more than one CONTINUE record. - // - while ($block_length >= $continue_limit) { - - // We need to avoid the case where a string is continued in the first - // n bytes that contain the string header information. - // - $header_length = 3; // Min string + header size -1 - $space_remaining = $continue_limit - $written - $continue; - - - // Unicode data should only be split on char (2 byte) boundaries. - // Therefore, in some cases we need to reduce the amount of available - - if ($space_remaining > $header_length) { - // Write as much as possible of the string in the current block - $tmp = substr($string, 0, $space_remaining); - $this->_append($tmp); - - // The remainder will be written in the next block(s) - $string = substr($string, $space_remaining); - - // Reduce the current block length by the amount written - $block_length -= $continue_limit - $continue; - - // If the current string was split then the next CONTINUE block - // should have the string continue flag (grbit) set unless the - // split string fits exactly into the remaining space. - // - if ($block_length > 0) { - $continue = 1; - } else { - $continue = 0; - } - } else { - // Not enough space to start the string in the current block - $block_length -= $continue_limit - $space_remaining - $continue; - $continue = 0; - } - - // Write the CONTINUE block header - if (!empty($this->_block_sizes)) { - $record = 0x003C; - $length = array_pop($this->_block_sizes); - $header = pack('vv', $record, $length); - if ($continue) { - $header .= pack('C', $encoding); - } - $this->_append($header); - } - - // If the string (or substr) is small enough we can write it in the - // new CONTINUE block. Else, go through the loop again to write it in - // one or more CONTINUE blocks - // - if ($block_length < $continue_limit) { - $this->_append($string); - $written = $block_length; - } else { - $written = 0; - } - } - } - } -} -?> + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +/** +* Class for generating Excel Spreadsheets +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwriter +{ + /** + * Filename for the Workbook + * @var string + */ + var $_filename; + + /** + * Formula parser + * @var object Parser + */ + var $_parser; + + /** + * Flag for 1904 date system (0 => base date is 1900, 1 => base date is 1904) + * @var integer + */ + var $_1904; + + /** + * The active worksheet of the workbook (0 indexed) + * @var integer + */ + var $_activesheet; + + /** + * 1st displayed worksheet in the workbook (0 indexed) + * @var integer + */ + var $_firstsheet; + + /** + * Number of workbook tabs selected + * @var integer + */ + var $_selected; + + /** + * Index for creating adding new formats to the workbook + * @var integer + */ + var $_xf_index; + + /** + * Flag for preventing close from being called twice. + * @var integer + * @see close() + */ + var $_fileclosed; + + /** + * The BIFF file size for the workbook. + * @var integer + * @see _calcSheetOffsets() + */ + var $_biffsize; + + /** + * The default sheetname for all sheets created. + * @var string + */ + var $_sheetname; + + /** + * The default XF format. + * @var object Format + */ + var $_tmp_format; + + /** + * Array containing references to all of this workbook's worksheets + * @var array + */ + var $_worksheets; + + /** + * Array of sheetnames for creating the EXTERNSHEET records + * @var array + */ + var $_sheetnames; + + /** + * Array containing references to all of this workbook's formats + * @var array + */ + var $_formats; + + /** + * Array containing the colour palette + * @var array + */ + var $_palette; + + /** + * The default format for URLs. + * @var object Format + */ + var $_url_format; + + /** + * The codepage indicates the text encoding used for strings + * @var integer + */ + var $_codepage; + + /** + * The country code used for localization + * @var integer + */ + var $_country_code; + + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * number of bytes for sizeinfo of strings + * @var integer + */ + var $_string_sizeinfo_size; + + /** + * Class constructor + * + * @param string filename for storing the workbook. "-" for writing to stdout. + * @access public + */ + function Spreadsheet_Excel_Writer_Workbook($filename) + { + // It needs to call its parent's constructor explicitly + $this->Spreadsheet_Excel_Writer_BIFFwriter(); + + $this->_filename = $filename; + $this->_parser =& new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); + $this->_1904 = 0; + $this->_activesheet = 0; + $this->_firstsheet = 0; + $this->_selected = 0; + $this->_xf_index = 16; // 15 style XF's and 1 cell XF. + $this->_fileclosed = 0; + $this->_biffsize = 0; + $this->_sheetname = 'Sheet'; + $this->_tmp_format =& new Spreadsheet_Excel_Writer_Format($this->_BIFF_version); + $this->_worksheets = array(); + $this->_sheetnames = array(); + $this->_formats = array(); + $this->_palette = array(); + $this->_codepage = 0x04E4; // FIXME: should change for BIFF8 + $this->_country_code = -1; + $this->_string_sizeinfo = 3; + + // Add the default format for hyperlinks + $this->_url_format =& $this->addFormat(array('color' => 'blue', 'underline' => 1)); + $this->_str_total = 0; + $this->_str_unique = 0; + $this->_str_table = array(); + $this->_setPaletteXl97(); + $this->_tmp_dir = ''; + } + + /** + * Calls finalization methods. + * This method should always be the last one to be called on every workbook + * + * @access public + * @return mixed true on success. PEAR_Error on failure + */ + function close() + { + if ($this->_fileclosed) { // Prevent close() from being called twice. + return true; + } + $res = $this->_storeWorkbook(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + $this->_fileclosed = 1; + return true; + } + + /** + * An accessor for the _worksheets[] array + * Returns an array of the worksheet objects in a workbook + * It actually calls to worksheets() + * + * @access public + * @see worksheets() + * @return array + */ + function sheets() + { + return $this->worksheets(); + } + + /** + * An accessor for the _worksheets[] array. + * Returns an array of the worksheet objects in a workbook + * + * @access public + * @return array + */ + function worksheets() + { + return $this->_worksheets; + } + + /** + * Sets the BIFF version. + * This method exists just to access experimental functionality + * from BIFF8. It will be deprecated ! + * Only possible value is 8 (Excel 97/2000). + * For any other value it fails silently. + * + * @access public + * @param integer $version The BIFF version + */ + function setVersion($version) + { + if ($version == 8) { // only accept version 8 + $version = 0x0600; + $this->_BIFF_version = $version; + // change BIFFwriter limit for CONTINUE records + $this->_limit = 8228; + $this->_tmp_format->_BIFF_version = $version; + $this->_url_format->_BIFF_version = $version; + $this->_parser->_BIFF_version = $version; + + $total_worksheets = count($this->_worksheets); + // change version for all worksheets too + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->_BIFF_version = $version; + } + + $total_formats = count($this->_formats); + // change version for all formats too + for ($i = 0; $i < $total_formats; $i++) { + $this->_formats[$i]->_BIFF_version = $version; + } + } + } + + /** + * Set the country identifier for the workbook + * + * @access public + * @param integer $code Is the international calling country code for the + * chosen country. + */ + function setCountry($code) + { + $this->_country_code = $code; + } + + /** + * Add a new worksheet to the Excel workbook. + * If no name is given the name of the worksheet will be Sheeti$i, with + * $i in [1..]. + * + * @access public + * @param string $name the optional name of the worksheet + * @return mixed reference to a worksheet object on success, PEAR_Error + * on failure + */ + function &addWorksheet($name = '') + { + $index = count($this->_worksheets); + $sheetname = $this->_sheetname; + + if ($name == '') { + $name = $sheetname.($index+1); + } + + // Check that sheetname is <= 31 chars (Excel limit before BIFF8). + if ($this->_BIFF_version != 0x0600) + { + if (strlen($name) > 31) { + return $this->raiseError("Sheetname $name must be <= 31 chars"); + } + } + + // Check that the worksheet name doesn't already exist: a fatal Excel error. + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + if ($this->_worksheets[$i]->getName() == $name) { + return $this->raiseError("Worksheet '$name' already exists"); + } + } + + $worksheet = new Spreadsheet_Excel_Writer_Worksheet($this->_BIFF_version, + $name, $index, + $this->_activesheet, $this->_firstsheet, + $this->_str_total, $this->_str_unique, + $this->_str_table, $this->_url_format, + $this->_parser); + + $this->_worksheets[$index] = &$worksheet; // Store ref for iterator + $this->_sheetnames[$index] = $name; // Store EXTERNSHEET names + $this->_parser->setExtSheet($name, $index); // Register worksheet name with parser + return $worksheet; + } + + /** + * Add a new format to the Excel workbook. + * Also, pass any properties to the Format constructor. + * + * @access public + * @param array $properties array with properties for initializing the format. + * @return &Spreadsheet_Excel_Writer_Format reference to an Excel Format + */ + function &addFormat($properties = array()) + { + $format = new Spreadsheet_Excel_Writer_Format($this->_BIFF_version, $this->_xf_index, $properties); + $this->_xf_index += 1; + $this->_formats[] = &$format; + return $format; + } + + /** + * Create new validator. + * + * @access public + * @return &Spreadsheet_Excel_Writer_Validator reference to a Validator + */ + function &addValidator() + { + include_once 'Spreadsheet/Excel/Writer/Validator.php'; + /* FIXME: check for successful inclusion*/ + $valid = new Spreadsheet_Excel_Writer_Validator($this->_parser); + return $valid; + } + + /** + * Change the RGB components of the elements in the colour palette. + * + * @access public + * @param integer $index colour index + * @param integer $red red RGB value [0-255] + * @param integer $green green RGB value [0-255] + * @param integer $blue blue RGB value [0-255] + * @return integer The palette index for the custom color + */ + function setCustomColor($index, $red, $green, $blue) + { + // Match a HTML #xxyyzz style parameter + /*if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { + @_ = ($_[0], hex $1, hex $2, hex $3); + }*/ + + // Check that the colour index is the right range + if ($index < 8 or $index > 64) { + // TODO: assign real error codes + return $this->raiseError("Color index $index outside range: 8 <= index <= 64"); + } + + // Check that the colour components are in the right range + if (($red < 0 or $red > 255) || + ($green < 0 or $green > 255) || + ($blue < 0 or $blue > 255)) + { + return $this->raiseError("Color component outside range: 0 <= color <= 255"); + } + + $index -= 8; // Adjust colour index (wingless dragonfly) + + // Set the RGB value + $this->_palette[$index] = array($red, $green, $blue, 0); + return($index + 8); + } + + /** + * Sets the colour palette to the Excel 97+ default. + * + * @access private + */ + function _setPaletteXl97() + { + $this->_palette = array( + array(0x00, 0x00, 0x00, 0x00), // 8 + array(0xff, 0xff, 0xff, 0x00), // 9 + array(0xff, 0x00, 0x00, 0x00), // 10 + array(0x00, 0xff, 0x00, 0x00), // 11 + array(0x00, 0x00, 0xff, 0x00), // 12 + array(0xff, 0xff, 0x00, 0x00), // 13 + array(0xff, 0x00, 0xff, 0x00), // 14 + array(0x00, 0xff, 0xff, 0x00), // 15 + array(0x80, 0x00, 0x00, 0x00), // 16 + array(0x00, 0x80, 0x00, 0x00), // 17 + array(0x00, 0x00, 0x80, 0x00), // 18 + array(0x80, 0x80, 0x00, 0x00), // 19 + array(0x80, 0x00, 0x80, 0x00), // 20 + array(0x00, 0x80, 0x80, 0x00), // 21 + array(0xc0, 0xc0, 0xc0, 0x00), // 22 + array(0x80, 0x80, 0x80, 0x00), // 23 + array(0x99, 0x99, 0xff, 0x00), // 24 + array(0x99, 0x33, 0x66, 0x00), // 25 + array(0xff, 0xff, 0xcc, 0x00), // 26 + array(0xcc, 0xff, 0xff, 0x00), // 27 + array(0x66, 0x00, 0x66, 0x00), // 28 + array(0xff, 0x80, 0x80, 0x00), // 29 + array(0x00, 0x66, 0xcc, 0x00), // 30 + array(0xcc, 0xcc, 0xff, 0x00), // 31 + array(0x00, 0x00, 0x80, 0x00), // 32 + array(0xff, 0x00, 0xff, 0x00), // 33 + array(0xff, 0xff, 0x00, 0x00), // 34 + array(0x00, 0xff, 0xff, 0x00), // 35 + array(0x80, 0x00, 0x80, 0x00), // 36 + array(0x80, 0x00, 0x00, 0x00), // 37 + array(0x00, 0x80, 0x80, 0x00), // 38 + array(0x00, 0x00, 0xff, 0x00), // 39 + array(0x00, 0xcc, 0xff, 0x00), // 40 + array(0xcc, 0xff, 0xff, 0x00), // 41 + array(0xcc, 0xff, 0xcc, 0x00), // 42 + array(0xff, 0xff, 0x99, 0x00), // 43 + array(0x99, 0xcc, 0xff, 0x00), // 44 + array(0xff, 0x99, 0xcc, 0x00), // 45 + array(0xcc, 0x99, 0xff, 0x00), // 46 + array(0xff, 0xcc, 0x99, 0x00), // 47 + array(0x33, 0x66, 0xff, 0x00), // 48 + array(0x33, 0xcc, 0xcc, 0x00), // 49 + array(0x99, 0xcc, 0x00, 0x00), // 50 + array(0xff, 0xcc, 0x00, 0x00), // 51 + array(0xff, 0x99, 0x00, 0x00), // 52 + array(0xff, 0x66, 0x00, 0x00), // 53 + array(0x66, 0x66, 0x99, 0x00), // 54 + array(0x96, 0x96, 0x96, 0x00), // 55 + array(0x00, 0x33, 0x66, 0x00), // 56 + array(0x33, 0x99, 0x66, 0x00), // 57 + array(0x00, 0x33, 0x00, 0x00), // 58 + array(0x33, 0x33, 0x00, 0x00), // 59 + array(0x99, 0x33, 0x00, 0x00), // 60 + array(0x99, 0x33, 0x66, 0x00), // 61 + array(0x33, 0x33, 0x99, 0x00), // 62 + array(0x33, 0x33, 0x33, 0x00), // 63 + ); + } + + /** + * Assemble worksheets into a workbook and send the BIFF data to an OLE + * storage. + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeWorkbook() + { + // Ensure that at least one worksheet has been selected. + if ($this->_activesheet == 0) { + $this->_worksheets[0]->selected = 1; + } + + // Calculate the number of selected worksheet tabs and call the finalization + // methods for each worksheet + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + if ($this->_worksheets[$i]->selected) { + $this->_selected++; + } + $this->_worksheets[$i]->close($this->_sheetnames); + } + + // Add Workbook globals + $this->_storeBof(0x0005); + $this->_storeCodepage(); + if ($this->_BIFF_version == 0x0600) { + $this->_storeWindow1(); + } + if ($this->_BIFF_version == 0x0500) { + $this->_storeExterns(); // For print area and repeat rows + } + $this->_storeNames(); // For print area and repeat rows + if ($this->_BIFF_version == 0x0500) { + $this->_storeWindow1(); + } + $this->_storeDatemode(); + $this->_storeAllFonts(); + $this->_storeAllNumFormats(); + $this->_storeAllXfs(); + $this->_storeAllStyles(); + $this->_storePalette(); + $this->_calcSheetOffsets(); + + // Add BOUNDSHEET records + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset); + } + + if ($this->_country_code != -1) { + $this->_storeCountry(); + } + + if ($this->_BIFF_version == 0x0600) { + //$this->_storeSupbookInternal(); + /* TODO: store external SUPBOOK records and XCT and CRN records + in case of external references for BIFF8 */ + //$this->_storeExternsheetBiff8(); + $this->_storeSharedStringsTable(); + } + + // End Workbook globals + $this->_storeEof(); + + // Store the workbook in an OLE container + $res = $this->_storeOLEFile(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + return true; + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Store the workbook in an OLE container + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeOLEFile() + { + $OLE = new OLE_PPS_File(OLE::Asc2Ucs('Book')); + if ($this->_tmp_dir != '') { + $OLE->setTempDir($this->_tmp_dir); + } + $res = $OLE->init(); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + $OLE->append($this->_data); + + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + while ($tmp = $this->_worksheets[$i]->getData()) { + $OLE->append($tmp); + } + } + + $root = new OLE_PPS_Root(time(), time(), array($OLE)); + if ($this->_tmp_dir != '') { + $root->setTempDir($this->_tmp_dir); + } + + $res = $root->save($this->_filename); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + return true; + } + + /** + * Calculate offsets for Worksheet BOF records. + * + * @access private + */ + function _calcSheetOffsets() + { + if ($this->_BIFF_version == 0x0600) { + $boundsheet_length = 12; // fixed length for a BOUNDSHEET record + } else { + $boundsheet_length = 11; + } + $EOF = 4; + $offset = $this->_datasize; + + if ($this->_BIFF_version == 0x0600) { + // add the length of the SST + /* TODO: check this works for a lot of strings (> 8224 bytes) */ + $offset += $this->_calculateSharedStringsSizes(); + if ($this->_country_code != -1) { + $offset += 8; // adding COUNTRY record + } + // add the lenght of SUPBOOK, EXTERNSHEET and NAME records + //$offset += 8; // FIXME: calculate real value when storing the records + } + $total_worksheets = count($this->_worksheets); + // add the length of the BOUNDSHEET records + for ($i = 0; $i < $total_worksheets; $i++) { + $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name); + } + $offset += $EOF; + + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->offset = $offset; + $offset += $this->_worksheets[$i]->_datasize; + } + $this->_biffsize = $offset; + } + + /** + * Store the Excel FONT records. + * + * @access private + */ + function _storeAllFonts() + { + // tmp_format is added by the constructor. We use this to write the default XF's + $format = $this->_tmp_format; + $font = $format->getFont(); + + // Note: Fonts are 0-indexed. According to the SDK there is no index 4, + // so the following fonts are 0, 1, 2, 3, 5 + // + for ($i = 1; $i <= 5; $i++){ + $this->_append($font); + } + + // Iterate through the XF objects and write a FONT record if it isn't the + // same as the default FONT and if it hasn't already been used. + // + $fonts = array(); + $index = 6; // The first user defined FONT + + $key = $format->getFontKey(); // The default font from _tmp_format + $fonts[$key] = 0; // Index of the default font + + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $key = $this->_formats[$i]->getFontKey(); + if (isset($fonts[$key])) { + // FONT has already been used + $this->_formats[$i]->font_index = $fonts[$key]; + } else { + // Add a new FONT record + $fonts[$key] = $index; + $this->_formats[$i]->font_index = $index; + $index++; + $font = $this->_formats[$i]->getFont(); + $this->_append($font); + } + } + } + + /** + * Store user defined numerical formats i.e. FORMAT records + * + * @access private + */ + function _storeAllNumFormats() + { + // Leaning num_format syndrome + $hash_num_formats = array(); + $num_formats = array(); + $index = 164; + + // Iterate through the XF objects and write a FORMAT record if it isn't a + // built-in format type and if the FORMAT string hasn't already been used. + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $num_format = $this->_formats[$i]->_num_format; + + // Check if $num_format is an index to a built-in format. + // Also check for a string of zeros, which is a valid format string + // but would evaluate to zero. + // + if (!preg_match("/^0+\d/", $num_format)) { + if (preg_match("/^\d+$/", $num_format)) { // built-in format + continue; + } + } + + if (isset($hash_num_formats[$num_format])) { + // FORMAT has already been used + $this->_formats[$i]->_num_format = $hash_num_formats[$num_format]; + } else{ + // Add a new FORMAT + $hash_num_formats[$num_format] = $index; + $this->_formats[$i]->_num_format = $index; + array_push($num_formats,$num_format); + $index++; + } + } + + // Write the new FORMAT records starting from 0xA4 + $index = 164; + foreach ($num_formats as $num_format) { + $this->_storeNumFormat($num_format,$index); + $index++; + } + } + + /** + * Write all XF records. + * + * @access private + */ + function _storeAllXfs() + { + // _tmp_format is added by the constructor. We use this to write the default XF's + // The default font index is 0 + // + $format = $this->_tmp_format; + for ($i = 0; $i <= 14; $i++) { + $xf = $format->getXf('style'); // Style XF + $this->_append($xf); + } + + $xf = $format->getXf('cell'); // Cell XF + $this->_append($xf); + + // User defined XFs + $total_formats = count($this->_formats); + for ($i = 0; $i < $total_formats; $i++) { + $xf = $this->_formats[$i]->getXf('cell'); + $this->_append($xf); + } + } + + /** + * Write all STYLE records. + * + * @access private + */ + function _storeAllStyles() + { + $this->_storeStyle(); + } + + /** + * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for + * the NAME records. + * + * @access private + */ + function _storeExterns() + { + // Create EXTERNCOUNT with number of worksheets + $this->_storeExterncount(count($this->_worksheets)); + + // Create EXTERNSHEET for each worksheet + foreach ($this->_sheetnames as $sheetname) { + $this->_storeExternsheet($sheetname); + } + } + + /** + * Write the NAME record to define the print area and the repeat rows and cols. + * + * @access private + */ + function _storeNames() + { + // Create the print area NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + // Write a Name record if the print area has been defined + if (isset($this->_worksheets[$i]->print_rowmin)) { + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x06, // NAME type + $this->_worksheets[$i]->print_rowmin, + $this->_worksheets[$i]->print_rowmax, + $this->_worksheets[$i]->print_colmin, + $this->_worksheets[$i]->print_colmax + ); + } + } + + // Create the print title NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + $rowmin = $this->_worksheets[$i]->title_rowmin; + $rowmax = $this->_worksheets[$i]->title_rowmax; + $colmin = $this->_worksheets[$i]->title_colmin; + $colmax = $this->_worksheets[$i]->title_colmax; + + // Determine if row + col, row, col or nothing has been defined + // and write the appropriate record + // + if (isset($rowmin) && isset($colmin)) { + // Row and column titles have been defined. + // Row title has been defined. + $this->_storeNameLong( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + } elseif (isset($rowmin)) { + // Row title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + 0x00, + 0xff + ); + } elseif (isset($colmin)) { + // Column title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + 0x0000, + 0x3fff, + $colmin, + $colmax + ); + } else { + // Print title hasn't been defined. + } + } + } + + + + + /****************************************************************************** + * + * BIFF RECORDS + * + */ + + /** + * Stores the CODEPAGE biff record. + * + * @access private + */ + function _storeCodepage() + { + $record = 0x0042; // Record identifier + $length = 0x0002; // Number of bytes to follow + $cv = $this->_codepage; // The code page + + $header = pack('vv', $record, $length); + $data = pack('v', $cv); + + $this->_append($header . $data); + } + + /** + * Write Excel BIFF WINDOW1 record. + * + * @access private + */ + function _storeWindow1() + { + $record = 0x003D; // Record identifier + $length = 0x0012; // Number of bytes to follow + + $xWn = 0x0000; // Horizontal position of window + $yWn = 0x0000; // Vertical position of window + $dxWn = 0x25BC; // Width of window + $dyWn = 0x1572; // Height of window + + $grbit = 0x0038; // Option flags + $ctabsel = $this->_selected; // Number of workbook tabs selected + $wTabRatio = 0x0258; // Tab to scrollbar ratio + + $itabFirst = $this->_firstsheet; // 1st displayed worksheet + $itabCur = $this->_activesheet; // Active worksheet + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, + $grbit, + $itabCur, $itabFirst, + $ctabsel, $wTabRatio); + $this->_append($header . $data); + } + + /** + * Writes Excel BIFF BOUNDSHEET record. + * FIXME: inconsistent with BIFF documentation + * + * @param string $sheetname Worksheet name + * @param integer $offset Location of worksheet BOF + * @access private + */ + function _storeBoundsheet($sheetname,$offset) + { + $record = 0x0085; // Record identifier + if ($this->_BIFF_version == 0x0600) { + $length = 0x08 + strlen($sheetname); // Number of bytes to follow + } else { + $length = 0x07 + strlen($sheetname); // Number of bytes to follow + } + + $grbit = 0x0000; // Visibility and sheet type + $cch = strlen($sheetname); // Length of sheet name + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("Vvv", $offset, $grbit, $cch); + } else { + $data = pack("VvC", $offset, $grbit, $cch); + } + $this->_append($header.$data.$sheetname); + } + + /** + * Write Internal SUPBOOK record + * + * @access private + */ + function _storeSupbookInternal() + { + $record = 0x01AE; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", count($this->_worksheets), 0x0104); + $this->_append($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheetBiff8() + { + $total_references = count($this->_parser->_references); + $record = 0x0017; // Record identifier + $length = 2 + 6 * $total_references; // Number of bytes to follow + + $supbook_index = 0; // FIXME: only using internal SUPBOOK record + $header = pack("vv", $record, $length); + $data = pack('v', $total_references); + for ($i = 0; $i < $total_references; $i++) { + $data .= $this->_parser->_references[$i]; + } + $this->_append($header . $data); + } + + /** + * Write Excel BIFF STYLE records. + * + * @access private + */ + function _storeStyle() + { + $record = 0x0293; // Record identifier + $length = 0x0004; // Bytes to follow + + $ixfe = 0x8000; // Index to style XF + $BuiltIn = 0x00; // Built-in style + $iLevel = 0xff; // Outline style level + + $header = pack("vv", $record, $length); + $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); + $this->_append($header . $data); + } + + + /** + * Writes Excel FORMAT record for non "built-in" numerical formats. + * + * @param string $format Custom format string + * @param integer $ifmt Format index code + * @access private + */ + function _storeNumFormat($format, $ifmt) + { + $record = 0x041E; // Record identifier + + if ($this->_BIFF_version == 0x0600) { + $length = 5 + strlen($format); // Number of bytes to follow + $encoding = 0x0; + } elseif ($this->_BIFF_version == 0x0500) { + $length = 3 + strlen($format); // Number of bytes to follow + } + + $cch = strlen($format); // Length of format string + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vvC", $ifmt, $cch, $encoding); + } elseif ($this->_BIFF_version == 0x0500) { + $data = pack("vC", $ifmt, $cch); + } + $this->_append($header . $data . $format); + } + + /** + * Write DATEMODE record to indicate the date system in use (1904 or 1900). + * + * @access private + */ + function _storeDatemode() + { + $record = 0x0022; // Record identifier + $length = 0x0002; // Bytes to follow + + $f1904 = $this->_1904; // Flag for 1904 date system + + $header = pack("vv", $record, $length); + $data = pack("v", $f1904); + $this->_append($header . $data); + } + + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in the workbook. + * + * Excel only stores references to external sheets that are used in NAME. + * The workbook NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param integer $cxals Number of external references + * @access private + */ + function _storeExterncount($cxals) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + $this->_append($header . $data); + } + + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + $length = 0x02 + strlen($sheetname); // Number of bytes to follow + + $cch = strlen($sheetname); // Length of sheet name + $rgch = 0x03; // Filename encoding + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_append($header . $data . $sheetname); + } + + + /** + * Store the NAME record in the short format that is used for storing the print + * area, repeat rows only and repeat columns only. + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x0024; // Number of bytes to follow + + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x0015; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8005; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + $this->_append($header . $data); + } + + + /** + * Store the NAME record in the long format that is used for storing the repeat + * rows and columns when both are specified. This shares a lot of code with + * _storeNameShort() but we use a separate method to keep the code clean. + * Code abstraction for reuse can be carried too far, and I should know. ;-) + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x003d; // Number of bytes to follow + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x002e; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown01 = 0x29; + $unknown02 = 0x002b; + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8008; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown01); + $data .= pack("v", $unknown02); + // Column definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", 0x0000); + $data .= pack("v", 0x3fff); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + // Row definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", 0x00); + $data .= pack("C", 0xff); + // End of data + $data .= pack("C", 0x10); + $this->_append($header . $data); + } + + /** + * Stores the COUNTRY record for localization + * + * @access private + */ + function _storeCountry() + { + $record = 0x008C; // Record identifier + $length = 4; // Number of bytes to follow + + $header = pack('vv', $record, $length); + /* using the same country code always for simplicity */ + $data = pack('vv', $this->_country_code, $this->_country_code); + $this->_append($header . $data); + } + + /** + * Stores the PALETTE biff record. + * + * @access private + */ + function _storePalette() + { + $aref = $this->_palette; + + $record = 0x0092; // Record identifier + $length = 2 + 4 * count($aref); // Number of bytes to follow + $ccv = count($aref); // Number of RGB values to follow + $data = ''; // The RGB data + + // Pack the RGB data + foreach ($aref as $color) { + foreach ($color as $byte) { + $data .= pack("C",$byte); + } + } + + $header = pack("vvv", $record, $length, $ccv); + $this->_append($header . $data); + } + + /** + * Calculate + * Handling of the SST continue blocks is complicated by the need to include an + * additional continuation byte depending on whether the string is split between + * blocks or whether it starts at the beginning of the block. (There are also + * additional complications that will arise later when/if Rich Strings are + * supported). + * + * @access private + */ + function _calculateSharedStringsSizes() + { + /* Iterate through the strings to calculate the CONTINUE block sizes. + For simplicity we use the same size for the SST and CONTINUE records: + 8228 : Maximum Excel97 block size + -4 : Length of block header + -8 : Length of additional SST header information + -8 : Arbitrary number to keep within _add_continue() limit + = 8208 + */ + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $this->_block_sizes = array(); + $continue = 0; + + foreach (array_keys($this->_str_table) as $string) { + $string_length = strlen($string); + $headerinfo = unpack("vlength/Cencoding", $string); + $encoding = $headerinfo["encoding"]; + $split_string = 0; + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + $block_length += $string_length; + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $written += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + /* TODO: Unicode data should only be split on char (2 byte) + boundaries. Therefore, in some cases we need to reduce the + amount of available + */ + $align = 0; + + // Only applies to Unicode strings + if ($encoding == 1) { + // Min string + header size -1 + $header_length = 4; + + if ($space_remaining > $header_length) { + // String contains 3 byte header => split on odd boundary + if (!$split_string && $space_remaining % 2 != 1) { + $space_remaining--; + $align = 1; + } + // Split section without header => split on even boundary + else if ($split_string && $space_remaining % 2 == 1) { + $space_remaining--; + $align = 1; + } + + $split_string = 1; + } + } + + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $written += $space_remaining; + + // Reduce the current block length by the amount written + $block_length -= $continue_limit - $continue - $align; + + // Store the max size for this block + $this->_block_sizes[] = $continue_limit - $align; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + if ($block_length > 0) { + $continue = 1; + } else { + $continue = 0; + } + } else { + // Store the max size for this block + $this->_block_sizes[] = $written + $continue; + + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + if ($block_length < $continue_limit) { + $written = $block_length; + } else { + $written = 0; + } + } + } + + // Store the max size for the last block unless it is empty + if ($written + $continue) { + $this->_block_sizes[] = $written + $continue; + } + + + /* Calculate the total length of the SST and associated CONTINUEs (if any). + The SST record will have a length even if it contains no strings. + This length is required to set the offsets in the BOUNDSHEET records since + they must be written before the SST records + */ + + $tmp_block_sizes = array(); + $tmp_block_sizes = $this->_block_sizes; + + $length = 12; + if (!empty($tmp_block_sizes)) { + $length += array_shift($tmp_block_sizes); // SST information + } + while (!empty($tmp_block_sizes)) { + $length += 4 + array_shift($tmp_block_sizes); // add CONTINUE headers + } + + return $length; + } + + /** + * Write all of the workbooks strings into an indexed array. + * See the comments in _calculate_shared_string_sizes() for more information. + * + * The Excel documentation says that the SST record should be followed by an + * EXTSST record. The EXTSST record is a hash table that is used to optimise + * access to SST. However, despite the documentation it doesn't seem to be + * required so we will ignore it. + * + * @access private + */ + function _storeSharedStringsTable() + { + $record = 0x00fc; // Record identifier + $length = 0x0008; // Number of bytes to follow + $total = 0x0000; + + // Iterate through the strings to calculate the CONTINUE block sizes + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $continue = 0; + + // sizes are upside down + $tmp_block_sizes = $this->_block_sizes; +// $tmp_block_sizes = array_reverse($this->_block_sizes); + + // The SST record is required even if it contains no strings. Thus we will + // always have a length + // + if (!empty($tmp_block_sizes)) { + $length = 8 + array_shift($tmp_block_sizes); + } else { + // No strings + $length = 8; + } + + + + // Write the SST block header information + $header = pack("vv", $record, $length); + $data = pack("VV", $this->_str_total, $this->_str_unique); + $this->_append($header . $data); + + + + + /* TODO: not good for performance */ + foreach (array_keys($this->_str_table) as $string) { + + $string_length = strlen($string); + $headerinfo = unpack("vlength/Cencoding", $string); + $encoding = $headerinfo["encoding"]; + $split_string = 0; + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + // + $block_length += $string_length; + + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $this->_append($string); + $written += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + // + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + // + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + // Unicode data should only be split on char (2 byte) boundaries. + // Therefore, in some cases we need to reduce the amount of available + // space by 1 byte to ensure the correct alignment. + $align = 0; + + // Only applies to Unicode strings + if ($encoding == 1) { + // Min string + header size -1 + $header_length = 4; + + if ($space_remaining > $header_length) { + // String contains 3 byte header => split on odd boundary + if (!$split_string && $space_remaining % 2 != 1) { + $space_remaining--; + $align = 1; + } + // Split section without header => split on even boundary + else if ($split_string && $space_remaining % 2 == 1) { + $space_remaining--; + $align = 1; + } + + $split_string = 1; + } + } + + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $tmp = substr($string, 0, $space_remaining); + $this->_append($tmp); + + // The remainder will be written in the next block(s) + $string = substr($string, $space_remaining); + + // Reduce the current block length by the amount written + $block_length -= $continue_limit - $continue - $align; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + // + if ($block_length > 0) { + $continue = 1; + } else { + $continue = 0; + } + } else { + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + } + + // Write the CONTINUE block header + if (!empty($this->_block_sizes)) { + $record = 0x003C; + $length = array_shift($tmp_block_sizes); + $header = pack('vv', $record, $length); + if ($continue) { + $header .= pack('C', $encoding); + } + $this->_append($header); + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + // + if ($block_length < $continue_limit) { + $this->_append($string); + $written = $block_length; + } else { + $written = 0; + } + } + } + } +} +?> diff --git a/include/basis_db.class.php b/include/basis_db.class.php index 3c1d69303..08296787b 100644 --- a/include/basis_db.class.php +++ b/include/basis_db.class.php @@ -15,10 +15,10 @@ abstract class db extends basis abstract function db_connect(); abstract function db_query($sql); abstract function db_fetch_object($result=null, $i=null); + abstract function db_fetch_array($result=null); abstract function db_num_rows($result=null); - abstract function db_last_error(); abstract function db_affected_rows($result=null); - + abstract function db_last_error(); } require_once(DB_SYSTEM.'.class.php'); diff --git a/include/pgsql.class.php b/include/pgsql.class.php index e6c9e7def..e78144905 100644 --- a/include/pgsql.class.php +++ b/include/pgsql.class.php @@ -68,5 +68,13 @@ class basis_db extends db else return pg_affected_rows($result); } + + function db_fetch_array($result=null) + { + if(is_null($result)) + return pg_fetch_array($this->db_result); + else + return pg_fetch_array($result); + } } ?> \ No newline at end of file
'.$stsem.'12345678Gesamt
".$stg_arr[$row->studiengang_kz]."
 ".strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)".mb_strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)$row->gesamt_stg / ".sprintf('%0.2f', $prozent)." %$row->inc / $row->out
 ".strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)".mb_strtoupper($row->typ.$row->kurzbz)." ($row->kurzbzlang)$row->gesamt_stg / ".sprintf('%0.2f', $prozent)." %$row->inc / $row->out