Форумы УГМК-Телеком

Пожалуйста, войдите или зарегистрируйтесь.

Расширенный поиск  

Новости:

Добро пожаловать на форум!

Автор Тема: Экспорт из PHP в Excel  (Прочитано 24198 раз)

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Экспорт из PHP в Excel
« : 30 Октября 2011, 09:48:41 »

У многих, с течением времени возникает потребность выгружать данные с сайта (Базы данных, далее БД) в Эксель. В примитивных вариантах выручает возможность Экселя записывать в разные столбцы данные разделённые табулятором, нам остаётся только сохранить на диске текстовый файл с расширением .xls и перенаправить (лучше открыть ещё одно окно) браузер(а) на этот файл с высылкой заголовков для Экселя, например так (далее расскажу как это действо сделать через PHP с использованием самого Эксель, и без него, но на выходе будет не текстовый файл, а Экселевский, т.е. с форматированием ячеек):

http://www.kompvp.ru/test/index.php:
<?php
   //Определяем массив выгружаемых данных в примере состоящий из имени и количества
   $name[0]="Name1";
   $name[1]="Name2";
   $name[2]="Name3";
   
   $kol[0]=56;
   $kol[1]=22;
   $kol[2]=37;

//Записываем данные в файл (имя файла ‘filename‘ в примере будет = количеству секунд с 01.01.1970г., это для того чтобы было легко удалять невостребованные файлы по истечении срока старения, например через 1 час, т.е. 60сек. Х 60мин. = 360 сек., но об этом как ни будь позже и наверное в отдельно топе т.к. вариантов удаления по времени старения тоже есть несколько.)
   $filename=time();
   
   $file=fopen("tmp/".$filename.".xls", "w");
   for($i=0; $i < count($name); $i++)
   {
      //chr(9) - табулято, chr(13).chr(10) - виртуальный Ентер
      fputs($file, $name[$i].chr(9).$kol[$i].chr(13).chr(10));
   }
//Открываем новое окно, в которое передаём методов GET имя файла для открытия в экселе
$exfile="'http://www.kompvp.ru/test/xls.php?file=".$filename."', '', config='height=10,width=10,scrollbars=1,location=0'";                     ?>
   <script>
   window.open(<?php echo $exfile; ?>);
   </script>

http://www.kompvp.ru/test/xls.php:
<?php
   //Проверяем есть ли переменная file
if(@$file<>"")
   {
      //Проверяем есть ли файл в папке tmp с именем file и расширением .xls
if(is_file("tmp/".$file.".xls")=="1")
      {
         //Высылаем нужные заголовки, для открытия файла в Экселе
         header("Content-Type: application/x-msexcel; name='".$file."'");
         header("Content-Disposition: inline; filename=".$file);
         //Читаем файл и отправляем клиенту в Эксель
         $fh=fopen("tmp/".$file.".xls", "rb");
         fpassthru($fh);
      }
   }
?>
Далее попробуем сваять экспорт данных в Эксель средствами Экселя (он должен быть установлен на компе).
http://www.kompvp.ru/test/ - заменить на свой хост.
« Последнее редактирование: 30 Октября 2011, 09:53:12 от kompvp »
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Экспорт из PHP в Excel
« Ответ #1 : 30 Октября 2011, 10:06:48 »

<?php
   //Откроем COM объект Excel
   $book = new COM("Excel.Application");
   //Уберём отображение приложения на экране т.к. нам нужно чёта том наваять в фоновом режиме, сохранить файл и отправить заголовки и ссылку на него клиенту
   $book->Visible = false;
   $book->DisplayAlerts = false;
