Forum Webscript.Ru
Программирование => 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");
во всевозможных местах скрипта не помогают - диалог появляется, но открывается пустой файл.
-
А application/vnd.ms-excel или как-то так если?
-
без изменений... :(
-
Но вот если я делаю какую-то ошибку то она отображается не в броузере, а в файле (который пустой).
Т.е. я так понимаю, не хватает какой-то одной командочки, которая работает наподобие $wkb->SaveAs("C:/file.xls"), но сохраняет данные не в файл на локальном диске, а во временный файл, который отправляется в броузер.
Пробовал методом подбора, типа $wkb->Send или $wkb->Output - не угадал...
-
Так напишите $wkb->Send сами, какие проблемы-то? Возьмите за образец $wkb->SaveAs и перепишите код так, чтобы метод не писал вывод в файл, а отправлял http-заголовок и вывод направлял в стандартный поток.
-
brainkiller:
Возьмите за образец $wkb->SaveAs и перепишите код
А где его переписывать? Я так понимаю где-то в скрипте COM-а, но где это находиться? Это не внешний класс, а встроеная функция PHP. Или я ошибаюсь?
-
Тьфу, блин!
header("Content-Type: application/vnd.ms-excel");
readfile(\'C:/file.xls\');
Как-то так? :)
-
brainkiller:
readfile(\'C:/file.xls\');
Я думал над этим вариантом, но пока отбросил его как запасной.
Для каждого клиента генерится СВОЙ файл. Необходимо будет следить за тем, скачал ли клиент себе файл, можно ли его уже удалять, имена файлов должны быть с разными именами и т.д.
Все это реализуемо и не сложно, но ведь должен быть вариант намного проще, о котором я и спрашиваю.
-
Скажем прямо, в исходном тексте топика об этом не было ни слова.
Можно, однако, присваивать случайное имя и отдавать на скачивание, а в самом начале скрипта удалять из соответствующей папки всё, что старше 15, скажем, минут.
-
Видимо, все-таки делать через файл. Я вот навскидку не помню у Excel.workbook метода, который бы отдал назад бинарник.
Либо - MSDN в помощь.
Есть третий вариант - сделать выдачу xl-я через spreadsheetml (что еще и кроссплатформенно, кстати), но тут минимальная версия xl - XP (2002).
-
brainkiller:
Можно, однако, присваивать случайное имя и отдавать на скачивание, а в самом начале скрипта удалять из соответствующей папки всё, что старше 15, скажем, минут.
Наверное, пойду этим путем. Еще подумаю, как создавать файл со случайным именем, а клиенту отдавать с нормальным. Вроде бы как-то с помощью хидеров можно...
-
Я даже не знал что такое можно сделать.
-
этот способ генерации excel файла через COM так понимаю? а если сервре крутится под линуксом, такое ведь не поканает? или я ошибаюсь??
-
Pirxus:
этот способ генерации excel файла через COM так понимаю? а если сервре крутится под линуксом, такое ведь не поканает? или я ошибаюсь??
Правильно понимаете - только под виндой.
-
Жалко что только под виндой.
-
Да, жаль, что бензин работает только в двигателях, а салат не приготовишь :(
-
Cleanserg hanslinger
Да ешкин же ж кот.
Есть xml (spreadsheetml), который замечательно понимается xl-ем с 2002 года. Т.е. уже 7 гребаных лет. Почему надо до сих пор юзать COM?