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/*"); ?>
Ihr Datenexport ist fertig vorbereitet.