Domanda

Ho una griglia di dati che voglio esportare in RTF, PDF, ecc utilizzando vari (e non perfetti) PHP convertitori / generatori.

Quello che mi manca di più è la tabella HTML regolazione automatica della larghezza delle colonne in base alle lunghezze delle stringhe nelle cellule (stringhe contengono interruzioni di riga che complicare le cose un po ', come dovrebbero essere conservati).

Ho bisogno di un algoritmo che, dato il contenuto delle celle (testo), una larghezza totale della tabella e una larghezza media di un carattere, restituirebbe una larghezza per ogni colonna. Non vorrei di reinventare la ruota se qualcosa è già disponibile.

Naturalmente non può essere perfetto se il font è larghezza variabile, ma un'approssimazione farebbe bene. O forse si potrebbe avere una tabella configurabile con larghezze per ogni personaggio.

Qualsiasi suggerimento sarebbe apprezzato.

È stato utile?

Soluzione

Questo non è un compito facile.

In PHPExcel, quando una cellula è impostato su autowidth, si usa la funzione di libreria gd imagettfbbox ()

// font size should really be supplied in pixels in GD2,
// but since GD2 seems to assume 72dpi, pixels and points are the same
$fontFile = self::getTrueTypeFontFileFromFont($font);
$textBox = imagettfbbox($font->getSize(), $rotation, $fontFile, $text);

// Get corners positions
$lowerLeftCornerX  = $textBox[0];
$lowerLeftCornerY  = $textBox[1];
$lowerRightCornerX = $textBox[2];
$lowerRightCornerY = $textBox[3];
$upperRightCornerX = $textBox[4];
$upperRightCornerY = $textBox[5];
$upperLeftCornerX  = $textBox[6];
$upperLeftCornerY  = $textBox[7];

// Consider the rotation when calculating the width
$textWidth = max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX);

return $textWidth;

È però molto intensa, soprattutto quando si lavora con grandi fogli, quindi abbiamo anche un metodo alternativo (approssimazione)

// Calculate column width in pixels. We assume fixed glyph width. Result varies with font name and size.
switch ($fontName) {
    case 'Calibri':
        // value 8.26 was found via interpolation by inspecting real Excel files with Calibri 11 font.
        $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText));
        $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size
        break;

    case 'Arial':
        // value 7 was found via interpolation by inspecting real Excel files with Arial 10 font.
        $columnWidth = (int) (7 * PHPExcel_Shared_String::CountCharacters($columnText));
        $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size
        break;

    case 'Verdana':
        // value 8 was found via interpolation by inspecting real Excel files with Verdana 10 font.
        $columnWidth = (int) (8 * PHPExcel_Shared_String::CountCharacters($columnText));
        $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size
        break;

    default:
        // just assume Calibri
        $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText));
        $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size
        break;
}

// Calculate approximate rotated column width
if ($rotation !== 0) {
    if ($rotation == -165) {
        // stacked text
        $columnWidth = 4; // approximation
    } else {
        // rotated text
        $columnWidth = $columnWidth * cos(deg2rad($rotation))
                        + $fontSize * abs(sin(deg2rad($rotation))) / 5; // approximation
    }
}

// pixel width is an integer
$columnWidth = (int) $columnWidth;
return $columnWidth;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top