Часто задаваемые вопросы по 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И не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта
Автор: Павел, 1 сентября 2011 в 15:27
используетПодскажите как можно сделать перенос строк автоматическим и при этом изменение высоты строки. Например я генерирую счет-фактуру, бывают длинные названия, которые не влазят в ячейку, надо чтобы ячейка растягивалась вниз сама
Автор: Валерий, 13 сентября 2011 в 12:17
используетСкажите пожалуйста как защитить лист или книгу паролем?
Автор: web-junior, 13 сентября 2011 в 15:07
используетПосмотрите на класс PHPExcel_DocumentSecurity. В нем есть методы для задания пароля и проверки поддержки шифрования. Добраться до него можно так:
Автор: andrey, 27 сентября 2011 в 10:10
используету меня возникла проблема передаю переменную в ячейку а текст она не выводит(ячейка остается пустой) с цифровыми меременными проблем нет. что делать?
Автор: web-junior, 28 сентября 2011 в 14:33
используетДобрый день.
Можно попробовать установить тип ячейки до передачи переменной вот так:
где $aSheet – это объект листа, а С1 – это нужная ячейка.
Автор: Андрей, 9 ноября 2011 в 07:43
используетОчень полезная информация!
А есть ли возможность прочитать рисунок из ячейки и сохранить его как файл?
Автор: web-junior, 9 ноября 2011 в 08:59
используетДобрый день.
Да, конечно есть. Вот здесь я приводил пример скрипта, который сохраняет все рисунки ячеек
Автор: Nep, 28 ноября 2011 в 23:37
используетПривет… Спасибо за статью… пользовался в основном документацией отсюда, но было приятно прочитать на могучем)… Возникла необходимость вставлять в одну ячейку сразу несколько изображений… проблемы возникают в основном с позиционированием картинок в ячейке… пока никаких рабочих идей не возникло… вот фрагмент кода из цикла
После цикла
Если кто реализовал, буду благодарен за подсказку…
Автор: Nep, 29 ноября 2011 в 00:19
используетРешил вопрос с позиционированием нескольких картинок в одной ячейке… как всегда всё банальное просто))) Методология проста: 1) получить массив картинок, 2) перезаписать в промежуточный двумерный массив ['название'] ['суммa высот предыдущих рисунков'], 3) в обратном цикле вывести картинки в ячейку с указанием отступа равной ['сумме высот пред. рис.']… если надо скину код…
Автор: web-junior, 29 ноября 2011 в 17:29
используетСпасибо. Теперь будем знать и мы.
Автор: ovkt, 30 ноября 2011 в 07:32
используетЗдравствуйте!
Помогите мне, пожалуйста, справиться с такой проблемой – если я выгружаю в EXCEL русский текст (используя конвертер), то все нормально получается. Однако, если я пытаюсь выгрузить данные, содержащиеся в базе MySql, то выводятся ?????. База создана в cp1251, я ее конвертирую в utf8, все равно ?????.
Спасибо
Автор: web-junior, 30 ноября 2011 в 09:52
используетДобрый день.
А с какой кодировкой PHP соединяется с MySQL?
Автор: Джамшед, 11 декабря 2011 в 16:15
используетБольшое спасибо за статьи, прочитал все 3 статьи из цикла, очень помогло.