Опять не смог создать таблицу Excel из PHP :-(

GRIG

Новичок
Опять не смог создать таблицу Excel из PHP :-(

Вчера задавал вопрос о создании экселевых таблиц средствами PHP. Получил в ответ "возьми PHPExcel - это то, что тебе нужно"
Скачал со страницы http://phpexcel.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=10717 архив, поставил к себе.
Попробовал чего-нибудь написать - не работает :-(
Написал такой скрипт:

-~{}~ 30.09.09 16:03:

Что-то глюкнуло. Попробую продолжить.
Итак, написал скрипт:
<?php
require_once('Classes/PHPExcel.php');
require_once('Classes/PHPExcel/Writer/Excel5.php');

$xls = new PHPExcel();
$sheet = $xls->getActiveSheet();
for( $i = 1; $i <= 10; $i++ )
{
$sheet->setCellValue( 'A'+ $i, $i * 2 );
}
$sheet->setCellValue( 'A11', '=SUM(A1:A10)' );

for( $i = 1; $i <= 10; $i++ )
{
$val = $sheet->getCell( 'A'+$i )->getValue();
echo 'i='.$i.' val='.$val."<br>\n";
}

echo $sheet->getCell( 'A11' )->getValue().' ';
echo $sheet->getCell( 'A11' )->getCalculatedValue()."<br>\n";

$xlsWriter = new PHPExcel_Writer_Excel5($xls);
$xlsWriter->save("mytable.xls");

echo 'done';
?>
Начало понятное - создается таблица, потом в 10 ячеек пишутся цифры, а в 11-ю формула для их суммирования. Потом для контроля все это выводится. А потом делается попытка сохранить это в файл.
Результаты такие: числа в ячейках выводятся нормально. Формула из ячейки тоже выводится. А вот вычисленное по формуле значение оказывается равным 0. А при сохранении вообще происходит ошибка - ругается на строку с save() фразой: Fatal error: Uncaught exception 'Exception' with message 'Column string index can not be empty.' in /......./Classes/PHPExcel/Cell.php:630"
Чего я не так сделал?
 

dimagolov

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

Это я к чему. Наличие формулы в файле не означает наличие посчитанного значения для него.

п.с. не знала баба клопiту купила порося :)
 

GRIG

Новичок
Насчет формул - спасибо, я был не в курсе.
Кстати, мне казалось, что вызов getCalculatedValue() должен принудительно посчитать значение по формуле. Я неправ?
И в любом случае это не отменяет второй части вопроса - почему скрипт выбросил исключение?

-~{}~ 01.10.09 12:26:

Кстати: я переместил строку, которая размещает формулу в ячейке, вперед, до цикла, который записывает цифры в другие ячейки.
Результат не изменился :-(

-~{}~ 01.10.09 14:51:

Кажется, я заставил эту штуку работать.
Такое впечатление, что у нее глюки в функции преобразования строки с экселевым адресом ячейки в пару цифр.
Вместо
$sheet->setCellValue( 'A'+ $i, $i * 2 )
я написал
$sheet->getCellByColumnAndRow( 0, $i )->setValue( $i * 2 );
И аналогично в других местах.
И все стало хорошо. Даже формула вычислилась. :) И запись в файл сработала (после соответствующего chmod на каталог)
 

Adelf

Administrator
Команда форума
GRIG
Видишь как тебе тут помогли? :) Тайный замысел данного форума в том, чтобы все, у кого возникали подобные вопросы именно так и решали их. Сами :)
У тебя появился опыт, и очень важное умение отлаживать, добиваться правильной работы сторонних программ. самому.
 

GRIG

Новичок
На самом деле все оказалось еще более хитро. Тут одновременно и мой собственный глюк, и баг в пакете.
Мой глюк состоит в том, что я формировал строку с координатами ячейки как 'A'+$i.
В яваскрипте такое катит. А в пхп - нет. В пхп надо писать 'A' . $i
А баг в пакете состоит в том, что он никак не среагировал на то, что в функцию преобразования строки с координатами в абсолютные значения координат подсунули строку в неправильном формате. По смыслу надо в этом случае исключение кидать. А он, зараза, промолчал.
 

GRIG

Новичок
Да, экскепшен. Но не там где надо. Потому что он уже из разряда "поздно пить боржоми". И, к тому же, не дает сколько-нибудь вразумительной информации о том, что же там на самом деле произошло.
Баг пакета состоит в том, что нужно было кидать исключение значительно раньше - в тот момент, когда шла запись информации в ячейку. Т. е на строку
$sheet->setCellValue( 'A'+ $i, $i * 2 );
А скрипт эту строку молча съел и не подавился.
 
Сверху