Попробуйте этот довольно грязный трюк в вашем методе индекса:
response.setHeader( 'Content-Disposition', 'attachment;filename=list.xls' )
Объяснение : хитрость в том, что HTML-страница, переименованная в * .xls, может быть прочитана пакетами офисного программного обеспечения. Что вы делаете, это говорите браузеру загружать файл с этим именем вместо перехода к обычному HTML-файлу. Если вы хотите использовать это в кнопке, вы должны продолжить работу с любой страницей, генерирующей HTML, а затем добавить этот заголовок к ответу. response
является глобальным для действий в контроллерах Grails.