Часто задаваемые вопросы по PHPExcel
После выхода статей по работе с PHPExcel (Создание Excel-файлов с помощью PHPExcel и Чтение Excel-файлов с помощью PHPExcel) в комментариях было задано множество вопросов по работе с библиотекой PHPExcel. Сегодня я собрал вместе наиболее часто задаваемые вопросы в этой статье. Спасибо всем посетителям, которые задавали вопросы в комментариях.
1.Создаю Excel-файл с помощью PHPExcel. Вся кириллица отображается кракозяблами или не отображается вообще. В чем может быть проблема?
Проблема в том, что библиотека PHPExcel работает только с utf-8. Внимательно проверьте кодировку текста, который вы вставляете в ячейки. Если она отлична от utf-8, то обязательно перекодируйте с помощью функции mb_convert_encoding или iconv.
2.Как вставлять русские формулы?
Об этом разъяснено в статье Кириллические формулы в PHPExcel
3.Можно ли вставить рисунок в ячейку?
Да, конечно можно. Для этих целей в библиотеке 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()); |
4.А как же ширина и высота в рисунке? Я выставляю $objDrawing->setHeight(36), но рисунок еще расползается на 30-40%.
По умолчанию для рисунков устанавливается пропорциональные размеры для высоты и ширины. Отсюда и появляются размеры чуть большие, чем указаны. Отключить эту функциональность можно, вызвав
1 | $objDrawing->setResizeProportional(false); |
Перед установкой ширины или высоты.
5.У меня возникает ошибка 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'); … |
6.Текст в ячейке расползается на несколько ячеек, хотя вставляю символы \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); |
7.Возникает ошибка с текстом Fatal error: Uncaught exception ‘Exception’ with message ‘Multibyte string function overloading in PHP must be disabled.’.
Эта ошибка возникает, когда включена перегрузка строковых функций, соответствующими функциями из расширения mb_string. Для отключения этого режима нужно в конфигурационном файле php.ini установить опцию mbstring.func_overload в off.
8.Как задать стиль рамки для ячейки?
В классе 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
9. Делаю расчеты с помощью PHPExcel: ввожу в ячейки данные, а потом считываю результат расчетов из соответствующей ячейки. После чего ввожу в ячейки другие данные, а результат расчетов не изменяется. В чем может быть проблема?
Проблема в том, что все данные расчетов кэшируются. Это сделано для увеличения скорости расчетов и уменьшения используемой памяти. Чтобы все расчеты срабатывали правильно, нужно перед каждым, кроме первого, сбрасывать кэш расчетов следующим образом:
1 2 3 4 5 6 | //Здесь первый расчет .... //после чего сбрасываем кэш PHPExcel_Calculation::getInstance()->clearCalculationCache(); //здесь второй расчет .... |
10. При обработке файлов с большим количеством данных появляется ошибка Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in …
Проблема состоит в том, что PHP имеет ограниченное кол-во памяти и это строго контролируется интерпретатором. PHPExcel требует очень много памяти для обработки данных, поэтому при чтении больших файлов может появляться такого рода ошибка.
Если у вас есть доступ к настройкам PHP, то просто увеличьте размер памяти.
Если нет, то можно разбить файл на две части и обрабатывать их отдельно.
На данный момент это большая часть часто задаваемых вопросов. По мере поступления новых вопросов, буду добавлять их сюда.
Читайте все статьи цикла:
- Создание Excel-файлов с помощью PHPExcel
- Чтение Excel-файлов с помощью PHPExcel
- Часто задаваемые вопросы по PHPExcel
- Кириллические формулы в PHPExcel
Популярность: 41%
Интересное из других блогов:
2leep.comИ не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта
Автор: Татьяна, 14 февраля 2012 в 22:46
используетПо примеру 2 вставляю в документ рисунок, без указания размера (т.е. необходимо вставить оригинальный размер рисунка), но размер рисунка не соответствует оригиналу. Что можно сделать?
Автор: web-junior, 15 февраля 2012 в 16:01
используетМожно попробовать задать размер рисунка при вставке.
Автор: Татьяна, 15 февраля 2012 в 18:44
используетпробовала размеры задавать:
$iDrowing->setHeight(90);
$iDrowing->setWidth(100);
не выходит ничего!
Автор: web-junior, 17 февраля 2012 в 14:48
используетА
$objDrawing->setResizeProportional(false);
не пробовали делать?
Автор: Татьяна, 15 февраля 2012 в 09:45
использует1) Вывожу в документ цифры в текстовом формате, но они почему-то не участвуют в формулах, т.е. например на первой странице выведен номер (по одной цифре в ячейке), а на следующей странице необходимо этот номер повторить – формула “=стр.1!AO1″, но значения номера на второй странице отсутствует.
А вот если дважды щелкнуть по значению в ячейках на первой странице, в верхнем левом углу ячейки появляется зеленый треугольник, и на второй странице значения появляются (т.е. формула считывает).
2) Как удалить лист в Excel-файле.
Автор: web-junior, 15 февраля 2012 в 16:02
использует1) Вы имеете ввиду работу с Excel или PHPExcel?
2) Тот же вопрос.
Автор: Татьяна, 15 февраля 2012 в 18:40
используетPHPExcel конечно (использую шаблон)
Автор: web-junior, 17 февраля 2012 в 14:50
использует1) PHPExcel не поддерживает корректно формулы на русском. Попробуйте английские формулы
2) $objPHPExcel->removeSheetByIndex( [int $pIndex = 0])
где $pIndex – индекс листа.
Автор: Mbus, 20 февраля 2012 в 07:42
используетСкажите, а в этой библиотеке при чтении экселевской таблицы, можно обращаться к ячейке по имени диапазона, заданного в экселе?
Автор: AcidLisk, 22 февраля 2012 в 11:26
используетПочему не работает перенос для объединенных горизонтальных ячеек?
То есть сам перенос отрабатывает, только высота строки не меняется.
Такой проблемы для обычных ячееку нет
Автор: Alex, 1 марта 2012 в 08:35
используетДоброго дня!
есть результат выполнения пхп кода, напримеp: $rez=10;
задача:
в ячейку А1 страницы под названием sheet уже существующего файла table.xlsx внести значение переменной $rez, т.е. цифру 10
Как такое делается? какие функции?
в этих статьях написанно как создавать, в примерах того архива тоже только создание. А вот как редактировать уже существующее?
Т.е. нужно как-бы связать екселевский файл с пхп.
Автор: web-junior, 1 марта 2012 в 14:23
используетЗдравствуйте.
Существует один логический способ сделать то, что вам нужно. Считываете экселевский файл, как описано в этой статье http://www.web-junior.net/chtenie-excel-fajjlov-s-pomoshhyu-phpexcel/ , получаете значение нужной ячейки, делаете с ней нужные операции (редактирование, вычисления и т.д.), после чего устанавливаете новое значение ячейки, как описано здесь http://www.web-junior.net/sozdanie-excel-fajjlov-s-pomoshhyu-phpexcel/ и сохраняете файл с новым значением.
Автор: darkfire, 7 мая 2012 в 16:42
используетДоброе время суток! Подскажите как средствами PHPExcel отсортировать данные по определенному столбцу? То есть выделяем нужные столбцы и сортируем по указанному.
Автор: Mbus, 12 мая 2012 в 13:01
используетСкажите пожалйуста, можно ли установить фильтр (в эксель 2007 это в меню Данные->фильтр) на первую строку в полученном экселевском файле? я сделала шаблон, добавила все так как мне надо, его и заполняю, но вот фильтр слетает.
Автор: Mbus, 18 мая 2012 в 08:40
используетЕще скажите пожалуйста, формат ячейки с датой как можно поментяь в экселевской таблице? т.е. установить нужный формат даты