PHPSpreadsheet,绘图 - 使用单元格移动和调整大小

问题描述 投票:0回答:2

我尝试在 PHPSpreadsheet 中为图像设置“移动和调整单元格大小”设置,但在任何地方都找不到任何信息。现在我的问题是,该功能是否已经实现,如果是,它是如何调用的。

php phpspreadsheet
2个回答
3
投票

也许“帮助你”为时已晚,但这对其他人很有用

我遇到了同样的问题,发现了 2 个“东西”

  1. 没什么
  2. Google 是一堆指向 50 个顶级网络的数百万个链接/子链接。 Google 是 1998 年的老 AOL

但是,我没有放弃,我可以“修复”它。实际上,在PHPSpreadsheet的文件夹中你会看到下一个下一个路径文件夹;

  • /PhpOffice/供应商/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx

有一个文件名为:Drawing.php,在这个文件中你会发现一个函数名为:writeDrawing

在那里你会找到以下代码; [线路:152]

    $objWriter->startElement('xdr:oneCellAnchor');

必须替换为:

    $objWriter->startElement('xdr:twoCellAnchor');

之后,2 o 3行,在这些代码下你会找到这个代码; [线路:166 至 169]

    $objWriter->startElement('xdr:ext');
    $objWriter->writeAttribute('cx', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getWidth()));
    $objWriter->writeAttribute('cy', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getHeight()));
    $objWriter->endElement();

添加“//”或“/*代码*/”等注释标记并对其进行注释以避免这些代码行。现在,添加以下代码;

    $objWriter->startElement('xdr:to');
    $objWriter->writeElement('xdr:col', $aCoordinates[0] - 1);
    $objWriter->writeElement('xdr:colOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getWidth()));
    $objWriter->writeElement('xdr:row', $aCoordinates[1]);
    $objWriter->writeElement('xdr:rowOff', "0");
    $objWriter->endElement();

在下面的代码中,应该修复 [线路:178至182]

    $objWriter->startElement('xdr:cNvPr');

    $objWriter->writeAttribute('id', $pRelationId);
    $objWriter->writeAttribute('name', $pDrawing->getName());
    $objWriter->writeAttribute('descr', $pDrawing->getDescription());
    $objWriter->endElement();

固定代码(不要添加“$objWriter->endElement()”);

    $objWriter->startElement('xdr:cNvPr');

    $objWriter->writeAttribute('name', $pDrawing->getName() . $pRelationId);
    $objWriter->writeAttribute('descr', $pDrawing->getDescription());
    $objWriter->writeAttribute('id', $pRelationId+1);

现在,在[行:183] INSERT这段代码;


    $objWriter->startElement('a:extLst');
    $objWriter->startElement('a:ext');
    $objWriter->writeAttribute('uri', "{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}");
    $objWriter->endElement(); // this close a:ext
    $objWriter->endElement(); // this close a:extLst
    $objWriter->endElement(); // thise xdr:cNvPr [this will replace the $objWriter->endElement(); of Line 182. It was lost in the previous step

现在,这样的代码;


   require "../../PhpOffice/vendor/autoload.php";

   use PhpOffice\PhpSpreadsheet\Spreadsheet;
   use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

   $spreadsheet = new Spreadsheet();

   $sheet = $spreadsheet->getActiveSheet();
...
   $imgfile = base64_decode($img_from_query_sql);
   $fname = "../tmp/".rand(). ".xlsx";

   file_put_contents($fname, $imgfile);
   $drawing = new PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); 

   $Cell = $Letter[$j] . $row;

   $drawing->setPath($fname);

   $drawing->setCoordinates($Cell );

   $drawing->setResizeProportional(false);

   $drawing->setWidth(300);

   $drawing->setHeight(300);

   $drawing->setWorksheet($sheet);

   $sheet->setTitle("TitleOfSheet");

   $writer = new Xlsx($spreadsheet);

   $writer->save("php://output");

...

执行并下载带有图像的 Excel。检查您的图像:右键单击->“大小和属性...” 右侧会出现“图像格式”面板。在子菜单“属性”中应该有一个3“单选选项”(带黑点的圆圈)

  1. 使用单元格移动和调整大小
  2. 移动但不调整单元格大小
  3. 不要随细胞移动或调整大小

