5

多くの試行錯誤の末、マージされたセルをAutoFitの高さにするための回避策をまだ理解できないようです。

このサイトで見つけたVBAコードのビットに基づいたアプローチを試しました:https ://groups.google.com/forum/?fromgroups =#!topic / microsoft.public.excel.programming / pcvg7o5sKhA

次のコードは、テキストを貼り付けて折り返し、セルの幅(A1)を必要な結合されたセルの合計幅に変更します。次に、セルを結合し、列Aを元の幅に戻します。$ noteは、テキストの長い文字列です。$ vAlignTopは、テキストの配置をセルの上部に設定する配列です。

$totalWidth = 67.44; //width of columns A-H

$objPHPExcel->getActiveSheet()->setCellValue('A1', $note);
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth($totalWidth);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setWrapText(true);
$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->applyFromArray($vAlignTop);
$objPHPExcel->getActiveSheet()->mergeCells('A1:H1');
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8.43); //original width of column A

これらの同じ手順をExcelで手動で実行すると、希望する結果が得られますが、上記のコードの出力は常にデフォルトの12.75行の高さです。

誰かアイデアはありますか?列の幅をハードコーディングする必要はありません。テキストに応じて高さを調整したいだけです。

前もって感謝します。

4

3 に答える 3

8

自動高さは、結合されたセルでは機能しません。これは、PHPExcelではなくExcelの問題だと思います。これを実行したい場合は、回避策を使用する必要があります。これは私のものです...

テキストを受け取り、改行('\ n')で行に分割し、1行あたりの文字数(フィドルファクター)に基づいてテキストを'フィット'するために必要な行数を計算する関数があります。

function getRowcount($text, $width=55) {
    $rc = 0;
    $line = explode("\n", $text);
    foreach($line as $source) {
        $rc += intval((strlen($source) / $width) +1);
    }
    return $rc;
}

私のレポートでは、試行錯誤によって到達したフィドルファクターは55です。次に、コードで上記の関数を使用します...

$purpose = $survey["purpose"];
$numrows = getRowcount($purpose);
$objPHPExcel->getActiveSheet()->setCellValue('B'.$xlrow, 'Report Purpose');
$objPHPExcel->getActiveSheet()->getStyle('B'.$xlrow)->applyFromArray($fmt_cover_bold);
$objPHPExcel->getActiveSheet()->setCellValue('C'.$xlrow, $purpose);
$objPHPExcel->getActiveSheet()->getRowDimension($xlrow)->setRowHeight($numrows * 12.75 + 2.25);
$objPHPExcel->getActiveSheet()->mergeCells('C'.$xlrow.':E'.$xlrow);
$objPHPExcel->getActiveSheet()->getStyle('C'.$xlrow.':E'.$xlrow)->applyFromArray($fmt_normal_wrap);
$xlrow++;

このセルと次のセルを少し分離するために、2.25を追加します。

于 2013-06-20T08:18:48.033 に答える
2

私はより良い解決策を見つけたと思います。foreachのマージされた列にデータを挿入するとき、strlen()と比較して、行の最長の文字列を選択します。その後、最長の文字列を最後の+ 1列に挿入し、非表示の列に設定します。4列(AD)の行1の例があります

$longestContent = "the longest content in row 1";
$mergerColumnsWidth = 24;
$objPHPExcel->getActiveSheet()->setCellValue("E1", $longestContent);
$objPHPExcel->getActiveSheet()->getStyle("E1")->getAlignment()->setWrapText(true);
$objPHPExcel->getActiveSheet()->getColumnDimension("E")->setWidth(mergerColumnsWidth );
$objPHPExcel->getActiveSheet()->getColumnDimension("E")->setVisible(false);
于 2016-08-11T07:12:42.943 に答える
0

任意の行の自動高さを設定するには、次のようにします。

$_row_number = 10;

$excel->getActiveSheet()->getRowDimension($_row_number)->setRowHeight(-1);

つまり、パラメータを任意の数ではなく-1に設定します。

于 2012-11-25T09:02:12.207 に答える