【问题标题】:PHPExcel right align imagePHPExcel右对齐图像
【发布时间】:2014-10-28 21:00:25
【问题描述】:

我正在尝试使用 PHPExcel 对齐图像,但我不能,因为图像覆盖在工作表上方。

// Create new picture object
  $objDrawing = new PHPExcel_Worksheet_Drawing();
  $objDrawing->setPath('my_img.jpg');

// Insert picture
  $objDrawing->setCoordinates('A1');
  $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

// Style cell
  $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

A1 的文字对齐变为右对齐,但它的图像仍然在左侧对齐。

【问题讨论】:

  • 因为图像覆盖在工作表上而不是单元格的内容上,您需要使用图像setOffsetX()setOffsetY() 计算该图像相对于单元格宽度的位置方法 .... 设置单元格的对齐方式仅与单元格的内容有关,没有什么魔法可以为您做到这一点。
  • @Mark Ba​​ker:嗯,有一点魔法可以解决由于 Excel 使用字符单位来测量单元格宽度、点(几分之一英寸)来测量单元格高度这一事实引起的混淆和像素来处理图片。这让我非常困惑,特别是因为我不知道一英寸是什么:-)。请参阅下面的解决方案。

标签: php image alignment phpexcel


【解决方案1】:

您可以按照此代码将图像向中心移动,其中两行(X,Y)相对于角度点的特殊代码

改变X的位置 $objDrawing->setOffsetX(100);

改变Y的位置 $objDrawing->setOffsetY(20);

$gdImage = imagecreatefromjpeg('image/issam.jpeg');      // path for the picture 
$objDrawing = new PHPExcel_Worksheet_MemoryDrawing();
$objDrawing->setName('Logo Absiskey');                   // the name
$objDrawing->setDescription('Logo Absiskey');            // decription 
$objDrawing->setImageResource($gdImage);
$objDrawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG);
$objDrawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT);
$objDrawing->setHeight(60);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
$objDrawing->setCoordinates('B10');
$objDrawing->setOffsetX(100);                            // set x position 
$objDrawing->setOffsetY(20);                             // set Y position

【讨论】:

    【解决方案2】:

    遇到了同样的挑战:如何将图片与单元格右对齐。我正在使用 PHP 电子表格,它成功于 PHP Excel。这有效:

    use PhpOffice\PhpSpreadsheet\Worksheet;
    use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
    
    $ws = $spreadsheet->getActiveSheet(); 
    $logoPath = __DIR__ . '/reporting/templates/SmallLogo.jpg';
    $drawing = new Drawing();
    $drawing->setPath($logoPath);
    $drawing->setCoordinates('K2');
    $drawing->setHeight(45); //pixels
    $colWidth = $ws->getColumnDimension('K')->getWidth();
    if ($colWidth == -1) { //not defined which means we have the standard width
        $colWidthPixels = 64; //pixels, this is the standard width of an Excel cell in pixels = 9.140625 char units outer size
    } else {                  //innner width is 8.43 char units
        $colWidthPixels = $colWidth * 7.0017094; //colwidht in Char Units * Pixels per CharUnit
    }
    $offsetX = $colWidthPixels - $drawing->getWidth(); //pixels
    $drawing->setOffsetX($offsetX); //pixels
    $drawing->setWorksheet($ws);
    

    它应该以与 PHPExcel 相同的方式工作。诀窍是将列宽转换为 Excel 像素,并使用 offsetX 从左侧水平列边框获取正确的偏移量。如果图片比列宽,偏移量将为负数。

    【讨论】:

    • 可能值得注意的是,PHPExcel/PHPSpreadsheet 在 PHPExcel_Shared_Drawing(PHPSpreadsheet 中的 PhpOffice\PhpSpreadsheet\Shared\Drawing)类中确实有一组用于单位转换(像素/EMU/点/单元尺寸)的函数
    【解决方案3】:

    手动设置行高

    $objPHPExcel->getActiveSheet()->getRowDimension($index)->setRowHeight(100);
    

    $index 是行号。

    【讨论】:

      【解决方案4】:

      这是一个想法:

      您需要确定最大宽度/高度(通过实验)。保存值。

      // Logo
      $maxWidth = 700;
      $maxHeight = 40;
      

      剩下的代码如下:

      $objDrawing = new PHPExcel_Worksheet_Drawing();
      $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
      $objDrawing->setName("Logo");
      $objDrawing->setDescription("Company Logo");
      $objDrawing->setPath('logo.png');
      $objDrawing->setCoordinates('A1');
      $objDrawing->setHeight($maxHeight);
      // This is the "magic" formula
      $offsetX =$maxWidth - $objDrawing->getWidth();
      $objDrawing->setOffsetX($offsetX);
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-24
        • 2022-07-15
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2011-07-10
        • 2012-12-30
        相关资源
        最近更新 更多