Faktor soll umso kleiner werden, desto größer ein anderer Wert ist, aber nicht linear (Excel-Spaltenbreite bestimmen)

  • PHP

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    @Acr0most
    Auf die Idee mit den 2 Schritten bin ich natürlich auch gekommen. Leider ist es meines Wissens nach mit sämtlichen verfügbaren Excel-Libaries für PHP unmöglich, eine Datei zu bearbeiten. Es geht nur Lesen oder Schreiben.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Mit dem Coding-Anteil kenne ich mich überhaupt nicht aus, aber möglicherweise mit der Mathematik.
    Hast du mal ein paar Beispielstrings, die du in deiner Excel-Datei so drin hast?

    Ich schätze, dass jedes Zeichen seine eigene Breite hat, dementsprechend kann selbst die beste Formel noch statistische Abweichungen haben.
    Eine solche beste Formel müsste die Häufigkeitsverteilung der einzelnen Chars mit einbeziehen. Bestimmte Zeichen scheinen ja mit wachsender Stringlänge häufiger oder weniger häufig aufzutauchen.
    Ansonsten müsste das linear anwachsen

    Wenn ich das so richtig verstanden habe, wäre auch ein anderer Ansatz einen anderen Font für die Strings zu verwenden. Es gibt Schriftarten da haben die Zeichen alle die gleiche Breite.
    z.B.: Courier New. Da ist dann i i i i i genauso lang wie o o o o o . Sieht dann natürlich auch nicht unbedingt schick aus.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Ich habe derzeit noch zwei Ansätze, die ich gerne versuchen würde (beide sind nicht mathematisch). Hatte aber leider noch keine Zeit dazu, daher hier noch keine Rückmeldung. Sobald ich das getestet habe, melde ich mich mit den Ergebnissen.

    Eine nichtproportionale Schriftart (Monospace) kommt übrigens hier nicht in Frage.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Um das hier nun mal endlich abzuschließen, das hier ist meine finale Änderung (falls es jemanden interessiert ;) ) :

    1.) Ich ermittle nun die echte Breite jedes Strings (Zellenwert). Vorher hatte ich zunächst den von der Zeichenanzahl her längsten String ermittelt und nur davon die echte Breite.

    2.) Ich berücksichtige nun auch den Schriftgrad "fett" und habe nochmal an meiner Formel geschraubt. Folgender Code kommt ganz gut an die automatische Spaltenbreitenbestimmung von Excel dran (gut genug auf jeden Fall!):

    PHP-Quellcode

    1. function getStringWidth(string $s, int $fontSize, bool $bold): float {
    2. // Die echte Breite eines Strings in Excel-Breiteneinheit zurückgeben, Schriftart: Calibri/Calibri-Bold, $fontSize pt
    3. // Quelle: FPDF (http://www.fpdf.org/), fpdf.php
    4. // Lizenz: "FPDF is released under a permissive license: there is no usage restriction. You may embed it freely in your application (commercial or not), with or without modifications."
    5. // Variable "$cw" wurde wie folgt generiert (gemäß Anleitung unter http://www.fpdf.org/en/tutorial/tuto7.htm): MakeFont('C:\\Windows\\Fonts\\calibri(b).ttf','cp1252');
    6. if ($bold) {
    7. $cw = array(/* zu lang, entfernt */);
    8. }
    9. else {
    10. $cw = array(/* zu lang, entfernt */);
    11. }
    12. $w = 0;
    13. $l = mb_strlen($s);
    14. for ($i=0; $i < $l; $i++) $w += $cw[$s[$i]];
    15. return (($w * $fontSize / 1000) * 0.2) + (($cw['n'] * $fontSize / 1000) * 0.2); // Erst sind es Pixel, dann mal 0,2, um sich der korrekten Excel-Breiteneinheit anzunähern, dann plus Padding
    16. }

    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum