I want to create an excel format file for download in Magento 2

<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 a new Guest</item>
            <item name="class" xsi:type="string">primary</item>
            <item name="url" xsi:type="string">*/*/newAction</item>

        <item name="xml" xsi:type="array">
            <item name="name" xsi:type="string">xml</item>
            <item name="label" xsi:type="string" translate="true">Excel Download</item>

            <item name="url" xsi:type="string">*/export/gridToXls</item>

enter image description here

I have the skeleton for my GridToXls action here:

class GridToXls extends Action

  public function execute(){

How do I create and prepare the excel file for download in a Magento 2 custom module?

  • Please correct your question. You've asked for excel download, but you've accepted an answer that downloads as CSV. May be that's the requirement for you, but it will mislead others, like I reached here. Excel and CSV are not same. – Rinto George Nov 29 '20 at 11:48

In Magento 2 Native, One php class \Magento\Framework\App\Response\Http\FileFactory is used for create csv and download CSV by magento way. create() function in FileFactory.php is used for create CSV file. There are many another way to download CSV file using Core PHP script but its not best way to use within Magento Coding standard. You can write CSV and download a CSV file using just simple below code snippet in your controller file, namespace {your vendor}\CSV\Controller\Adminhtml\Index;

use Magento\Framework\App\Filesystem\DirectoryList;

class Export extends \Magento\Backend\App\Action
    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Framework\App\Response\Http\FileFactory $fileFactory,
        \Magento\Framework\Filesystem $filesystem
    ) {
        $this->orderRepository = $orderRepository;
        $this->_fileFactory = $fileFactory;
        $this->directory = $filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);

    public function execute()
        $name = date('m_d_Y_H_i_s');
        $filepath = 'export/custom' . $name . '.csv';
        /* Open file */
        $stream = $this->directory->openFile($filepath, 'w+');
        $columns = $this->getColumnHeader();
        foreach ($columns as $column) {
            $header[] = $column;
        /* Write Header */

        $products[] = array(1,'Test 1','test 1',100);
        $products[] = array(2,'Test 2','test 2',299);

        foreach ($products as $item) {
            $itemData = [];
            $itemData[] = $item[0];
            $itemData[] = $item[1];
            $itemData[] = $item[2];
            $itemData[] = $item[3];

        $content = [];
        $content['type'] = 'filename'; // must keep filename
        $content['value'] = $filepath;
        $content['rm'] = '1'; //remove csv from var folder

        $csvfilename = 'Product.csv';
        return $this->_fileFactory->create($csvfilename, $content, DirectoryList::VAR_DIR);


    /* Header Columns */
    public function getColumnHeader() {
        $headers = ['Id','Product name','SKU','Price'];
        return $headers;

When you run controller action you can download CSV file using just Magento straight forward way. Using the above way you can download CSV file using Magento 2 Way.you can customize on your requirement

  • Thanks, Shafeel Sha. It's working for me – Nitesh Kumar Singh Sep 9 '19 at 7:02
  • @NiteshKumarSingh your welcome , Happy coding :) – Shafeel Sha Sep 9 '19 at 7:03
  • Fatal error: Uncaught TypeError: Argument 1 passed to namespace\models\Controller\Adminhtml\Export\GridToXls::__construct() must be an instance of Magento\Backend\App\Action\Context, instance of Magento\Framework\ObjectManager\ObjectManager given, called in /tyresnmore/20190705151145/lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php on line 93 – Nitesh Kumar Singh Sep 9 '19 at 8:39
  • run on server getting error – Nitesh Kumar Singh Sep 9 '19 at 8:40
  • please run baisc commands > – Shafeel Sha Sep 9 '19 at 8:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.