Magento 2 has a CSV processor, that is being used to import and export product and customer related data.
In my earlier post I explained a way to generate a CSV.
I am explaining here a way to import a CSV to update inventory of the existing products.
<?php /** * @author DecryptWeb * @copyright Copyright (c) 2020 DecryptWeb (https://www.decryptweb.com/) */ namespace DW\Interface\Model; use Magento\Framework\App\State; use Magento\ImportExport\Model\ImportFactory; use Magento\ImportExport\Model\Import\Source\CsvFactory; use Magento\Framework\Filesystem\Directory\ReadFactory; use DW\Interface\Logger\Inventory\Logger; use Magento\Framework\Filesystem\Io\File; /** * Class Processor * @package DW\Interface\Model */ class Processor { /** * @var State $state */ private $state; /** * @var $importFactory */ protected $importFactory; /** * @var $csvSourceFactory */ private $csvSourceFactory; /** * @var ReadFactory */ private $readFactory; /** * @var Logger */ protected $_logger; /** * @var File */ protected $_file; /** * Processor constructor. * @param State $state * @param ImportFactory $importFactory * @param CsvFactory $csvSourceFactory * @param ReadFactory $readFactory * @param Logger $logger * @param File $_file */ public function __construct( State $state, ImportFactory $importFactory, CsvFactory $csvSourceFactory, ReadFactory $readFactory, Logger $logger, File $_file ) { $this->state = $state; $this->importFactory = $importFactory; $this->csvSourceFactory = $csvSourceFactory; $this->readFactory = $readFactory; $this->_file = $_file; $this->_logger = $logger; }//end __construct() /** * @param string $import_path file import path * @param string $fileType * @param bool $inventory_update whether to update inventory or product * @param bool $logger true/false * @return bool * @throws \Magento\Framework\Exception\LocalizedException */ public function productCsvProcessor($import_path, $fileType = 'stock_sources', $inventory_update = false, $logger = false): bool { $import_file = $this->_file->getPathInfo($import_path); /** * @var \Magento\ImportExport\Model\Import $import */ $import = $this->importFactory->create(); $entity = $fileType; $import->setData( [ 'entity' => $entity, 'behavior' => 'append', 'validation_strategy' => 'validation-stop-on-errors', ] ); $read_file = $this->readFactory->create($import_file['dirname']); $csvSource = $this->csvSourceFactory->create( [ 'file' => $import_file['basename'], 'directory' => $read_file, ] ); $validate = $import->validateSource($csvSource); if ($validate) { try { $result = $import->importSource(); if ($result) { $import->invalidateIndex(); $createdRow = $import->getCreatedItemsCount(); $updatedRow = $import->getUpdatedItemsCount(); $this->_logger->info(sprintf('Total Record Updated: %s', $updatedRow)); } } catch (\Exception $exception) { $this->_logger->info(sprintf($exception->getMessage())); return false; } } else { $this->_logger->info(sprintf('Invalid Data')); return false; } return true; }//end productCsvProcessor() }
Here as seen simply you can call this function productCsvProcessor with the arguments to import and update product inventory.
Hope this is helpful