Phpspreadsheet 原本使用选项 2-> 来制作图片移动但不使用单元格调整大小但是,我们更改了 Drawing.php 的代码,现在所有图像都是使用选项 1->移动和调整大小来创建的细胞

现在,如果我们有一个包含“事物”列表和每行 1 个图像的 Excel 文件,我们可以应用过滤器,如果某些行没有任何图像,则以下图像行将不会与可见行重叠(匹配结果)。 过滤后的每张图片都将隐藏在父行中,并且与过滤器匹配的每张图片将像往常一样“粘”到其父行

更新:22-07-28 - 电子表格 1.23

vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php 中,第 184 行仍然存在一个名为 writeDrawing 的函数;

自从我使用的上一个版本以来,这个功能已经发生了一些变化。现在,writeDrawing 有很多改进,并且不需要编辑任何代码行; 目前,“BaseDrawing”是一种具有新方法的数据类型; setCooperatives2(两个)而不是setCooperatives(末尾没有“2”)

您可以在 main_custom_file_excel_creator.php 中使用 setCooperatives2 ,例如;

   $Cell = "A2";
   $drawing->setCoordinates2($Cell); //instead of setCoordinates

从第 184 行到第 340 行更新的函数 (writeDrawing) 将使用 $drawing。这个 $drawing 变量是 BaseDrawing 类型,因此,在第 187 行,它将检查是否已设置,并将布尔值存储在 $isTwoCellAnchor

它将帮助我们进行一些设置,例如 @Wind Cloud 正在寻找的。可以通过简单的操作来解决;

   $drawing->setEditAs("absolute");

新版本1.23(2022-jul-28)有更好的绘图类; 现在您无需任何编辑即可完成此操作。您只需设置正确的方法即可; 移动但不调整单元格大小

   require "../../PhpOffice/vendor/autoload.php";

   use PhpOffice\PhpSpreadsheet\Spreadsheet;
   use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

   $spreadsheet = new Spreadsheet();

   $sheet = $spreadsheet->getActiveSheet();
...
   $imgfile = base64_decode($img_from_query_sql);
   $fname = "../tmp/somefile123.xlsx";

   file_put_contents($fname, $imgfile);
   $drawing = new PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); 

   $Cell = "A2";

   $drawing->setPath($fname);
   $drawing->setCoordinates2($Cell ); //USE THE NEW METHOD SETTER
   $drawing->setResizeProportional(false);
   $drawing->setWidth(300);
   $drawing->setHeight(300);
   $drawing->setWorksheet($sheet);
   $sheet->setTitle("TitleOfSheet");
   $writer = new Xlsx($spreadsheet);
   $writer->save("php://output");

一位叫风云的用户问道;

我想设置“不要移动单元格或调整单元格大小”。你知道吗 如何? – 风云

在新版本^1.23将会非常容易;

   require "../../PhpOffice/vendor/autoload.php";

   use PhpOffice\PhpSpreadsheet\Spreadsheet;
   use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

   $spreadsheet = new Spreadsheet();

   $sheet = $spreadsheet->getActiveSheet();
...
   $imgfile = base64_decode($img_from_query_sql);
   $fname = "../tmp/somefile123.xlsx";

   file_put_contents($fname, $imgfile);
   $drawing = new PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); 

   $Cell = "A2";

   $drawing->setPath($fname);
   $drawing->setCoordinates**2**($Cell);
   $drawing->setEditAs("absolute"); //HERE IS YOUR KEY
   $drawing->setResizeProportional(false);
   $drawing->setWidth(300);
   $drawing->setHeight(300);
   $drawing->setWorksheet($sheet);
   $sheet->setTitle("TitleOfSheet");
   $writer = new Xlsx($spreadsheet);
   $writer->save("php://output");

0
投票

我设置了

$drawing->setEditAs("absolute");
$drawing->setCoordinates2($Cell );
,但是不起作用。当我更改单元格的高度和宽度时,图像不会随其自己的单元格移动和调整大小。任何人帮助..!!非常感谢..

© www.soinside.com 2019 - 2024. All rights reserved.