经过大量的反复试验后,我仍然无法找到一种解决办法,让合并的单元格具有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行高。
有人有什么想法吗?我真的不介意对列宽进行硬编码,我只想让高度对文本做出响应。
提前致谢。
答案 0 :(得分:4)
自动高度对合并的单元格不起作用。我认为这是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只是为了让这个细胞与下一个细胞分开。
答案 1 :(得分:0)
要为任何行使用设置自动高度:
$_row_number = 10;
$excel->getActiveSheet()->getRowDimension($_row_number)->setRowHeight(-1);
即。将参数设置为-1而不是任何数字。
答案 2 :(得分:0)
我认为,我找到了更好的解决方案。 当我将数据插入到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);