Часто задаваемые вопросы по 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, то просто увеличьте размер памяти.
Если нет, то можно разбить файл на две части и обрабатывать их отдельно.


На данный момент это большая часть часто задаваемых вопросов. По мере поступления новых вопросов, буду добавлять их сюда.

Читайте все статьи цикла:

Популярность: 41%


Интересное из других блогов:

2leep.com

И не забывайте комментировать статью.

Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта

Отзывов: 77 на «Часто задаваемые вопросы по PHPExcel»

  1. Автор: Павел, 1 сентября 2011 в 15:27

    использует IceWeasel 5.0 IceWeasel 5.0 на GNU/Linux x64 GNU/Linux x64

    Подскажите как можно сделать перенос строк автоматическим и при этом изменение высоты строки. Например я генерирую счет-фактуру, бывают длинные названия, которые не влазят в ячейку, надо чтобы ячейка растягивалась вниз сама

  2. Автор: Валерий, 13 сентября 2011 в 12:17

    использует Firefox 3.6.18 Firefox 3.6.18 на Windows XP Windows XP

    Скажите пожалуйста как защитить лист или книгу паролем?

    • Автор: web-junior, 13 сентября 2011 в 15:07

      использует Firefox 6.0.1 Firefox 6.0.1 на GNU/Linux x64 GNU/Linux x64

      Посмотрите на класс PHPExcel_DocumentSecurity. В нем есть методы для задания пароля и проверки поддержки шифрования. Добраться до него можно так:

      $security = $objPHPExcel->getSecurity();
  3. Автор: andrey, 27 сентября 2011 в 10:10

    использует Opera Mini 6.1.25378 Opera Mini 6.1.25378 на J2ME/MIDP Device J2ME/MIDP Device

    у меня возникла проблема передаю переменную в ячейку а текст она не выводит(ячейка остается пустой) с цифровыми меременными проблем нет. что делать?

    • Автор: web-junior, 28 сентября 2011 в 14:33

      использует Firefox 6.0.1 Firefox 6.0.1 на GNU/Linux x64 GNU/Linux x64

      Добрый день.
      Можно попробовать установить тип ячейки до передачи переменной вот так:

      $aSheet->getCell('C1')->setDataType(
      PHPExcel_Cell_DataType::TYPE_STRING);

      где $aSheet – это объект листа, а С1 – это нужная ячейка.

  4. Автор: Андрей, 9 ноября 2011 в 07:43

    использует Firefox 3.5.1 Firefox 3.5.1 на Windows XP Windows XP

    Очень полезная информация!
    А есть ли возможность прочитать рисунок из ячейки и сохранить его как файл?

    • Автор: web-junior, 9 ноября 2011 в 08:59

      использует Firefox 7.0.1 Firefox 7.0.1 на GNU/Linux x64 GNU/Linux x64

      Добрый день.
      Да, конечно есть. Вот здесь я приводил пример скрипта, который сохраняет все рисунки ячеек

  5. Автор: Nep, 28 ноября 2011 в 23:37

    использует Firefox 8.0 Firefox 8.0 на Windows 7 Windows 7

    Привет… Спасибо за статью… пользовался в основном документацией отсюда, но было приятно прочитать на могучем)… Возникла необходимость вставлять в одну ячейку сразу несколько изображений… проблемы возникают в основном с позиционированием картинок в ячейке… пока никаких рабочих идей не возникло… вот фрагмент кода из цикла

    1
    2
    3
    4
    5
    6
    7
    8
    
    $img = new PHPExcel_Worksheet_Drawing();
    				$img->setPath($row['image']);
    				list($width,$height)=getimagesize($row['image']);
    				$rowsize=$rowsize+$height;
    				if($columnsizesetCoordinates('C'.(5+$i));
    				$img->setOffsetX(5);
    				$img->setOffsetY($rowsize+5);
    				$img->setWorksheet($DataSheet);

    После цикла

    1
    
    $DataSheet->getRowDimension((5+$i))->setRowHeight($rowsize+5);

    Если кто реализовал, буду благодарен за подсказку…

  6. Автор: Nep, 29 ноября 2011 в 00:19

    использует Firefox 8.0 Firefox 8.0 на Windows 7 Windows 7

    Решил вопрос с позиционированием нескольких картинок в одной ячейке… как всегда всё банальное просто))) Методология проста: 1) получить массив картинок, 2) перезаписать в промежуточный двумерный массив ['название'] ['суммa высот предыдущих рисунков'], 3) в обратном цикле вывести картинки в ячейку с указанием отступа равной ['сумме высот пред. рис.']… если надо скину код…

    • Автор: web-junior, 29 ноября 2011 в 17:29

      использует Firefox 8.0 Firefox 8.0 на GNU/Linux x64 GNU/Linux x64

      Спасибо. Теперь будем знать и мы.

  7. Автор: ovkt, 30 ноября 2011 в 07:32

    использует Internet Explorer 8.0 Internet Explorer 8.0 на Windows XP Windows XP

    Здравствуйте!
    Помогите мне, пожалуйста, справиться с такой проблемой – если я выгружаю в EXCEL русский текст (используя конвертер), то все нормально получается. Однако, если я пытаюсь выгрузить данные, содержащиеся в базе MySql, то выводятся ?????. База создана в cp1251, я ее конвертирую в utf8, все равно ?????.

    Спасибо

    • Автор: web-junior, 30 ноября 2011 в 09:52

      использует Firefox 8.0 Firefox 8.0 на GNU/Linux x64 GNU/Linux x64

      Добрый день.
      А с какой кодировкой PHP соединяется с MySQL?

  8. Автор: Джамшед, 11 декабря 2011 в 16:15

    использует Firefox 7.0.1 Firefox 7.0.1 на Windows 7 x64 Edition Windows 7 x64 Edition

    Большое спасибо за статьи, прочитал все 3 статьи из цикла, очень помогло.

RSS-лента комментариев. Адрес для трекбека

Ваш отзыв

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Нажимая на кнопку "Добавить" вы принимаете правила комментирования