title = $title; $this->header = $header; $this->data = $data; } public function setHeader(array $header) { $this->header = $header; } public function addDataRow(array $columns) { $this->data[] = $columns; } public function getHeader(): array { return $this->header; } public function getData(): array { return $this->data; } public function output(string $format) { switch ($format) { case "ods": $this->toODS(); break; case "html": $this->toHTML(); break; case "csv": default: $this->toCSV(); break; } } private function toODS() { $ods = new ods(); $styleColumn = new odsStyleTableColumn(); $styleColumn->setUseOptimalColumnWidth(true); $headerstyle = new odsStyleTableCell(); $headerstyle->setFontWeight("bold"); $table = new odsTable($this->title); for ($i = 0; $i < count($this->header); $i++) { $table->addTableColumn(new odsTableColumn($styleColumn)); } $row = new odsTableRow(); foreach ($this->header as $cell) { $row->addCell(new odsTableCellString($cell, $headerstyle)); } $table->addRow($row); foreach ($this->data as $cols) { $row = new odsTableRow(); foreach ($cols as $cell) { $row->addCell(new odsTableCellString($cell)); } $table->addRow($row); } $ods->addTable($table); // The @ is a workaround to silence the tempnam notice, // which breaks the file. This is apparently the intended behavior: // https://bugs.php.net/bug.php?id=69489 @$ods->downloadOdsFile($this->title . "_" . date("Y-m-d_Hi") . ".ods"); } private function toHTML() { global $SECURE_NONCE; $data = array_merge([$this->header], $this->data); // HTML exporter doesn't like null values for ($i = 0; $i < count($data); $i++) { for ($j = 0; $j < count($data[$i]); $j++) { if (is_null($data[$i][$j])) { $data[$i][$j] = ''; } } } header('Content-type: text/html'); $converter = new HTMLConverter(); $out = "\n" . "\n" . "\n" . "" . $this->title . "_" . date("Y-m-d_Hi") . "\n" . << STYLE . $converter->convert($data); echo $out; } private function toCSV() { $csv = Writer::createFromString(''); $data = array_merge([$this->header], $this->data); $csv->insertAll($data); header('Content-type: text/csv'); header('Content-Disposition: attachment; filename="' . $this->title . "_" . date("Y-m-d_Hi") . ".csv" . '"'); echo $csv; } }