Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сом+Word+PHP
 
 автор: Gust   (04.04.2007 в 19:05)   письмо автору
 
 

Задача: на 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. Подскажите, как мне сделать вывод сформированного документа на клиентской машине?

   
 
 автор: ddhvvn   (04.04.2007 в 19:07)   письмо автору
 
   для: Gust   (04.04.2007 в 19:05)
 

Вы выполняете Save, но не указываете имя файла!
Куда же он по-вашему должен записывать результат?!

   
 
 автор: Gust   (04.04.2007 в 19:15)   письмо автору
 
   для: ddhvvn   (04.04.2007 в 19:07)
 

Вот и я не пойму. Скрипт не мой, нашел в инете, и именно с таким комментарием

// Запросить у пользователя имя документа.
$word->Documents[l]->Save;

Вообще то задача не стоит сохранить этот документ на сервере, а передать его клиенту. Возможно, что без сохранения на сервере не обойтись, тогда буду признателен, если напишите правильный формат данной строки.

   
 
 автор: Trianon   (04.04.2007 в 19:15)   письмо автору
 
   для: Gust   (04.04.2007 в 19:05)
 

>Нашел скрипт, основанный на СОМ, для записи данных в ворд
такая методика позволяет работать с вордом на серверной машине, но никак не на клиентской.

   
 
 автор: Gust   (04.04.2007 в 19:34)   письмо автору
 
   для: Trianon   (04.04.2007 в 19:15)
 

>такая методика позволяет работать с вордом на серверной машине, но никак не на клиентской.
полагаю что такую задачу можно решить таким путем:
1. php-скрипт формирует данные и загружает их в документ ворд (это я знаю как сделать)
2. тем же скриптом документ сохраняется на серверной машине (полагаю что надо использовать строку типа $word->Documents[l]->Save ("C:\report.doc"); ??)
3. вернуть клиенту ссылку на этот файл, скажем http:/url/report.doc,
3а. хотя хотелось бы чтобы скрипт вернул сразу этот файл, т.е. предложил клиенту открыть или сохранить его
4. и после всего, по возможности, скрипт должен удалить этот документ с сервера

Такое возможно? Если да,тогда как можно реализовать п. 3а?

   
 
 автор: XPraptor   (04.04.2007 в 20:26)   письмо автору
 
   для: 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); // Считывание файла для сохранения. 

   
 
 автор: Trianon   (04.04.2007 в 21:03)   письмо автору
 
   для: Gust   (04.04.2007 в 19:34)
 

работать такой подход будет лишь на виндовом хостинге при установленном офисе.
Ну и на локалке - но это же не спасет...

   
 
 автор: XPraptor   (04.04.2007 в 21:08)   письмо автору
 
   для: Trianon   (04.04.2007 в 21:03)
 

А с com объектами на другом хостинге и не поработаешь. Есть правда для Word Excel отдельные библы для *nix-овских хостов, но я с ними не разбирался.

   
 
 автор: Gust   (05.04.2007 в 10:39)   письмо автору
 
   для: Trianon   (04.04.2007 в 21:03)
 

>работать такой подход будет лишь на виндовом хостинге при установленном офисе.
>Ну и на локалке - но это же не спасет...
Спасет, как раз эта ситуация - для корпоративной сети организации.
Спасибо XPraptor за заголовки, буду пробывать.

   
 
 автор: Gust   (05.04.2007 в 11:54)   письмо автору
 
   для: 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); // Считывание файла для сохранения.
?>


Может что-нить еще надо указать, чтоб при у пользователя при запросе этого скрипта выскочил диалог "Открыть или Сохранить файл"?

   
 
 автор: Trianon   (05.04.2007 в 12:39)   письмо автору
 
   для: Gust   (05.04.2007 в 11:54)
 

Функцию readfile лучше заменить на связку fopen+fpassthru
Заголовок Content-Transfer-Encoding - исключить - это почтовый заголовок, а не http-шный.
Имя файла пробублировать в атрибуте name поля Content-type, в котором (могу путать) правильный тип всё ж application/msword.
Имена файлов должны быть заключены в кавычки.

   
 
 автор: Gust   (05.04.2007 в 13:42)   письмо автору
 
   для: Trianon   (05.04.2007 в 12:39)
 

Я сделал так (вместо заголовков):

//-начало скрипта--
...
$word->Quit();?>
<head>
<meta http-equiv="Refresh" content="0; url=http://url/rep1.doc">
</head>

Получилось то что хотел.
Возникла проблема с удалением файла. Unlink() в том же скрипте не хочет удалять файл.

   
 
 автор: XPraptor   (06.04.2007 в 02:27)   письмо автору
 
   для: Gust   (05.04.2007 в 13:42)
 

Ты видишь код тела файла потому что у тебя Windows XP SP2. Это задокументированный баг. Чихать она хотела на все заголовки. Приходится получать файлы путем правой мыши и 'сохранить объект как....'

На счет Unlink - ты сначала должен отдать файл, а потом удалить. А ты скорее асего путаешся его удалить когда он еще занят процессом выгрузки к юзеру. Либо таймаут поставь, либо введи цикл sleep(1) пока не освободится файл для монопольного использования.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования