2015-06-11 12 views
0

Давайте предположим, что я следующий код кнопки:Сохранить ответ Аякса в файл

Ext.create('widget.button', { 
    handler: function() { 
     Ext.Ajax.request({ 
      method: 'POST', 
      url: 'index.php?r=store/exportXLS', 
      params: { 
       queryName: me.exporting.name, 
       queryGroups: Ext.JSON.encode(me.exporting.groups) 
      }, 
      success: function (response) { 
       //??? 
      } 
     }); 
    }, 
    dock: 'top', 
    text: 'Экспорт в XLS' 
}); 

Поскольку groups переменной трюмы слишком много параметров, я должен отправить все данные через POST. Действие «store/exportXLS» возвращает действительный html, который я хочу сохранить как XLS. Я не могу использовать window.open(), потому что эти окна блокируются каждый раз. Итак, вопрос: можно ли сохранить файл response.responseText в качестве файла? (Excel в моем случае)

UPDATE: Как вы просили, я отправляю html.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns:o="urn:schemas-microsoft-com:office:office" 

xmlns:x="urn:schemas-microsoft-com:office:excel" 

xmlns="http://www.w3.org/TR/REC-html40"> 
<head> 
    <meta http-equiv="Content-Type" content="application/excel; charset=utf-8"/> 
    <title>hideshow</title> 
</head> 
    <body> 
       <table border="1"> 
      <thead> 
       <tr style="font-weight: bold"> 
        <td>Пациент</td><td>Лекарственное средство</td> 
       </tr> 
      </thead> 
      <tbody> 
       <tr><td>Ажыфорафо А.В. <br />№ истории болезни: Х-34<br /></td><td>Аминокапроновая к-та р-р д/инф.5% фл.100мл Белмедпрепараты РУП,Республика Беларусь<br />Срок годности: 2016-01-01<br />Стоимость: 52.4700000<br />ЛС ОТМЕНЕНО<br /></td></tr> 
      </tbody> 
     </table> 
    </body> 
</html> 

С PHP Я установить заголовки следующим образом:

header("Content-Type: application/excel; charset=UTF-8"); 
header("Content-Disposition: attachment; filename=journal.xls"); 
+0

Может вам опубликовать «действительный html»? – R3tep

+0

Добавил html, как вы просите. – Flame

ответ

0

Ваш HTML-код недействителен для Excel. Вам нужен тег таблицы. Для этого вы можете использовать функцию раскола:

var str = response.split('<table border="1">'); 
strTmp = str[1].split('</table>'); 
var html = '<table border="1">' + strTmp[0] + '</table>'; 

Когда ваш HTML действительно, вы можете использовать этот код:

JS

var url='data:application/vnd.ms-excel,' + escape(html) ; 
var link = document.getElementById("downloadLink"); 
link.setAttribute("href", url); 
link.setAttribute("download", "export.xls"); 
link.click(); 

HTML

<a id="downloadLink" href="" style="display: none;"> 
+0

Известно, что URI данных имеют некоторые ограничения, такие как максимальный размер 32 Кб на IE8. Я думаю, если мне нужно будет загружать очень большие данные, тогда этот подход не сработает. – Flame

+0

Если вам нужно кросс-браузерное решение, с клиентской стороны нет способа. – R3tep

0

Чтобы сделать длинную историю Короче говоря, нет, вы не можете кросс-browserly сохранить случайные данные из JS в файл. Вы можете проверить FileSaver.js на частичное решение, но эта проблема должна быть действительно решена на стороне сервера (сервер должен создать короткую ссылку, которую вы можете ссылаться).

+0

Excel читать html. Таким образом, ваш ответ неверен, пример в [этот пост] (http://stackoverflow.com/questions/18234448/exporting-html-tables-to-excel-xls-in-a-separate-sheet) – R3tep

+0

Предлагаемый способ в этом примере не работает, т. е. (для достаточно длинных данных). Вы можете увидеть таблицу compatabilities связанной библиотеки FileSaver.js. Я сомневаюсь, что можно сделать больше, чем это. Если этого достаточно, лучше использовать его, если его недостаточно, остается только серверное решение. –

+0

OP не говорит о перекрестном браузере – R3tep

Смежные вопросы