Здесь я хочу нарисовать изображения (в пакетном режиме) в существующем файле Excel. Первая партия изображений успешно рисует изображение в файле Excel, а вторая партия изображений также успешно рисует изображения в файле Excel, но на этот раз не ведутся записи первой партии изображений. Основная проблема заключается в том, что он перезаписывает файл и не сохраняет записи предыдущих нарисованных изображений в файле Excel.
Пакеты означают группу изображений. Здесь я рисую изображения в столбец A из столбца B (URL-адреса изображений).
Мои коды:
public function imageDrawProcess() {
$reportFile = $this->_cronDataFactory->create();
$reportFile->addFieldToFilter('status', array('eq' => 'pending'));
$firstItem = $reportFile->getFirstItem();
$fileName = $firstItem->getFileName();
$fileId = $firstItem->getId();
$filePath = $this->getFilePath($fileName);
$totalRecords = $firstItem->getNoOfRecords();
$processRecords = $firstItem->getNorProcessed();
$this->addImageToXlsx($filePath, $totalRecords, $processRecords, $fileId);
}
public function getFilePath($fileName) {
return $this->_directoryList->getPath(\Magento\Framework\App\Filesystem\DirectoryList::PUB) . "/media/export/" . $fileName;
}
public function addImageToXlsx($xlsxFilePath, $totalRecords, $processRecords, $fileId) {
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile($xlsxFilePath);
$inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($xlsxFilePath);
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load($xlsxFilePath);
$activeSheet = $spreadsheet->getActiveSheet();
if($processRecords == 1){
$processRecords1 = $processRecords + 1;
}else{
$processRecords1 = $processRecords;
}
if ($processRecords1 < $totalRecords) {
for ($i = ($processRecords1); $i <= ($processRecords1 + 3); $i++) {
$cellNo = $i;
$cellName = 'B' . $i;
$image = $activeSheet->getCell($cellName)->getValue();
if ($cellNo >= 1 && $image != '') {
$extension = pathinfo($image, PATHINFO_EXTENSION);
if ($extension == 'png') {
$gdImage = imagecreatefrompng($image);
}
if ($extension == 'jpg' || $extension == 'jpeg') {
$gdImage = imagecreatefromjpeg($image);
}
if ($extension == 'gif') {
$gdImage = imagecreatefromgif($image);
}
$this->drawImage($gdImage, $xlsxFilePath, $spreadsheet, $inputFileType, $cellNo);
}
}
}
$data = [];
$processRecords = $i;
$updateCronData = $this->_cronModelFactory->create();
if ($processRecords == $totalRecords) {
$data['status'] = 'complete';
} else {
$data['status'] = 'pending';
}
$data['nor_processed'] = $processRecords;
try {
$updateCronData->setData($data)->setId($fileId)->save();
} catch (\Exception $e) {
$this->_logger->critical($e->getMessage());
}
}
public function drawImage($gdImage, $filePath, $spreadsheet, $inputFileType, $cellNo) {
$cellNo = $cellNo;
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, $inputFileType);
$spreadsheet->setActiveSheetIndex(0);
$activeSheet = $spreadsheet->getActiveSheet();
$objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing();
$objDrawing->setImageResource($gdImage);
$objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_PNG);
$objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_DEFAULT);
$objDrawing->setCoordinates('A' . $cellNo);
$objDrawing->setOffsetX(0);
$objDrawing->setOffsetY(0);
$objDrawing->setHeight(96);
$objDrawing->setWidth(96);
if (empty((array) $objDrawing->getWorksheet())) {
$objDrawing->setWorksheet($activeSheet);
}
$activeSheet->getRowDimension($cellNo)->setRowHeight(72);
$activeSheet->getColumnDimension('A')->setWidth(13.18);
$activeSheet->getStyle('B1:K' . $spreadsheet->setActiveSheetIndex(0)->getHighestRow())->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
$activeSheet->getStyle('B1:K' . $spreadsheet->setActiveSheetIndex(0)->getHighestRow())->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);
$activeSheet->getStyle('D1:D' . $spreadsheet->setActiveSheetIndex(0)->getHighestRow())->getNumberFormat()->setFormatCode('0');
$activeSheet->getStyle('F1:F' . $spreadsheet->setActiveSheetIndex(0)->getHighestRow())->getNumberFormat()->setFormatCode('0');
$activeSheet->getColumnDimension('B')->setAutoSize(TRUE);
foreach (range('C', 'K') as $columnID) {
$activeSheet->getColumnDimension($columnID)->setAutoSize(false);
$activeSheet->getColumnDimension($columnID)->setWidth(20);
$activeSheet->getStyle('B1:K' . $spreadsheet->setActiveSheetIndex(0)->getHighestRow())->getAlignment()->setWrapText(true);
}
$writer->save($filePath);
}
Пожалуйста, смотрите скриншот файла Excel:
Изображение 1: файл Excel с первой партией изображений.
Изображение 2: файл Excel со второй партией изображений, ноне ведение записей предыдущих нарисованных изображений.
Пожалуйста, помогите решить эту проблему.