Forum Webscript.Ru

Программирование => PHP => Тема начата: zuko от 29 Января 2009, 14:42:17

Название: Excel средствами PHP
Отправлено: zuko от 29 Января 2009, 14:42:17
Тема заезженная, но все же...
С помощью метода, описанного здесь (http://www.spravkaweb.ru/php/sovet/excelcom) собрал чтото типа:

//создаем новый объект COM – excel.application
$xls = new COM("excel.application");
// Скрываем приложение MS Excel
$xls->Application->Visible = 0;
//Создаем новую книгу
$wkb = $xls->Workbooks->Add();
// Выбрали ячейку A1
$range=$xls->Range("A1");
// Вставили значение
$range->Value = "Hello";
//Сохраняем документ
$wkb->SaveAs("C:/file.xls");
//Завершаем работу с MS Excel
$wkb->Close(false);
$xls->Workbooks->Close();
$xls->Quit();
unset($sheet);
unset($xls);

А сейчас вопрос:
Мне не надо сохранять файл на локальном диске С:
Мне необходимо выдать сгенерированный файл в браузер клиента, вернее в браузере клиента должен открыться диалог на сохранение файла.

Всевозможные хидеры на подобие:

header("Content-Disposition: attachment; filename=file.xls");
header("Content-Type: application/octet-stream\\r\\n");
header("Content-Type: application/force-download\\r\\n");
header("Content-Type: application/download\\r\\n");
header("Content-Transfer-Encoding: binary\\r\\n");

во всевозможных местах скрипта не помогают - диалог появляется, но открывается пустой файл.
Название: Excel средствами PHP
Отправлено: hanslinger от 29 Января 2009, 14:58:44
А application/vnd.ms-excel или как-то так если?
Название: Excel средствами PHP
Отправлено: zuko от 29 Января 2009, 15:31:23
без изменений... :(
Название: Excel средствами PHP
Отправлено: zuko от 29 Января 2009, 15:42:43
Но вот если я делаю какую-то ошибку то она отображается не в броузере, а в файле (который пустой).
Т.е. я так понимаю, не хватает какой-то одной командочки, которая работает наподобие $wkb->SaveAs("C:/file.xls"), но сохраняет данные не в файл на локальном диске, а во временный файл, который отправляется в броузер.
Пробовал методом подбора, типа $wkb->Send или $wkb->Output - не угадал...
Название: Excel средствами PHP
Отправлено: brainkiller от 30 Января 2009, 16:31:05
Так напишите $wkb->Send сами, какие проблемы-то? Возьмите за образец $wkb->SaveAs и перепишите код так, чтобы метод не писал вывод в файл, а отправлял http-заголовок и вывод направлял в стандартный поток.
Название: Excel средствами PHP
Отправлено: zuko от 30 Января 2009, 16:39:42
Цитировать
brainkiller:
Возьмите за образец $wkb->SaveAs и перепишите код

А где его переписывать? Я так понимаю где-то в скрипте COM-а, но где это находиться? Это не внешний класс, а встроеная функция PHP. Или я ошибаюсь?
Название: Excel средствами PHP
Отправлено: brainkiller от 30 Января 2009, 18:15:35
Тьфу, блин!

header("Content-Type: application/vnd.ms-excel");
readfile(\'C:/file.xls\');

Как-то так? :)
Название: Excel средствами PHP
Отправлено: zuko от 30 Января 2009, 19:09:29
Цитировать
brainkiller:
readfile(\'C:/file.xls\');


Я думал над этим вариантом, но пока отбросил его как запасной.
Для каждого клиента генерится СВОЙ файл. Необходимо будет следить за тем, скачал ли клиент себе файл, можно ли его уже удалять, имена файлов должны быть с разными именами и т.д.
Все это реализуемо и не сложно, но ведь должен быть вариант намного проще, о котором я и спрашиваю.
Название: Excel средствами PHP
Отправлено: brainkiller от 30 Января 2009, 19:43:01
Скажем прямо, в исходном тексте топика об этом не было ни слова.

Можно, однако, присваивать случайное имя и отдавать на скачивание, а в самом начале скрипта удалять из соответствующей папки всё, что старше 15, скажем, минут.
Название: Excel средствами PHP
Отправлено: CGVictor от 02 Февраля 2009, 12:14:27
Видимо, все-таки делать через файл. Я вот навскидку не помню у Excel.workbook метода, который бы отдал назад бинарник.

Либо - MSDN в помощь.

Есть третий вариант - сделать выдачу xl-я через spreadsheetml (что еще и кроссплатформенно, кстати), но тут минимальная версия xl - XP (2002).
Название: Excel средствами PHP
Отправлено: zuko от 04 Февраля 2009, 15:02:33
Цитировать
brainkiller:
Можно, однако, присваивать случайное имя и отдавать на скачивание, а в самом начале скрипта удалять из соответствующей папки всё, что старше 15, скажем, минут.

Наверное, пойду этим путем. Еще подумаю, как создавать файл со случайным именем, а клиенту отдавать с нормальным. Вроде бы как-то с помощью хидеров можно...
Название: Excel средствами PHP
Отправлено: ojober от 13 Февраля 2009, 01:06:07
Я даже не знал что такое можно сделать.
Название: Excel средствами PHP
Отправлено: Pirxus от 14 Февраля 2009, 17:52:50
этот способ генерации excel файла через COM так понимаю? а если сервре крутится под линуксом, такое ведь не поканает? или я ошибаюсь??
Название: Excel средствами PHP
Отправлено: zuko от 16 Февраля 2009, 09:49:55
Цитировать
Pirxus:
этот способ генерации excel файла через COM так понимаю? а если сервре крутится под линуксом, такое ведь не поканает? или я ошибаюсь??

Правильно понимаете - только под виндой.
Название: Excel средствами PHP
Отправлено: Cleanserg от 19 Февраля 2009, 12:24:34
Жалко что только под виндой.
Название: Excel средствами PHP
Отправлено: hanslinger от 19 Февраля 2009, 13:24:17
Да, жаль, что бензин работает только в двигателях, а салат не приготовишь :(
Название: Excel средствами PHP
Отправлено: CGVictor от 24 Февраля 2009, 03:17:06
Cleanserg hanslinger
Да ешкин же ж кот.
Есть xml (spreadsheetml), который замечательно понимается xl-ем с 2002 года. Т.е. уже 7 гребаных лет. Почему надо до сих пор юзать COM?