Часто задаваемые вопросы по PHPExcel
После выхода статей по работе с PHPExcel (Создание Excel-файлов с помощью PHPExcel и Чтение Excel-файлов с помощью PHPExcel) в комментариях было задано множество вопросов по работе с библиотекой PHPExcel. Сегодня я собрал вместе наиболее часто задаваемые вопросы в этой статье. Спасибо всем посетителям, которые задавали вопросы в комментариях.
1.Создаю Excel-файл с помощью PHPExcel. Вся кириллица отображается кракозяблами или не отображается вообще. В чем может быть проблема?
Проблема в том, что библиотека PHPExcel работает только с utf-8. Внимательно проверьте кодировку текста, который вы вставляете в ячейки. Если она отлична от utf-8, то обязательно перекодируйте с помощью функции mb_convert_encoding или iconv.
2.Можно ли вставить рисунок в ячейку?
Да, конечно можно. Для этих целей в библиотеке PHPExcel есть класс PHPExcel_Worksheet_Drawing. Вот пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $iDrowing = new PHPExcel_Worksheet_Drawing(); //берем рисунок $iDrowing->setPath(‘img.jpeg’); //устанавливаем ячейку $iDrowing->setCoordinates(‘A3′); //устанавливаем смещение X и Y $iDrowing->setOffsetX(50); $iDrowing->setOffsetY(50); //помещаем на лист $iDrowing->setWorksheet($objPHPExcel->getActiveSheet()); |
Также есть класс PHPExcel_Worksheet_MemoryDrawing, с помощью которого можно вставлять ресурсы GD. Это делается с помощью метода setImageResource. Вот пример из документации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Generate an image $gdImage = @imagecreatetruecolor(120, 20) or die(‘Cannot Initialize new GD image stream’); $textColor = imagecolorallocate($gdImage, 255, 255, 255); imagestring($gdImage, 1, 5, 5, ‘Created with PHPExcel’, $textColor); // Add a drawing to the worksheet $objDrawing = new PHPExcel_Worksheet_MemoryDrawing(); $objDrawing->setName(‘Sample image’); $objDrawing->setDescription(‘Sample image’); $objDrawing->setImageResource($gdImage); $objDrawing->setRenderingFunction( PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG); $objDrawing->setMimeType( PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT); $objDrawing->setHeight(36); $objDrawing->setWorksheet($objPHPExcel->getActiveSheet()); |
3.А как же ширина и высота в рисунке? Я выставляю $objDrawing->setHeight(36), но рисунок еще расползается на 30-40%.
По умолчанию для рисунков устанавливается пропорциональные размеры для высоты и ширины. Отсюда и появляются размеры чуть большие, чем указаны. Отключить эту функциональность можно, вызвав
1 | $objDrawing->setResizeProportional(false); |
Перед установкой ширины или высоты.
4.У меня возникает ошибка Fatal error: Uncaught exception ‘Exception’ with message ‘Cloning a Singleton is not allowed!’
Вам нужно отключить опцию zend.ze1_compatibility_mode. Для этого в конфигурационном файле php.ini нужно найти строку
zend.ze1_compatibility_mode = On
и заменить On на Off
Если нет доступа к конфигурационному файлу, то можно отключить в скрипте, написав в начале
1 2 3 | <?php ini_set('zend.ze1_compatibility_mode', '0'); … |
5.Текст в ячейке расползается на несколько ячеек, хотя вставляю символы \n и \r\n. Как сделать перенос?
Перенос текста в ячейке по умолчанию отключен. Включить его можно так
1 | $aSheet->getStyle(‘C7′)->getAlignment()->setWrapText(true); |
Где $aSheet – активный лист, а C7 – нужная ячейка.
После того, как поддержка переноса будет включена, перенос будет вставляться символом \n (ASCII-символ под номером 10).
1 2 | $aSheet->setCellValue(‘C7′,”Строка1\nСтрока2″); $aSheet->getStyle(‘C7′)->getAlignment()->setWrapText(true); |
6.Возникает ошибка с текстом Fatal error: Uncaught exception ‘Exception’ with message ‘Multibyte string function overloading in PHP must be disabled.’.
Эта ошибка возникает, когда включена перегрузка строковых функций, соответствующими функциями из расширения mb_string. Для отключения этого режима нужно в конфигурационном файле php.ini установить опцию mbstring.func_overload в off.
7.Как задать стиль рамки для ячейки?
В классе PHPExcel_Style_Border есть константы, которые можно использовать для установки стилей. Например:
1 2 3 4 5 6 7 8 9 | $styleArray = array( ‘borders’ => array( ‘outline’ => array( ’style’ => PHPExcel_Style_Border::BORDER_THICK, ‘color’ => array(‘argb’ => ‘FFFF0000’), ), ), ); $aSheet->getStyle(‘A1:B3’)->applyFromArray($styleArray); |
Вот список констант, которые можно использовать
PHPExcel_Style_Border::BORDER_NONE
PHPExcel_Style_Border::BORDER_THIN
PHPExcel_Style_Border::BORDER_MEDIUM
PHPExcel_Style_Border::BORDER_DASHED
PHPExcel_Style_Border::BORDER_DOTTED
PHPExcel_Style_Border::BORDER_THICK
PHPExcel_Style_Border::BORDER_DOUBLE
PHPExcel_Style_Border::BORDER_HAIR
PHPExcel_Style_Border::BORDER_MEDIUMDASHED
PHPExcel_Style_Border::BORDER_DASHDOT
PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT
PHPExcel_Style_Border::BORDER_DASHDOTDOT
PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT
PHPExcel_Style_Border::BORDER_SLANTDASHDOT
8. Делаю расчеты с помощью PHPExcel: ввожу в ячейки данные, а потом считываю результат расчетов из соответствующей ячейки. После чего ввожу в ячейки другие данные, а результат расчетов не изменяется. В чем может быть проблема?
Проблема в том, что все данные расчетов кэшируются. Это сделано для увеличения скорости расчетов и уменьшения используемой памяти. Чтобы все расчеты срабатывали правильно, нужно перед каждым, кроме первого, сбрасывать кэш расчетов следующим образом:
1 2 3 4 5 6 | //Здесь первый расчет .... //после чего сбрасываем кэш PHPExcel_Calculation::getInstance()->clearCalculationCache(); //здесь второй расчет .... |
9. При обработке файлов с большим количеством данных появляется ошибка Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in …
Проблема состоит в том, что PHP имеет ограниченное кол-во памяти и это строго контролируется интерпретатором. PHPExcel требует очень много памяти для обработки данных, поэтому при чтении больших файлов может появляться такого рода ошибка.
Если у вас есть доступ к настройкам PHP, то просто увеличьте размер памяти.
Если нет, то можно разбить файл на две части и обрабатывать их отдельно.
На данный момент это большая часть часто задаваемых вопросов. По мере поступления новых вопросов, буду добавлять их сюда.
Читайте все статьи цикла:
- Создание Excel-файлов с помощью PHPExcel
- Чтение Excel-файлов с помощью PHPExcel
- Часто задаваемые вопросы по PHPExcel
Популярность: 40%
Интересное из других блогов:
2leep.comИ не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта
Автор: Kron0S, 17 мая 2010 в 16:44
используетСпасибо за статью. Да и вообще хорошая библиотека, узнал о ней именно с вашего блога
Автор: web-junior, 17 мая 2010 в 17:00
используетПожалуйста! Заходите еще
Автор: dobeerman, 18 мая 2010 в 00:42
использует//ложим на лист
КЛАДЕМ !!! или уж в даном случае “помещаем на лист”
Автор: web-junior, 18 мая 2010 в 12:54
используетСпасибо за замечание! Действительно в данном случае имеется в виду “помещаем на лист”. Сейчас исправлю.
Но! По моему мнению, слова “ложить” и “класть” являются синонимами и вполне могут быть взаимозаменяемыми.
Автор: dobeerman, 18 мая 2010 в 12:59
используетв русском языке нет слова “ложить”.
Автор: web-junior, 18 мая 2010 в 13:04
используетПозволю себе не согласиться с вами, поскольку большинство толковых словарей имеют толкование слова “ложить”
http://www.vseslovari.com.ua/dal2/page/lojit.16159
Автор: dobeerman, 18 мая 2010 в 13:08
используетхоть наша с Вами дискуссия оффтоп, позволю себе продолжить:
Глагол “ложить” в русском языке есть, просто его употребление считается не соответствующем лексическим нормам современного русского языка. В этом значение рекомендуется употреблять глагол “класть”. Что касается остальных глаголов, то они являются нормативными и образуют следующие видовые пары: “сложить” / “складывать” и “сладить” / “слаживать”
Автор: web-junior, 18 мая 2010 в 13:25
используетПонятно, спасибо.
К сожалению, у меня нет специального литературного образования, а со школы остались только основы. Поэтому подобные ошибки, наверное, неизбежны.
Но я постараюсь приложить максимум усилий, чтобы они не повторялись.
Автор: dobeerman, 18 мая 2010 в 13:27
используеткстати, за разъяснения PHPExcel спасибо
теперь я его меньше боюсь
Автор: web-junior, 18 мая 2010 в 13:33
используетпожалуйста, заходите ещё
Автор: BOLVERIN, 18 мая 2010 в 23:04
используетполезная либа. пригодится
Автор: Bagration, 2 июля 2010 в 12:31
используетНе работает перенос строк в ячейке по данному примеру. В самой ячейке просто выводится символ перевода. Что может быть не так ?
А за статью, огромное спасибо!
Автор: web-junior, 5 июля 2010 в 14:22
используетСкорее всего вы в одинарных кавычках вставляете символ перевода. Для того, чтобы символ перевода вставился корректно, нужно вставлять в двойных кавычках как в примере.
Автор: Виталий, 3 июля 2010 в 18:24
используетПривет !
Есть вопрос по библиотеке, схожий с первым вопросом: я читаю файл, и вывожу его. Но вместо кириллицы, которая находится в файле, получаю кракозябры. Что это может быть ?
Автор: web-junior, 5 июля 2010 в 14:26
используетДобрый день!
Скорее всего кодировка страницы не совпадает с кодировкой файла, который вы читаете. Поэтому вам нужно либо изменить кодировку страницы либо преобразовывать в кириллицу, находящуюся в файле на лету при выводе.
Автор: sl4mmer, 14 июля 2010 в 16:22
используетДобрый день. Спасибо за отличные материалы. У меня такой вопрос: я читаю файл шаблона построчно, но допустим в столбцах A B C F G у меня данные столбцы D и E у меня местами пустые – и там где они пусты строка читаеться только до столбца C, как сделать чтобы строка читалась полностью, вместе с пустыми ячейками?
Автор: web-junior, 19 июля 2010 в 13:47
используетУ итератор ячеек PHPExcel_Worksheet_CellIterator есть метод setIterateOnlyExistingCells, вызвав который и передав ему false так:
можно заставить итератор отображать и пустые ячейки.
Автор: sl4mmer, 20 июля 2010 в 01:49
используетЕще раз Здравствуйте. Как можно сделать чтобы поля в которых есть формула перед тем как взять из них значение интерпретировались?
Автор: web-junior, 22 июля 2010 в 10:01
используетДобрый день!
У класса ячеек (PHPExcel_Cell) есть два метода для получения значений:
- getValue(), который возвращает содержимое ячейки
- getCalculatedValue(), который возвращает расчитанное по формулам содержимое ячейки
Для корректного расчета значений достаточно использовать метод getCalculatedValue()