221 lines
6.9 KiB
PHP
Executable File
221 lines
6.9 KiB
PHP
Executable File
<?php
|
|
|
|
session_start();
|
|
|
|
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);
|
|
|
|
|
|
|
|
|
|
$_SESSION["meta"]=$meta;
|
|
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', 1);
|
|
|
|
|
|
|
|
$db = new SQLite3('../db-test/test.db');
|
|
|
|
|
|
// weil die Bestandssuche (im Gegensatz zur Ortssuche) die Programmbezeichnung durhcsucht, ist hier etwas mehr Aufwand erforderlich
|
|
// hole die Programmbezeichnung via 2x JOIN aus der Datenbank
|
|
$result = $db->query("
|
|
|
|
SELECT
|
|
m.id AS measurement_id,
|
|
m.comment AS comment,
|
|
m.timestamp AS timestamp,
|
|
m.place_name AS place_name,
|
|
b.value AS bit_value,
|
|
b.position AS bit_position,
|
|
n.node_from AS node_from,
|
|
n.node_to AS node_to
|
|
FROM
|
|
measurements m
|
|
JOIN places p ON p.name = m.place_name
|
|
JOIN measurement_program_id_bits b ON b.measurement_id = m.id
|
|
JOIN measurement_nodes n ON n.required_by = m.id
|
|
|
|
");
|
|
|
|
/*
|
|
Ausgabe sieht z.B. so aus:
|
|
|
|
| measurement_id | comment | timestamp | place_name | bit_value | bit_position | node_from | node_to |
|
|
| -------------- | ------- | --------- | ------------ | --------- | ------------ | --------- | ------- |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | S | 0 | 20 | 28 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | S | 0 | 28 | 30 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 1 | 20 | 28 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 1 | 28 | 30 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | 4 | 2 | 20 | 28 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | 4 | 2 | 28 | 30 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 3 | 20 | 28 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 3 | 28 | 30 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 4 | 20 | 28 |
|
|
| 1 | xyz.. | 34535454 | Dudweiler Df | - | 4 | 28 | 30 |
|
|
|
|
*/
|
|
|
|
|
|
// Die Datenbank wird als dreifach indexiertes Array gespeichert
|
|
$database_db = [];
|
|
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
|
|
$id = $row["measurement_id"];
|
|
|
|
// Basisdaten setzen (überschreiben macht nichts)
|
|
$database_db[$id]["comment"] = $row["comment"];
|
|
$database_db[$id]["timestamp"] = $row["timestamp"];
|
|
$database_db[$id]["place_name"] = $row["place_name"];
|
|
|
|
// Programmbits: nur setzen, wenn nicht schon vorhanden
|
|
if (!isset($database_db[$id]["program_id_bits"][$row["bit_position"]])) {
|
|
$database_db[$id]["program_id_bits"][$row["bit_position"]] = $row["bit_value"];
|
|
}
|
|
|
|
// Nodes: nur hinzufügen, wenn noch nicht vorhanden
|
|
$node_pair = [$row["node_from"], $row["node_to"]];
|
|
if (
|
|
!isset($database_db[$id]["nodes"]) ||
|
|
!in_array($node_pair, $database_db[$id]["nodes"])
|
|
) {
|
|
$database_db[$id]["nodes"][] = $node_pair;
|
|
}
|
|
}
|
|
|
|
|
|
// Ersetzen der $database_db[$id]["nodes"] zu einem String
|
|
$bitLength = 5;
|
|
$placeholder = '?';
|
|
foreach ($database_db as $index => $row) {
|
|
$programIdBits = isset($row['program_id_bits']) ? $row['program_id_bits'] : [];
|
|
$programIdString = '';
|
|
|
|
// Baue ein Array mit fester Länge ($bitLength), fülle fehlende Positionen mit Platzhalter
|
|
for ($i = 0; $i < $bitLength; $i++) {
|
|
$programIdString .= isset($programIdBits[$i]) ? $programIdBits[$i] : $placeholder;
|
|
}
|
|
|
|
$database_db[$index]['program_id_string'] = $programIdString;
|
|
}
|
|
|
|
|
|
|
|
|
|
// $list ist die CSV-Datei
|
|
|
|
//$list[] = array("Gemessen am / um", "Stw-Name / Ort" ,"Erkannte Brücken (Pin-zu-Pin)", "(automatisch) ermittelte Programm-Nummer", "Freitext-Besonderheiten");
|
|
|
|
|
|
|
|
// gehe jeden Datenwankeintrag durch
|
|
foreach($database_db as $database_entry) {
|
|
// leere dne node_string zu Beginn
|
|
$node_string = "";
|
|
// erstelle einen Brücken-String, der erweitert wird
|
|
foreach($database_entry["nodes"] as $node) {
|
|
$node_string .= $node[0] . "<->" . $node[1] . ", ";
|
|
}
|
|
|
|
$imagePath = 'http://localhost/stecker.php?data=' . urlencode(json_encode($database_entry["nodes"])); // URL parsen
|
|
|
|
// Schreibe ins Array
|
|
$list[] = array(date('d.m.Y H:i:s',$database_entry["timestamp"]), $database_entry["place_name"] ,$node_string, $database_entry["program_id_string"], $database_entry["comment"], $imagePath);
|
|
}
|
|
|
|
|
|
|
|
function svgUrlToPngViaRsvg(string $svgUrl, string $outputPath): bool {
|
|
$svgData = file_get_contents($svgUrl);
|
|
if ($svgData === false) return false;
|
|
|
|
$tempSvg = '../tmp/stecker_' . uniqid() . '.svg';
|
|
file_put_contents($tempSvg, $svgData);
|
|
|
|
|
|
$cmd = escapeshellcmd("rsvg-convert -o " . escapeshellarg($outputPath) . " " . escapeshellarg($tempSvg));
|
|
$result = shell_exec($cmd);
|
|
|
|
unlink($tempSvg);
|
|
|
|
return file_exists($outputPath);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
require '../vendor/composer/vendor/autoload.php';
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
|
|
|
|
|
|
|
|
// Neue Excel-Datei erzeugen
|
|
$spreadsheet = new Spreadsheet();
|
|
$sheet = $spreadsheet->getActiveSheet();
|
|
|
|
// Spaltenüberschriften
|
|
$sheet->setCellValue('A1', 'Zeitstempel');
|
|
$sheet->setCellValue('B1', 'Ort');
|
|
$sheet->setCellValue('C1', 'Brücken');
|
|
$sheet->setCellValue('D1', 'Programmbezeichnung');
|
|
$sheet->setCellValue('E1', 'Notizen');
|
|
|
|
// Durch das Array iterieren und Daten + Bild einfügen
|
|
$row = 2; // Start in Zeile 2
|
|
foreach ($list as $entry) {
|
|
[$timestamp,$place,$bridges,$program_number, $extra, $imagePath] = $entry;
|
|
|
|
// Namen einfügen
|
|
$sheet->setCellValue("A$row", $timestamp);
|
|
$sheet->setCellValue("B$row", $place);
|
|
$sheet->setCellValue("C$row", $bridges);
|
|
$sheet->setCellValue("D$row", $program_number);
|
|
$sheet->setCellValue("E$row", $extra);
|
|
|
|
|
|
|
|
|
|
|
|
$svgUrl = $imagePath;
|
|
$tmpPng = '../tmp/stecker_' . uniqid() . '.png';
|
|
|
|
// Bild einfügen, wenn Datei existiert
|
|
if (svgUrlToPngViaRsvg($svgUrl, $tmpPng)) {
|
|
$drawing = new Drawing();
|
|
$drawing->setPath($tmpPng);
|
|
$drawing->setCoordinates("F$row");
|
|
$drawing->setHeight(80);
|
|
$sheet->getRowDimension($row)->setRowHeight(80 * 0.75);
|
|
$drawing->setWorksheet($sheet);
|
|
} else {
|
|
$sheet->setCellValue("F$row", 'Bildkonvertierung fehlgeschlagen');
|
|
}
|
|
|
|
$row++;
|
|
}
|
|
|
|
// Spaltenbreite anpassen
|
|
$sheet->getColumnDimension('A')->setAutoSize(true);
|
|
$sheet->getColumnDimension('B')->setWidth(20); // Platz fürs Bild
|
|
|
|
// Datei speichern
|
|
$writer = new Xlsx($spreadsheet);
|
|
$writer->save('../temp.xlsx');
|
|
|
|
shell_exec("rm ../tmp/*");
|
|
|
|
|
|
?>
|
|
|
|
<div class="content-header">Export - Fertig</div>
|
|
<hr />
|
|
<p>
|
|
Ihr Datenexport ist fertig vorbereitet.
|
|
</p>
|
|
<div class="save-button" onclick="window.location.href='../temp.xlsx'"); "><img src="/vendor/icons/play.svg" \>Herunterladen</div>
|
|
|
|
|