php - PHPSpreadsheet,绘图 - 使用单元格移动和调整大小
问题描述
我尝试在 PHPSpreadsheet 中为我的图像设置“使用单元格移动和调整大小”,但在任何地方都找不到任何信息。现在我的问题是,如果该功能已经实现,如果是,它是如何调用的。
解决方案
也许“帮助你”为时已晚,但这对其他人有用
我遇到了同样的问题,发现了 2 个“东西” 1)什么都没有 2)谷歌是一堆到 50 个顶级网络的百万链接/子链接。Google 是 1998 年的旧 AOL
但是,我没有放弃,我可以“修复”它。实际上,在 PHPSpreadsheet 的文件夹中,您会看到下一个路径文件夹;
- /PhpOffice/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx
有一个文件叫做:Drawing.php,在这个文件中你会发现一个函数叫做:writeDrawing
在那里你会找到以下代码;[行:152]
$objWriter->startElement('xdr:oneCellAnchor');
它必须替换为:
$objWriter->startElement('xdr:twoCellAnchor');
之后,2 到 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();
添加注释标记如“//”或“/* code */”并注释它以避免这些代码行。现在,添加以下代码;
$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();
在下面的代码中,应该修复 [Line:178 to 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);
现在,在 [Line: 183]插入此代码;
$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 orignally,使用选项 2->移动但不使用单元格大小制作图片,但是,我们更改了 Drawing.php 的代码,现在所有图像都是使用选项 1->移动和单元格大小创建的
现在,如果我们有一个包含“事物”列表和每行 1 个图像的 excel 文件,我们可以应用过滤器,如果某些行没有任何图像,则下面的图像行不会与可见行重叠(匹配结果)。过滤后的每张图片都将隐藏在父行中,并且与过滤器匹配的每张图片都将像往常一样“坚持”到他的父行
推荐阅读
- android - FloatingActionButton 应该在不滚动的情况下可见(在 CollapsingToolbarlayout 中)
- c++ - 如何进行模板化类型参数专业化?
- javascript - Angular 6 HTML选择菜单设置默认值
- javascript - 如何使用颜色渐变推断颜色的相对百分比值
- node.js - 退出自定义 Sails 1 和 Actions 2
- azure - 检测到类型不兼容的二元运算符。找到运算符类型“And”的操作数类型“Edm.Int32”和“Edm.Int32”
- java - 如何在 intellij IDEA 中从 oracle 数据库生成实体?
- jquery - 使用 Webpack 加载 Jquery
- r - 使用 ggplot inR 在函数中未识别列名
- node.js - Loopback - 如何获取用户 ID 并插入相关模型?(有很多)