Files
t2000-steckerpruefer/pagecontent/export.php
2026-01-02 20:52:43 +01:00

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>