?>
В результате этого скрипта многие видят такую ошибку: Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `Excel.Application': Отказано в доступе.
И на этом забивают на использование COM объектов, между тем их использование позволяет юзать средствами PHP практически любое приложение установленное в Винде. Поэтому сейчас разберёмся с этой ошибкой и будем юзать наш Эксель.

Начнём с того, что клиент посещающий наш ресурс имеет права «Гостевая учетная запись в Интернете» т.е. по сути Гостевые права, а установленный в системе софт ставился Админом и по умолчанию имеет права доступа Админу и Пользователю, т.к. Гость по боку вот и получаем в тексте ошибки кроме всего прочего и «Отказано в доступе». Вылечивается это так ….. продолжение следует.
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Re: Экспорт из PHP в Excel
« Ответ #2 : 30 Октября 2011, 10:12:08 »

Откроем Панель управления -> Администрирование -> Службы компонентов
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Re: Экспорт из PHP в Excel
« Ответ #3 : 30 Октября 2011, 10:19:55 »

Находим компонент Excel у меня в Windows Server 2008 он находится тут, у Вас может в другом месте, но не отчаивайтесь и поищите в "Службы компонентов" и выберете свойства.
« Последнее редактирование: 30 Октября 2011, 10:48:22 от kompvp »
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Re: Экспорт из PHP в Excel
« Ответ #4 : 30 Октября 2011, 10:53:52 »

В открывшимся окне на закладке "Безопасность" поставьте точечки на "Настроить" и кнопками Добавить (2) -> Дополнительно (3) -> Поиск (4) добавьте Группы: "Гость"; "IIS_IUSRS"; пользователя "Гость" и пользователь "IUSR_Ваш компьютер"
« Последнее редактирование: 30 Октября 2011, 20:46:55 от kompvp »
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Re: Экспорт из PHP в Excel
« Ответ #5 : 30 Октября 2011, 10:56:10 »

Перебирая в верхнем списке добавленные записи в нижнем поставьте галки как на рисунке
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Re: Экспорт из PHP в Excel
« Ответ #6 : 30 Октября 2011, 11:45:59 »

После этого у вас всё должно заработать, если что то не так - пишите!!!

Примеры программного интерфейса можно посмотреть нга http://www.spravkaweb.ru/php/sovet/excelcom или укажите в запросе любого поисковика "new COM("Excel.Application");" и прогуляйтесь по ссылкам.

окончание любого ваяния, т.е. скрипта экспорта в Эксель будет выглядеть так:
// Сохраняем как новый документ - от туда и выбрасываем в инет
   $book->Workbooks[1]->SaveAs("F:\\WEB\\http\\test\\tmp\\".$filename.".xls");
   // Выходим из Экселя
   $book->Quit();
   
   $filename=time();
   //Дальше как и в прошлов примере откроем новое окно с темже файлом xls.php (его содержание не изменилось)
   $exfile="'http://www.kompvp.ru/test/xls.php?file=".$filename."', '', config='height=10,width=10,scrollbars=1,location=0'";
   ?>
      <script>
         window.open(<? echo $exfile; ?>);
      </script>
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Re: Экспорт из PHP в Excel
« Ответ #7 : 30 Октября 2011, 11:53:16 »

А как быть у кого на серваке нет Экселя? Но нужен форматированный Экселевский файл при экспорте (например линуксоидам), хоть и COM объекты можно импортировать в любую операционную среду, я рассмотрю вариант Экселя без Экселя.
Записан

kompvp

  • Неосвоившийся
  • *
  • Оффлайн Оффлайн
  • Сообщений: 47
  • В жизни я хуже
    • ICQ клиент - 359504365
    • Просмотр профиля
    • Компьютеры Верхней Пышмы
    • E-mail
Re: Экспорт из PHP в Excel
« Ответ #8 : 31 Октября 2011, 22:57:10 »

Понадобится пакет Spreadsheet_Excel_Writer (спасибо разработчику), он инсталируется в PHP через PEAR, самое простое скачать с www.kompvp.ru/Spreadsheet.rar (домен kompvp.ru зарегин на мой домашний комп, потому если чё не качается - просто комп выключен, или прошло много лет и я уже все это поудалял - нужно искать в Инете). И выложить в вашу папку с PHP (при условии что Вы установили PEAR, т.е. запусками файл go-pear.bat и отвечали там на вопросы), а потом запустить файл Spreadsheet.bat который инсталлирует в систему Spreadsheet_Excel_Writer.

файл index.php (у меня на компе это http://www.kompvp.ru/test/index1.php)

<?php
//Получаем данные
   $name[0]="Name1";
   $name[1]="Name2";
   $name[2]="Name3";
   
   $kol[0]=56;
   $kol[1]=22;
   $kol[2]=37;
   
   //Имя файла
   $filename=time();
   
   //Внедрение PEAR::Spreadsheet_Excel_Writer по факту расположен в папке с PHP\PEAR\Spreadsheet\Excel
   include_once("Spreadsheet/Excel/Writer.php");
   
   //Создаём книгу Excel
   $xls =& new Spreadsheet_Excel_Writer('./tmp/'.$filename.'.xls');
   
   //указываем папку в которую будем сохранять файл, т.е. в каталоге где лежит индексный файл есть папка tmp (разумеется с полным доступом для гостей)
   $xls->setTempDir('./tmp');
   
   // Добавление листа к файлу с именем текущей датой (это в низу листа надпись)
   $sheet =& $xls->addWorksheet(date("d.m.Y"));
   
   //Заблокируем верхние 2 строки от прокрутки т.к. там будут заголовки
   $sheet->freezePanes(array(2, 0));
   
   //Зададим ширину колонок (установим для верхней строки = 0)
   $sheet->setColumn(0, 0, 45);//Ширина 1 колонки
   $sheet->setColumn(0, 1, 20);//Ширина 2 колонки
   
   //Создадим формат для заголовка
   $header =& $xls->addFormat();
   $header->setColor('black');//white black Цвет шрифта
   $header->setAlign('center');//Расположение в ячейке
   $header->setBold();//Жирным
   $header->setSize('12');//размер шрифта
   
   //Создадим формат для под заголовка. т.е. и шрифт по меньше и не жирным
   $podheader =& $xls->addFormat();
   $podheader->setColor('black');//white black Цвет шрифта
   $podheader->setAlign('center');//Расположение в ячейке
   $podheader->setSize('10');//размер шрифта
   
   //Для цифр, чтоб с права печатались
   $number =& $xls->addFormat();
   $number->setAlign('right');//Расположение в ячейке
   
   //Заголовок для дальнейшего оббъеденения сделаем одинаковый формат (header) в ячейках которые будем сливать вместе
   $sheet->write(0,0, "Выгрузка", $header);
   $sheet->write(0,1, "", $header);
   
   //Объеденим 2 ячейки с адресами: колока=0, строка=0 и колонка=0, строка=1
   $sheet->mergeCells(0, 0, 0, 1);
   
   //Подзаголовки
   $sheet->write(1,0, "Наименование", $podheader);
   $sheet->write(1,1, "Количество", $podheader);
   
   //Пишем наш массив
   
   for ( $i=0; $i < count($name); $i++ )
   {
       $sheet->write(($i+2),0, $name[$i]);
       //С форматом number
       $sheet->write(($i+2),1, $kol[$i], $number);
   }
   //Конец листа
   $xls->close();
   
   //Дальше как и в прошлом примере откроем новое окно с темже файлом xls.php (его содержание не изменилось)
   $exfile="'http://www.kompvp.ru/test/xls.php?file=".$filename."', '', config='height=10,width=10,scrollbars=1,location=0'";
   ?>
      <script>
         window.open(<? echo $exfile; ?>);
      </script>
Записан