First create a Import Button in your Ui-component File
[vendor_name] \ [module_name] \view\adminhtml\ui_component
uiComponenetFileName.xml
<item name="buttons" xsi:type="array">
<item name="add" xsi:type="array">
<item name="name" xsi:type="string">add</item>
<item name="label" xsi:type="string" translate="true">Add New</item>
<item name="class" xsi:type="string">primary</item>
<item name="url" xsi:type="string">*/*/add</item>
<item name="sortOrder" xsi:type="number">10</item>
</item>
<item name="import" xsi:type="array">
<item name="name" xsi:type="string">import</item>
<item name="label" xsi:type="string" translate="true">Import Storelocatore</item>
<item name="class" xsi:type="string">secondary</item>
<item name="url" xsi:type="string">*/dataimport/importdata</item>
<item name="sortOrder" xsi:type="number">20</item>
</item>
</item>
Now this Import Button Call Import Data Form
[vendor_name] \ [module_name] \Controller\Adminhtml\Dataimport
Importdata.php
<?php
namespace [vendor_name]\ [module_name] \Controller\Adminhtml\Dataimport;
use Magento\Framework\Controller\ResultFactory;
class Importdata extends \Magento\Backend\App\Action
{
private $coreRegistry;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\Registry $coreRegistry
) {
0
parent::__construct($context);
$this->coreRegistry = $coreRegistry;
}
public function execute()
{
$rowData = $this->_objectManager->create('[vendor_name] \ [module_name] \Model\Locator');
$this->coreRegistry->register('row_data', $rowData);
$resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE);
$resultPage->getConfig()->getTitle()->prepend(__('Import Locator Data'));
return $resultPage;
}
// used for acl.xml
protected function _isAllowed()
{
return $this->_authorization->isAllowed('[vendor_name]_[module_name]::add_datalocation');
}
}
create a Layout File which Call your Block File
[vendor_name] \ [module_name] \view\adminhtml\layout
[controller_name]_dataimport_importdata.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="[vendor_name] \ [module_name] \Block\Adminhtml\Dataimport\Importdata" name="importdata_locator" />
</referenceContainer>
</body>
</page>
create a block File for Import Data Form
[vendor_name] \ [module_name] \Block\Adminhtml\Dataimport
Importdata.php
<?php
namespace [vendor_name] \ [module_name] \Block\Adminhtml\Dataimport;
class Importdata extends \Magento\Backend\Block\Widget\Form\Container
{
protected $_coreRegistry = null;
public function __construct(
\Magento\Backend\Block\Widget\Context $context,
\Magento\Framework\Registry $registry,
array $data = []
) {
$this->_coreRegistry = $registry;
parent::__construct($context, $data);
}
protected function _construct()
{
$this->_objectId = 'row_id';
$this->_blockGroup = '[module_name]_[vendor_name]';
$this->_controller = 'adminhtml_dataimport';
parent::_construct();
$this->buttonList->remove('back');
$this->buttonList->update('save', 'label', __('Import'));
$this->buttonList->remove('reset');
$this->addButton(
'backhome',
[
'label' => __('Back'),
'on_click' => sprintf("location.href = '%s';", $this->getUrl('[route_name] / [controller_name] /index')),
'class' => 'back',
'level' => -2
]
);
}
public function getHeaderText()
{
return __('Import Location Data');
}
protected function _isAllowedAction($resourceId)
{
return $this->_authorization->isAllowed($resourceId);
}
public function getFormActionUrl()
{
if ($this->hasFormActionUrl()) {
return $this->getData('form_action_url');
}
return $this->getUrl('[route_name] / dataimport/save');
}
}
the above file call import form
[vendor_name] \ [module_name] \Block\Adminhtml\Dataimport\Edit
Form.php
<?php
namespace [vendor_name] \ [module_name] \Block\Adminhtml\Dataimport\Edit;
use Magento\Framework\View\Asset\Repository;
class Form extends \Magento\Backend\Block\Widget\Form\Generic
{
protected $_assetRepo;
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Data\FormFactory $formFactory,
\Magento\Framework\View\Asset\Repository $assetRepo,
array $data = []
) {
parent::__construct($context, $registry, $formFactory, $data);
}
protected function _prepareForm()
{
$path = $this->_assetRepo->getUrl("[vendor_name]_[module_name]::img/[vendor_name]_[module_name]_Sample_File.csv");
$model = $this->_coreRegistry->registry('row_data');
$form = $this->_formFactory->create(
['data' => [
'id' => 'edit_form',
'enctype' => 'multipart/form-data',
'action' => $this->getData('action'),
'method' => 'post'
]
]
);
$form->setHtmlIdPrefix('datalocation_');
$fieldset = $form->addFieldset(
'base_fieldset',
['legend' => __('Import Location '), 'class' => 'fieldset-wide']
);
$importdata_script = $fieldset->addField(
'importdata',
'file',
array(
'label' => 'Upload File',
'required' => true,
'name' => 'importdata',
'note' => 'Allow File type: .csv and .xls',
)
);
$importdata_script->setAfterElementHtml("
<span id='sample-file-span' ><a id='sample-file-link' href='".$path."' >Download Sample File</a></span>
<script type=\"text/javascript\">
document.getElementById('[route_name]_importdata').onchange = function () {
var fileInput = document.getElementById('[route_name]_importdata');
var filePath = fileInput.value;
var allowedExtensions = /(\.csv|\.xls)$/i;
if(!allowedExtensions.exec(filePath))
{
alert('Please upload file having extensions .csv or .xls only.');
fileInput.value = '';
}
};
</script>"
);
$form->setValues($model->getData());
$form->setUseContainer(true);
$this->setForm($form);
return parent::_prepareForm();
}
}
this import form check whether file is valid or not, now create file which read your uploaded file and insert into table .
[vendor_name] \ [module_name] \Controller\Adminhtml\Dataimport*
Save.php
<?php
namespace [vendor_name]\[module_name]\Controller\Adminhtml\Dataimport;
use Magento\Backend\App\Action;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Filesystem;
use Magento\MediaStorage\Model\File\UploaderFactory;
use Magento\Framework\Image\AdapterFactory;
use Magento\Store\Model\ScopeInterface;
class Save extends \Magento\Backend\App\Action
{
protected $fileSystem;
protected $uploaderFactory;
protected $request;
protected $adapterFactory;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\Filesystem $fileSystem,
\Magento\MediaStorage\Model\File\UploaderFactory $uploaderFactory,
\Magento\Framework\App\RequestInterface $request,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
AdapterFactory $adapterFactory
) {
parent::__construct($context);
$this->fileSystem = $fileSystem;
$this->request = $request;
$this->scopeConfig = $scopeConfig;
$this->adapterFactory = $adapterFactory;
$this->uploaderFactory = $uploaderFactory;
}
public function execute()
{
if ( (isset($_FILES['importdata']['name'])) && ($_FILES['importdata']['name'] != '') )
{
try
{
$uploaderFactory = $this->uploaderFactory->create(['fileId' => 'importdata']);
$uploaderFactory->setAllowedExtensions(['csv', 'xls']);
$uploaderFactory->setAllowRenameFiles(true);
$uploaderFactory->setFilesDispersion(true);
$mediaDirectory = $this->fileSystem->getDirectoryRead(DirectoryList::MEDIA);
$destinationPath = $mediaDirectory->getAbsolutePath('[vendor_name]_[module_name]_IMPORTDATA');
$result = $uploaderFactory->save($destinationPath);
if (!$result)
{
throw new LocalizedException
(
__('File cannot be saved to path: $1', $destinationPath)
);
}
else
{
$imagePath = '[vendor_name]_[module_name]_IMPORTDATA'.$result['file'];
$mediaDirectory = $this->fileSystem->getDirectoryRead(DirectoryList::MEDIA);
$destinationfilePath = $mediaDirectory->getAbsolutePath($imagePath);
/* file read operation */
$f_object = fopen($destinationfilePath, "r");
$column = fgetcsv($f_object);
// column name must be same as the Sample file name
if($f_object)
{
if( ($column[0] == 'Col_name_1') && ($column[1] == 'Col_name_2') && ($column[2] == 'Col_name_3') && ($column[3] == 'Col_name_4') && ($column[4] == 'Col_name_5') )
{
$count = 0;
while (($columns = fgetcsv($f_object)) !== FALSE)
{
$rowData = $this->_objectManager->create('VendoreName\ModuelName\Model\Storelocator');
if($columns[0] != 'Col_name_1')// unique Name like Primary key
{
$count++;
/// here this are all the Getter Setter Method which are call to set value
// the auto increment column name not used to set value
$rowData->setCol_name_1($columns[1]);
$rowData->setCol_name_2($columns[2]);
$rowData->setCol_name_3($columns[3]);
$rowData->setCol_name_4($columns[4]);
$rowData->setCol_name_5($columns[5]);
$rowData->save();
}
}
$this->messageManager->addSuccess(__('A total of %1 record(s) have been Added.', $count));
$this->_redirect('[route_name]/[controller_name]/index');
}
else
{
$this->messageManager->addError(__("invalid Formated File"));
$this->_redirect('[route_name]/dataimport/importdata');
}
}
else
{
$this->messageManager->addError(__("File hase been empty"));
$this->_redirect('[route_name]/dataimport/importdata');
}
}
}
catch (\Exception $e)
{
$this->messageManager->addError(__($e->getMessage()));
$this->_redirect('[controller_name]/dataimport/importdata');
}
}
else
{
$this->messageManager->addError(__("Please try again."));
$this->_redirect('[controller_name]/dataimport/importdata');
}
}
}
Now you can Click on the Import Button and upload .csv file and import data.
I Hope This Helps You.