За последние 24 часа нас посетили 17690 программистов и 1723 робота. Сейчас ищут 882 программиста ...

И снова Excel

Тема в разделе "Прочие вопросы по PHP", создана пользователем engager, 22 окт 2009.

  1. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Здравствуйте.
    Знаю, что много раз обсуждалось, но тем не менее, если у вас есть ответ на мой вопрос, чиркните хотя бы пару слов ))
    Интересует импорт/экспорт (парсинг/генерация) excel файлов.
    Нашел несколько компонентов:

    Zakkis.PHP.Excel.Parser.Pro.v4.5 - отличный парсинг. понимает все экселевские форматы до 2007 офиса.
    Одна беда - для генерирования эксел-файла не годится.

    PHPExcel - мощный компонент. Только, насколько я понял, он как раз таки понимает только формат 2007 офиса.
    К тому же, говорят, памяти дофига жрёт, поскольку создаёт кучу объектов для каждого элемента.

    Spreadsheet_Excel_Writer - лёгкий компонент, но понимает только Excel 5.0

    Кто, что скажет?
    Можно, конечно, и все эти компоненты использовать, но может есть что-то пофункциональнее вашеперечисленного?
     
  2. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    и снова PHPExcel
     
  3. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Он работает с ранними форматами?
     
  4. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Он умеет Excel 2003, Excel-2007, CSV, acrobat, html, xml и из одного в другой туда и обратно благодаря своей архитектуре, может еще что-то добавили. он постоянно расширяется. хорошая оо-архитектура. легко расширяется. я добавил свой ПДО- ридер и апгрейдил райтер для эксель 2007 на раз.

    Парсить умеет быстро если включать режим чтения реадДатаОнли, лучше всего работает с 2007 экселем во всем. В 2003 почти недоступно графическое оформление. Но парсит все так же лихо. Дока очень хороша.

    Во время генерации памяти жрет много. это да. сам проверял. зато время экономит. а время дороже.

    кстати в "программирование на пхп" не помешало бы открыть постоянную тему "PHP Excel". или это тоже лишнее?
     
  5. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Ок, убедил ))
    Если еще кто выскажется, буду премного благодарен.
     
  6. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Вопросик в догонку по PHPExcel...
    Он умеет парсить файл из реквеста и писать в респонс?

    Так... как в респонс писать - оказалось дело нехитрое...
    Теперь, как читать...
     
  7. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    А как узнать Content-Length?
    Объем данных, занимаемых сгенеренным файлом?
     
  8. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Про ленгх не знаю. Если собираешься отправлять пользователю файло, можешь вместо Excel2007Writer использовать мой райтер. Он по send() отправляет пользователю файл так, что бы он открывался в окне экселя, а не в окне браузера.

    PHP:
    1. <?php
    2. require_once 'PHPExcel/Writer/Excel2007.php';
    3.    
    4. class PHPExcel_Writer_Excel2007Ex extends PHPExcel_Writer_Excel2007{
    5.     /**
    6.      *
    7.      * @param string $fileName имя файла с расширением
    8.     */
    9.     public function send($pFilename = 'безымянный.xlsx'){
    10.         header("Expires: 0");
    11.         header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    12.         header("Content-Type: application/force-download");
    13.         header("Content-Type: application/octet-stream");
    14.         header("Content-Type: application/download");
    15.         header("Content-Disposition: attachment;filename={$pFilename}");
    16.         header("Content-Transfer-Encoding: binary ");
    17.         $this->save('php://output');
    18.     }
    19. }
     
  9. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    alexey_baranov
    спасибо.
    этот трик я знаю, просто пока лень было искать в загашниках))

    мда, походу ленгх не определить никак, кроме как сохранять на диск, потом вычитывать размер, чего совсем не хотелось бы.
    ну или ползти в код ПХПекселя, что тодже не айс)
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Брр. А он содержимое файла как строку не отдает никак?

    Взял содержимое и померял strlen()
     
  11. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Никак не отдаёт.
    Максимум может отдать сериализованный объект PHPExcel в виде xml.
     
  12. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    если очень надо, спроси на форуме проекта в пендостане. должно быть какое-то традиционное решение.

    мне на ум приходить только предварительное сохранение или поиграться с буфером как то так

    PHP:
    1. <?php
    2. $writer->save('php//output');
    3. $Content-Length= ob_size();
    4.  
    5. //пошли заголовки, включая Content-Length
    6.  
     
  13. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    ок, тханкс)
    еще такой момент...
    Charset...
    Блин, такой аццкий компонент, столько кода, а таких нужных вещей, как парсинг из пост-параметра, размер файла и кодировка отсутствуют.
    У меня на виртуалхосте указана кодировка UTF-8. Не знаю, правда, с этим ли связано, что этот компонент выдает CSV файлы в УТФе...
    Как это победить?
     
  14. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    когда я впервые взял ПХПЭксель, тоже маялся с кодировкой. На пендосском форуме даже где-то есть мои темы "сделайте свойство $encoding". Но пендосы были неумолимы. Пришлось все гонять четер иконв() туда-сюда. Потом c точно такой же проблемой я столкнулся в AD. Потом в веб-сервисах. Если писать сразу в utf-8, можно сэкономить много времени и сил.

    Так что UTF не надо побеждать. на него надо переходить.

    а это что такое?
     
  15. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    неудачно выразился)) я имел в виду, открывать он умеет только физический файл на диске, а хотелось бы иметь возможность давать ему на парсинг файл, который зааплоадили по хттп, то есть из реквеста. ну хоть писать в респонс можно, и то гут.
    или я не прав?

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