Возникла проблема с рисованием изображений (в пакетном режиме) в файле Excel с использованием phpspreadsheet - PullRequest
0 голосов
/ 22 октября 2019

Здесь я хочу нарисовать изображения (в пакетном режиме) в существующем файле 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 с первой партией изображений.

enter image description here

Изображение 2: файл Excel со второй партией изображений, ноне ведение записей предыдущих нарисованных изображений.

enter image description here

Пожалуйста, помогите решить эту проблему.

...