|
|
|
| Задача: на php сделать отчет (из базы mysql), который необходимо поместить в документ word и открыть этот документ на стороне клиента.
Нашел скрипт, основанный на СОМ, для записи данных в ворд
<?
// Соединение, Выбор из базы данных .....
// Создать новый объект COM для приложения MS Word
$word=new COM("word.application") ;
// Активизировать окно MS Word
$word->visible = 1;
// Открыть пустой документ.
$word->Documents->Add();
while($row = mysql_fetch_array($result))
// Вывести данные таблицы в открытый документ Word.
$word->Selection->Typetext("$row[1];\n");
// Запросить у пользователя имя документа.
$word->Documents[l]->Save;
// Выйти из MS Word
$word->Quit();
?>
|
Если я правильно понимаю, данный скрипт формирует документ на стороне сервера, но он почему-то нигде не отображается, хотя в процессах сервера висит Winword. Подскажите, как мне сделать вывод сформированного документа на клиентской машине? | |
|
|
|
|
|
|
|
для: Gust
(04.04.2007 в 19:05)
| | Вы выполняете Save, но не указываете имя файла!
Куда же он по-вашему должен записывать результат?! | |
|
|
|
|
|
|
|
для: ddhvvn
(04.04.2007 в 19:07)
| | Вот и я не пойму. Скрипт не мой, нашел в инете, и именно с таким комментарием
// Запросить у пользователя имя документа.
$word->Documents[l]->Save;
|
Вообще то задача не стоит сохранить этот документ на сервере, а передать его клиенту. Возможно, что без сохранения на сервере не обойтись, тогда буду признателен, если напишите правильный формат данной строки. | |
|
|
|
|
|
|
|
для: Gust
(04.04.2007 в 19:05)
| | >Нашел скрипт, основанный на СОМ, для записи данных в ворд
такая методика позволяет работать с вордом на серверной машине, но никак не на клиентской. | |
|
|
|
|
|
|
|
для: Trianon
(04.04.2007 в 19:15)
| | >такая методика позволяет работать с вордом на серверной машине, но никак не на клиентской.
полагаю что такую задачу можно решить таким путем:
1. php-скрипт формирует данные и загружает их в документ ворд (это я знаю как сделать)
2. тем же скриптом документ сохраняется на серверной машине (полагаю что надо использовать строку типа $word->Documents[l]->Save ("C:\report.doc"); ??)
3. вернуть клиенту ссылку на этот файл, скажем http:/url/report.doc,
3а. хотя хотелось бы чтобы скрипт вернул сразу этот файл, т.е. предложил клиенту открыть или сохранить его
4. и после всего, по возможности, скрипт должен удалить этот документ с сервера
Такое возможно? Если да,тогда как можно реализовать п. 3а? | |
|
|
|
|
|
|
|
для: Gust
(04.04.2007 в 19:34)
| | Все правильно понимаешь. Именно так и нужно. А после сохранения в файл, отправляешь его сразу заголовками пользователю.
$flurl="c://report.doc"; //сам файл
header("Content-Type: application/word"); // Отправляем тип файла.
header("Content-Disposition: attachment; filename=" . basename($flurl)); // Отправляем его имя.
header("Content-Length: " . filesize($flurl)); // Отправляем его размер.
header("Content-Transfer-Encoding: binary");
readfile($flurl); // Считывание файла для сохранения.
|
| |
|
|
|
|
|
|
|
для: Gust
(04.04.2007 в 19:34)
| | работать такой подход будет лишь на виндовом хостинге при установленном офисе.
Ну и на локалке - но это же не спасет... | |
|
|
|
|
|
|
|
для: Trianon
(04.04.2007 в 21:03)
| | А с com объектами на другом хостинге и не поработаешь. Есть правда для Word Excel отдельные библы для *nix-овских хостов, но я с ними не разбирался. | |
|
|
|
|
|
|
|
для: Trianon
(04.04.2007 в 21:03)
| | >работать такой подход будет лишь на виндовом хостинге при установленном офисе.
>Ну и на локалке - но это же не спасет...
Спасет, как раз эта ситуация - для корпоративной сети организации.
Спасибо XPraptor за заголовки, буду пробывать. | |
|
|
|
|
|
|
|
для: Gust
(05.04.2007 в 10:39)
| | Попробывал, в браузер выводится что типа:
РПаЎ±б>юя "$юяяя!яяяяяяяяяяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяяяяя
......яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяя
яяяяяяяяяяяямҐБ#`рїbjbj5G5G.W-W-яяяяяя¤°°°°°°°кBBBB N ю
ffffffffЉЊЊЊЊЊЊ$Бh)L°°fffff°°°ffЕffff°f°fЉffЉff°°ffZ pъ”bSwЗBffЉ
Ы0 fufufu°f$ffffffff°°ffff ffffюююDBюююBДШж°°°°°°яяяя B......
|
Вот мой скрипт:
<?
$word=new COM("word.application") ;
$word->Documents->Add();
$word->Selection->TypeText("Отчет\n");
$word->Documents[1]->SaveAs ("С:/rep1.doc");
$word->Quit();
$flurl="С:/rep1.doc"; //сам файл
header("Content-Type: application/word"); // Отправляем тип файла.
header("Content-Disposition: attachment; filename=" . basename($flurl)); // Отправляем его имя.
header("Content-Length: " . filesize($flurl)); // Отправляем его размер.
header("Content-Transfer-Encoding: binary");
readfile($flurl); // Считывание файла для сохранения.
?>
|
Может что-нить еще надо указать, чтоб при у пользователя при запросе этого скрипта выскочил диалог "Открыть или Сохранить файл"? | |
|
|
|
|
|
|
|
для: Gust
(05.04.2007 в 11:54)
| | Функцию readfile лучше заменить на связку fopen+fpassthru
Заголовок Content-Transfer-Encoding - исключить - это почтовый заголовок, а не http-шный.
Имя файла пробублировать в атрибуте name поля Content-type, в котором (могу путать) правильный тип всё ж application/msword.
Имена файлов должны быть заключены в кавычки. | |
|
|
|
|
|
|
|
для: Trianon
(05.04.2007 в 12:39)
| | Я сделал так (вместо заголовков):
//-начало скрипта--
...
$word->Quit();?>
<head>
<meta http-equiv="Refresh" content="0; url=http://url/rep1.doc">
</head>
|
Получилось то что хотел.
Возникла проблема с удалением файла. Unlink() в том же скрипте не хочет удалять файл. | |
|
|
|
|
|
|
|
для: Gust
(05.04.2007 в 13:42)
| | Ты видишь код тела файла потому что у тебя Windows XP SP2. Это задокументированный баг. Чихать она хотела на все заголовки. Приходится получать файлы путем правой мыши и 'сохранить объект как....'
На счет Unlink - ты сначала должен отдать файл, а потом удалить. А ты скорее асего путаешся его удалить когда он еще занят процессом выгрузки к юзеру. Либо таймаут поставь, либо введи цикл sleep(1) пока не освободится файл для монопольного использования. | |
|
|
|