如何在 magento2 的自定义网格中添加 CSV 导出按钮。我创建了一个网格和表格。需要在magento2中添加csv导出功能。
8 回答
创建你的控制器
<?php
namespace Yourpackage\Yourmodule\Controller\Adminhtml\Sample;
class ExportCsv extends \Magento\Backend\App\Action
{
protected $_fileFactory;
protected $_response;
protected $_view;
protected $directory;
protected $converter;
protected $resultPageFactory ;
protected $directory_list;
public function __construct( \Magento\Backend\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory
) {
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
public function execute()
{
$fileName = 'yourfilename.csv';
$resultPage = $this->resultPageFactory ->create();
$content = $resultPage->getLayout()->getBlock('yourblockname')->getCsv();;
$this->_sendUploadResponse($fileName, $content);
}
protected function _sendUploadResponse($fileName, $content, $contentType='application/octet-stream') {
$this->_response->setHttpResponseCode(200)
->setHeader('Pragma', 'public', true)
->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true)
->setHeader('Content-type', $contentType, true)
->setHeader('Content-Length', strlen($content), true)
->setHeader('Content-Disposition', 'attachment; filename="' . $fileName . '"', true)
->setHeader('Last-Modified', date('r'), true)
->setBody($content)
->sendResponse();
die;
}
}
创建您的布局 xml yourmodule_yourcontroller_exportcsv
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<update handle="yourmodule_yourcontroller_grid"/>
</page>
只需在listingToolbar开始标签下添加这一行就可以了
<listingToolbar name="listing_top">
<exportButton name="export_button"/>
下面是一个默认类,它只导出管理网格中显示的数据而不导出整个数据
在您的网格列中查找,
并在 ui contactus_grid.xml 或任何其他中仅添加此代码。
<exportButton class="Magento\Ui\Component\ExportButton" component="Magento_Ui/js/grid/export" displayArea="dataGridActions">
<settings>
<options>
<option name="csv" xsi:type="array">
<item name="value" xsi:type="string">csv</item>
<item name="label" xsi:type="string" translate="true">CSV</item>
<item name="url" xsi:type="string">mui/export/gridToCsv</item>
</option>
<option name="xml" xsi:type="array">
<item name="value" xsi:type="string">xml</item>
<item name="label" xsi:type="string" translate="true">Excel XML</item>
<item name="url" xsi:type="string">mui/export/gridToXml</item>
</option>
</options>
</settings>
</exportButton>
因为我找不到完整的答案。以下是您应该如何继续,以便您可以从管理网格中过滤数据。
请从执行方法中删除不需要的行。当我提出这个问题时,我正在处理这段代码
首先创建你的 UI 组件
<listingToolbar name="listing_top">
<exportButton class="Magento\Ui\Component\ExportButton" component="Magento_Ui/js/grid/export" displayArea="dataGridActions">
<settings>
<options>
<option name="cvs" xsi:type="array">
<item name="value" xsi:type="string">csv</item>
<item name="label" xsi:type="string" translate="true">CSV</item>
<item name="url" xsi:type="string">controller/results/export</item>
</option>
<option name="xml" xsi:type="array">
<item name="value" xsi:type="string">xml</item>
<item name="label" xsi:type="string" translate="true">Excel XML</item>
<item name="url" xsi:type="string">skininc/results/export</item>
</option>
</options>
</settings>
</exportButton>
</listingToolbar>
接下来为 skininc/results/export 创建控制器
<?php
/**
* @category Magento 2 Module
* @package Theiconnz\Frontendflow
* @author Don Nuwinda
*/
namespace MyModule\Frontendflow\Controller\Adminhtml\Results;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Filesystem;
use Magento\Framework\Filesystem\Directory\WriteInterface;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Ui\Model\Export\ConvertToCsv;
use Magento\Framework\App\Response\Http\FileFactory;
use MyModule\Frontendflow\Model\ResourceModel\MyData\CollectionFactory;
class Export extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Backend\Model\View\Result\ForwardFactory
*/
protected $resultForwardFactory;
/**
* Massactions filter
*
* @var Filter
*/
protected $filter;
/**
* @var MetadataProvider
*/
protected $metadataProvider;
/**
* @var WriteInterface
*/
protected $directory;
/**
* @var ConvertToCsv
*/
protected $converter;
/**
* @var FileFactory
*/
protected $fileFactory;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory,
Filter $filter,
Filesystem $filesystem,
ConvertToCsv $converter,
FileFactory $fileFactory,
\Magento\Ui\Model\Export\MetadataProvider $metadataProvider,
\MyModule\Frontendflow\Model\ResourceModel\MyData $resource,
CollectionFactory $collectionFactory
) {
$this->resources = $resource;
$this->filter = $filter;
$this->_connection = $this->resources->getConnection();
$this->directory = $filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);
$this->metadataProvider = $metadataProvider;
$this->converter = $converter;
$this->fileFactory = $fileFactory;
parent::__construct($context);
$this->resultForwardFactory = $resultForwardFactory;
$this->collectionFactory = $collectionFactory;
}
/**
* export.
*
* @return \Magento\Backend\Model\View\Result\Forward
*/
public function execute()
{
$collection = $this->filter->getCollection($this->collectionFactory->create());
$component = $this->filter->getComponent();
$this->filter->prepareComponent($component);
$dataProvider = $component->getContext()->getDataProvider();
$dataProvider->setLimit(0, false);
$ids = [];
foreach ($collection as $document) {
$ids[] = (int)$document->getId();
}
$searchResult = $component->getContext()->getDataProvider()->getSearchResult();
$fields = $this->metadataProvider->getFields($component);
$options = $this->metadataProvider->getOptions();
$name = md5(microtime());
$file = 'export/'. $component->getName() . $name . '.csv';
$this->directory->create('export');
$stream = $this->directory->openFile($file, 'w+');
$stream->lock();
$stream->writeCsv($this->metadataProvider->getHeaders($component));
foreach ($searchResult->getItems() as $document) {
if( in_array( $document->getId(), $ids ) ) {
$this->metadataProvider->convertDate($document, $component->getName());
$stream->writeCsv($this->metadataProvider->getRowData($document, $fields, $options));
}
}
$stream->unlock();
$stream->close();
return $this->fileFactory->create('export.csv', [
'type' => 'filename',
'value' => $file,
'rm' => true // can delete file after use
], 'var');
}
}
使用 magento2 中的 UI 组件在网格中导出
在 Container 标记下,在 ui 列表组件 xml 中添加以下行
<exportButton name="export_button">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="selectProvider" xsi:type="string">vendor_listing.vendor_listing.example_blog_columns.ids</item>
</item>
</argument>
</exportButton>
这将为 magento2 的网格中加载的集合生成 csv
创建你的控制器
<?php
namespace Yourpackage\Yourmodule\Controller\Adminhtml\Report;
use Magento\Framework\App\Filesystem\DirectoryList;
class ExportCsv extends \Magento\Backend\App\Action {
protected $resultPageFactory;
protected $fileFactory;
/**
*
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\App\Response\Http\FileFactory $fileFactory,
\Magento\Framework\View\Result\PageFactory $resultPageFactory
) {
$this->resultPageFactory = $resultPageFactory;
$this->fileFactory = $fileFactory;
parent::__construct($context);
}
/**
*
* @return type
*/
public function execute() {
$fileName = 'salesreport.csv';
$content = $this->_view->getLayout()->createBlock(
\Ktpl\RepresentativeReport\Block\Adminhtml\Salesdata\Grid::class
)->getCsvFile();
return $this->fileFactory->create($fileName, $content, DirectoryList::VAR_DIR);
}
}
下面是一个默认类,它只导出管理网格中显示的数据而不导出整个数据
<exportButton class="Magento\Ui\Component\ExportButton">
如果您想要所有数据,您可以创建一个自定义导出按钮来导出所有数据。
在管理网格显示的 Ui-Component 文件中编辑
[供应商名称] \ [模块名称] \view\adminhtml\ui_component
添加此代码以将 Button 添加到 Admin Grid
ui-组件文件名.xml
<item name="buttons" xsi:type="array">
<item name="import" xsi:type="array">
<item name="name" xsi:type="string">import</item>
<item name="label" xsi:type="string" translate="true">Import</item>
<item name="class" xsi:type="string">secondary</item>
<item name="url" xsi:type="string">*/*/importdata</item>
<item name="sortOrder" xsi:type="number">20</item>
</item>
<item name="export" xsi:type="array">
<item name="name" xsi:type="string">export</item>
<item name="label" xsi:type="string" translate="true">Export</item>
<item name="class" xsi:type="string">secondary</item>
<item name="url" xsi:type="string">*/*/exportdata</item>
<item name="sortOrder" xsi:type="number">30</item>
</item>
</item>
现在创建一个导出或导入数据的文件。文件名必须与您在 Ui-Component 文件中定义的相同
<item name="url" xsi:type="string">*/*/exportdata</item>
<item name="url" xsi:type="string">*/*/importdata</item>
文件路径必须是这样的
[vendor_name]\[module_name]\Controller\Adminhtml\[Controller_name]\Exportdata.php
导出数据.php
<?php
namespace [vendor_name]\[module_name]\Controller\Adminhtml\[Controller_name];
use Magento\Framework\App\Filesystem\DirectoryList;
class Exportdata extends \Magento\Backend\App\Action
{
protected $uploaderFactory;
protected $_locationFactory;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\App\Response\Http\FileFactory $fileFactory,
\Magento\Framework\Filesystem $filesystem,
\[vendor_name]\[module_name]\Model\locatorFactory $locationFactory // This is returns Collaction of Data
) {
parent::__construct($context);
$this->_fileFactory = $fileFactory;
$this->_locationFactory = $locationFactory;
$this->directory = $filesystem->getDirectoryWrite(DirectoryList::VAR_DIR); // VAR Directory Path
parent::__construct($context);
}
public function execute()
{
$name = date('m-d-Y-H-i-s');
$filepath = 'export/export-data-' .$name. '.csv'; // at Directory path Create a Folder Export and FIle
$this->directory->create('export');
$stream = $this->directory->openFile($filepath, 'w+');
$stream->lock();
//column name dispay in your CSV
$columns = ['Col-1-name','Col-2-name','Col-3-name','Col-4-name','Col-5-name','Col-6-name','Col-7-name','Col-8-name','Col-9-name',];
foreach ($columns as $column)
{
$header[] = $column; //storecolumn in Header array
}
$stream->writeCsv($header);
$location = $this->_locationFactory->create();
$location_collection = $location->getCollection(); // get Collection of Table data
foreach($location_collection as $item){
$itemData = [];
// column name must same as in your Database Table
$itemData[] = $item->getData('col-1-name');
$itemData[] = $item->getData('col-2-name');
$itemData[] = $item->getData('col-3-name');
$itemData[] = $item->getData('col-4-name');
$itemData[] = $item->getData('col-5-name');
$itemData[] = $item->getData('col-6-name');
$itemData[] = $item->getData('col-7-name');
$itemData[] = $item->getData('col-8-name');
$itemData[] = $item->getData('col-9-name');
$stream->writeCsv($itemData);
}
$content = [];
$content['type'] = 'filename'; // must keep filename
$content['value'] = $filepath;
$content['rm'] = '1'; //remove csv from var folder
$csvfilename = 'locator-import-'.$name.'.csv';
return $this->_fileFactory->create($csvfilename, $content, DirectoryList::VAR_DIR);
}
}
现在您可以单击“导出”按钮并查看下面下载的 .csv 文件。
我希望这可以帮助你。
将 CSV 导出按钮添加到您的网格块布局 (XML):
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="your.grid.container">
<block class="Yourpackage\Yourmodule\Block\Adminhtml\Sample\Grid" name="sample.grid" as="grid">
<!-- Arguments or blocks -->
<!-- Export Widget -->
<block class="Magento\Backend\Block\Widget\Grid\Export" name="sample.grid.export" as="grid.export">
<arguments>
<argument name="exportTypes" xsi:type="array">
<item name="csv" xsi:type="array">
<item name="urlPath" xsi:type="string">*/*/exportCsv</item>
<item name="label" xsi:type="string" translate="true">CSV</item>
</item>
</argument>
</arguments>
</block>
<!-- Columns block -->
</block>
</referenceBlock>
</body>
</page>
创建你的控制器:
<?php
namespace Yourpackage\Yourmodule\Controller\Adminhtml\Sample;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
class ExportCsv extends \Yourpackage\Yourmodule\Controller\Adminhtml\Sample
{
/**
* Export data grid to CSV format
*
* @return ResponseInterface
*/
public function execute()
{
$this->_view->loadLayout();
$fileName = 'sample_data.csv';
$content = $this->_view->getLayout()->getChildBlock('sample.grid', 'grid.export');
return $this->_fileFactory->create(
$fileName,
$content->getCsvFile($fileName),
DirectoryList::VAR_DIR
);
}
}