I have tested your code and it works in Lightning Experience (LEX) from VF page. The only thing, which doesn't work - when I click on button it initiates downloading csv file named **download.csv** in Chrome or randomly generated name in Firefox (not **mydata.csv** as you specified in JS). **Reason why it doesn't works in LEX?** In the Salesforce app and Lightning Experience, Visualforce runs inside an iframe that’s inside the larger /lightning container. I guess because of that browsers ignore name specified in download attribute. Also, I have tried your code directly in JS of lightning component/app. And, everything works as expected. **As a workaround**, you can create for LEX separate button. And here you have two options: 1. You can create lightning app with the same JS code on button click. User should be redirected to your lightning app /c/YourAppName.app instead of VF page. 2. You can create lightning component which implements `force:lightningQuickAction` with the same JS code on button click.