Часто задаваемые вопросы по 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. Автор: Татьяна, 14 февраля 2012 в 22:46

    использует Google Chrome 17.0.963.46 Google Chrome 17.0.963.46 на Windows XP Windows XP

    По примеру 2 вставляю в документ рисунок, без указания размера (т.е. необходимо вставить оригинальный размер рисунка), но размер рисунка не соответствует оригиналу. Что можно сделать?

    • Автор: web-junior, 15 февраля 2012 в 16:01

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

      Можно попробовать задать размер рисунка при вставке.

      • Автор: Татьяна, 15 февраля 2012 в 18:44

        использует Google Chrome 17.0.963.46 Google Chrome 17.0.963.46 на Windows XP Windows XP

        пробовала размеры задавать:
        $iDrowing->setHeight(90);
        $iDrowing->setWidth(100);
        не выходит ничего!

        • Автор: web-junior, 17 февраля 2012 в 14:48

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

          А
          $objDrawing->setResizeProportional(false);
          не пробовали делать?

  2. Автор: Татьяна, 15 февраля 2012 в 09:45

    использует Google Chrome 17.0.963.46 Google Chrome 17.0.963.46 на Windows XP Windows XP

    1) Вывожу в документ цифры в текстовом формате, но они почему-то не участвуют в формулах, т.е. например на первой странице выведен номер (по одной цифре в ячейке), а на следующей странице необходимо этот номер повторить – формула “=стр.1!AO1″, но значения номера на второй странице отсутствует.
    А вот если дважды щелкнуть по значению в ячейках на первой странице, в верхнем левом углу ячейки появляется зеленый треугольник, и на второй странице значения появляются (т.е. формула считывает).
    2) Как удалить лист в Excel-файле.

    • Автор: web-junior, 15 февраля 2012 в 16:02

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

      1) Вы имеете ввиду работу с Excel или PHPExcel?
      2) Тот же вопрос.

      • Автор: Татьяна, 15 февраля 2012 в 18:40

        использует Google Chrome 17.0.963.46 Google Chrome 17.0.963.46 на Windows XP Windows XP

        PHPExcel конечно (использую шаблон)

        • Автор: web-junior, 17 февраля 2012 в 14:50

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

          1) PHPExcel не поддерживает корректно формулы на русском. Попробуйте английские формулы
          2) $objPHPExcel->removeSheetByIndex( [int $pIndex = 0])
          где $pIndex – индекс листа.

  3. Автор: Mbus, 20 февраля 2012 в 07:42

    использует Opera 11.61 Opera 11.61 на Windows Vista Windows Vista

    Скажите, а в этой библиотеке при чтении экселевской таблицы, можно обращаться к ячейке по имени диапазона, заданного в экселе?

  4. Автор: AcidLisk, 22 февраля 2012 в 11:26

    использует Opera 11.61 Opera 11.61 на Windows XP Windows XP

    Почему не работает перенос для объединенных горизонтальных ячеек?
    То есть сам перенос отрабатывает, только высота строки не меняется.

    Такой проблемы для обычных ячееку нет

  5. Автор: Alex, 1 марта 2012 в 08:35

    использует Firefox 10.0.2 Firefox 10.0.2 на Windows Vista Windows Vista

    Доброго дня!
    есть результат выполнения пхп кода, напримеp: $rez=10;

    задача:
    в ячейку А1 страницы под названием sheet уже существующего файла table.xlsx внести значение переменной $rez, т.е. цифру 10

    Как такое делается? какие функции?
    в этих статьях написанно как создавать, в примерах того архива тоже только создание. А вот как редактировать уже существующее?
    Т.е. нужно как-бы связать екселевский файл с пхп.

    • Автор: web-junior, 1 марта 2012 в 14:23

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

      Здравствуйте.
      Существует один логический способ сделать то, что вам нужно. Считываете экселевский файл, как описано в этой статье http://www.web-junior.net/chtenie-excel-fajjlov-s-pomoshhyu-phpexcel/ , получаете значение нужной ячейки, делаете с ней нужные операции (редактирование, вычисления и т.д.), после чего устанавливаете новое значение ячейки, как описано здесь http://www.web-junior.net/sozdanie-excel-fajjlov-s-pomoshhyu-phpexcel/ и сохраняете файл с новым значением.

  6. Автор: darkfire, 7 мая 2012 в 16:42

    использует Google Chrome 18.0.1025.168 Google Chrome 18.0.1025.168 на GNU/Linux x64 GNU/Linux x64

    Доброе время суток! Подскажите как средствами PHPExcel отсортировать данные по определенному столбцу? То есть выделяем нужные столбцы и сортируем по указанному.

  7. Автор: Mbus, 12 мая 2012 в 13:01

    использует Opera 11.62 Opera 11.62 на Windows XP Windows XP

    Скажите пожалйуста, можно ли установить фильтр (в эксель 2007 это в меню Данные->фильтр) на первую строку в полученном экселевском файле? я сделала шаблон, добавила все так как мне надо, его и заполняю, но вот фильтр слетает.

  8. Автор: Mbus, 18 мая 2012 в 08:40

    использует Opera 11.64 Opera 11.64 на Windows XP Windows XP

    Еще скажите пожалуйста, формат ячейки с датой как можно поментяь в экселевской таблице? т.е. установить нужный формат даты

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="">

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