【问题标题】:PHPExcel - dynamic row height for merged cellsPHPExcel - 合并单元格的动态行高
【发布时间】:2012-11-09 17:32:28
【问题描述】:

经过大量试验和错误,我似乎仍然无法找到一种解决方法来让合并的单元格具有 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 行高。

有人有什么想法吗?我真的不介意对列宽进行硬编码,我只希望高度能够响应文本。

提前致谢。

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    自动高度不适用于合并的单元格。我认为这是 Excel 而不是 PHPExcel 的问题。如果你想这样做,你必须使用解决方法。这是我的……

    我有一个函数,它接收文本,在换行符 ('\n') 上分割成行,并根据每行的字符数(小提琴因子)计算“适合”文本所需的行数。

    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 只是为了在这个单元格和下一个单元格之间稍微分开。

    【讨论】:

    • 非常好的解决方案。谢谢:)
    【解决方案2】:

    我认为,我找到了更好的解决方案。 当我将数据插入到 foreach 中的合并列时,我通过与 strlen() 进行比较来选择行中最长的字符串。之后将最长的字符串插入最后+1列并将其设置为隐藏列。 第 1 行有 4 列 (A-D) 的示例

    $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);
    

    【讨论】:

      【解决方案3】:

      为任何行设置自动高度:

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

      即将参数设置为 -1 而不是任何数字。

      【讨论】:

      • 谢谢,但我正在寻找一种可行的解决方法,让合并的单元格显示为 AutoFit 高度。不幸的是,这种方法不适用于合并的单元格。
      猜你喜欢
      • 2015-10-02
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多