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


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

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

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


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

2leep.com

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

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

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

  1. Автор: Kron0S, 17 мая 2010 в 16:44

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

    Спасибо за статью. Да и вообще хорошая библиотека, узнал о ней именно с вашего блога :)

    • Автор: web-junior, 17 мая 2010 в 17:00

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

      Пожалуйста! Заходите еще :)

  2. Автор: dobeerman, 18 мая 2010 в 00:42

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

    //ложим на лист

    КЛАДЕМ !!! или уж в даном случае “помещаем на лист”

    • Автор: web-junior, 18 мая 2010 в 12:54

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

      Спасибо за замечание! Действительно в данном случае имеется в виду “помещаем на лист”. Сейчас исправлю.

      Но! По моему мнению, слова “ложить” и “класть” являются синонимами и вполне могут быть взаимозаменяемыми.

      • Автор: dobeerman, 18 мая 2010 в 12:59

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

        в русском языке нет слова “ложить”. ;)

        • Автор: web-junior, 18 мая 2010 в 13:04

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

          Позволю себе не согласиться с вами, поскольку большинство толковых словарей имеют толкование слова “ложить” ;) http://www.vseslovari.com.ua/dal2/page/lojit.16159

          • Автор: dobeerman, 18 мая 2010 в 13:08

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

            хоть наша с Вами дискуссия оффтоп, позволю себе продолжить:

            Глагол “ложить” в русском языке есть, просто его употребление считается не соответствующем лексическим нормам современного русского языка. В этом значение рекомендуется употреблять глагол “класть”. Что касается остальных глаголов, то они являются нормативными и образуют следующие видовые пары: “сложить” / “складывать” и “сладить” / “слаживать”

          • Автор: web-junior, 18 мая 2010 в 13:25

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

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

  3. Автор: dobeerman, 18 мая 2010 в 13:27

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

    кстати, за разъяснения PHPExcel спасибо ;)
    теперь я его меньше боюсь :)

    • Автор: web-junior, 18 мая 2010 в 13:33

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

      пожалуйста, заходите ещё ;)

  4. Автор: BOLVERIN, 18 мая 2010 в 23:04

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

    полезная либа. пригодится :)

  5. Автор: Bagration, 2 июля 2010 в 12:31

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

    Не работает перенос строк в ячейке по данному примеру. В самой ячейке просто выводится символ перевода. Что может быть не так ?

    А за статью, огромное спасибо!

    • Автор: web-junior, 5 июля 2010 в 14:22

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

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

  6. Автор: Виталий, 3 июля 2010 в 18:24

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

    Привет !
    Есть вопрос по библиотеке, схожий с первым вопросом: я читаю файл, и вывожу его. Но вместо кириллицы, которая находится в файле, получаю кракозябры. Что это может быть ?

    • Автор: web-junior, 5 июля 2010 в 14:26

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

      Добрый день!

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

  7. Автор: sl4mmer, 14 июля 2010 в 16:22

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

    Добрый день. Спасибо за отличные материалы. У меня такой вопрос: я читаю файл шаблона построчно, но допустим в столбцах A B C F G у меня данные столбцы D и E у меня местами пустые – и там где они пусты строка читаеться только до столбца C, как сделать чтобы строка читалась полностью, вместе с пустыми ячейками?

    • Автор: web-junior, 19 июля 2010 в 13:47

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

      У итератор ячеек PHPExcel_Worksheet_CellIterator есть метод setIterateOnlyExistingCells, вызвав который и передав ему false так:

      1
      
      $cellIterator->setIterateOnlyExistingCells(false);

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

  8. Автор: sl4mmer, 20 июля 2010 в 01:49

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

    Еще раз Здравствуйте. Как можно сделать чтобы поля в которых есть формула перед тем как взять из них значение интерпретировались?

    • Автор: web-junior, 22 июля 2010 в 10:01

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

      Добрый день!
      У класса ячеек (PHPExcel_Cell) есть два метода для получения значений:
      - getValue(), который возвращает содержимое ячейки
      - getCalculatedValue(), который возвращает расчитанное по формулам содержимое ячейки
      Для корректного расчета значений достаточно использовать метод getCalculatedValue()

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

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