Невозможно правильно отобразить дату, время и числа с помощью PHPExcel

это мой первый вопрос в stackoverflow. Я пытаюсь использовать PHPExcel для создания таблицы HTML из файла .xlsx. Вы можете найти мой проект в: http://rahulr92.x10.mx/excel/index.php Войдите в систему с именем пользователя «admin», и вы найдете опцию «Просмотр таблицы». На этой странице отображается таблица из ранее загруженного файла .xlsx. Я новичок в PHPExcel и использовал стандартный код, который нашел в Интернете. Вот:

<?php
require_once '/Classes/PHPExcel.php';
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("..\excel.xlsx");
$objWorksheet = $objPHPExcel->getActiveSheet();
$highestRow = $objWorksheet->getHighestRow(); 
$highestColumn = $objWorksheet->getHighestColumn(); 
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); 
$user=strtolower($_GET['user']);
$r_count=0;
echo '<table border="1">' . "\n";
for ($row = 5; $row <= $highestRow; ++$row) {
if ($row <7 || $user=="admin" || strstr(strtolower($objWorksheet->getCellByColumnAndRow(8, $row)->getValue()),$user ))
 { 
 if($row>7)$r_count++;
 for ($col = 0; $col <= $highestColumnIndex; ++$col) {
      if(PHPExcel_Shared_Date::isDateTime($objWorksheet->getCellByColumnAndRow($col,$row)))
        echo '<td>' . date("d M Y",PHPExcel_Shared_Date::ExcelToPHP($objWorksheet->getCellByColumnAndRow($col, $row))) . '</td>' ;
      else
        echo '<td>' . $objWorksheet->getCellByColumnAndRow($col, $row)->getValue() . '</td>' . "\n";
  }
   echo '</tr>' . "\n";
}
}
 echo '</table>' . "\n";
 echo "No. of Entries: ".$r_count;
?>

Извините за неоптимальный код. Когда я запускаю файл php, я получаю таблицу, и все строки в ней отображаются правильно, но поля даты и времени и числа заполнены, казалось бы, случайной тарабарщиной. Пожалуйста, взгляните на него по ссылке выше. Я провел некоторое исследование и таким образом узнал о функции isDateTime(). Но он не работает или, вероятно, используется неправильно. У меня сжатые сроки для этого проекта, поэтому было бы здорово, если бы кто-нибудь мог указать мне правильное направление. Очень жаль, если ответ был очень очевидным. Заранее большое спасибо. Рахул


person rahulr92    schedule 24.12.2011    source источник


Ответы (1)


Не устанавливайте $objReader->setReadDataOnly(true);, если вы хотите иметь возможность идентифицировать значения даты/времени... Excel хранит даты/время как числа с плавающей запятой, и единственный способ отличить число от даты/времени — использовать маскирование формата: isDateTime() использует эту маскировку формата, чтобы определить, является ли значение числом или датой/временем... $objReader->setReadDataOnly(true) указывает программе чтения файлов читать только данные (числа) и игнорировать маски формата, поэтому он читает только необработанные данные.

Однако я не уверен, что точно понимаю, что вы подразумеваете под "случайной тарабарщиной"... числа все равно должны отображаться как числа... не могли бы вы привести пример.

ИЗМЕНИТЬ

Обратите внимание, что методы ячеек, такие как getFormattedValue(), будут возвращать числа, так как их формат замаскирован в рабочей книге, поэтому значения даты/времени будут отформатированы как даты/время, числа будут отображаться с соответствующим количеством знаков после запятой, разделителями тысяч, валютами или процентами ( если они имели соответствующее форматирование в файле Excel), поэтому вам не нужно проверять isDateTime().... до тех пор, пока $objReader->setReadDataOnly(true) не был установлен для ридера.

person Mark Baker    schedule 24.12.2011
comment
Спасибо за ответ. Вы можете увидеть пример того, что я имею в виду под случайной тарабарщиной здесь: rahulr92.x10. mx/excel/view.php?user=admin - person rahulr92; 25.12.2011
comment
Я попытался прокомментировать оператор $objReader-›setReadDataOnly(true). Но теперь я получаю эту ошибку: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in C:\wamp\www\SN_project391\Classes\PHPExcel\Cell.php on line 750 Call Stack. Как я могу это исправить? - person rahulr92; 25.12.2011
comment
Я наткнулся на некоторые ваши собственные предыдущие ответы на проблему. Попробую исправить ошибку из тех. Я вернусь с результатами. - person rahulr92; 25.12.2011
comment
Эта случайная тарабарщина - числа даты/времени Excel... ячейки, начинающиеся с '=', являются формулами. Используйте getCalculatedValue() или getFormattedValue() для оценки формулы с setReadDataOnly(false) или только что закомментированной строкой. - person Mark Baker; 25.12.2011
comment
Что касается ошибок памяти, есть много ответов на требования памяти PHPExcel либо здесь, либо на форуме PHPExcel на Codeplex: либо увеличение памяти PHP через php.ini, либо кэширование ячеек должно быть первым, что нужно попробовать. - person Mark Baker; 25.12.2011
comment
Большое спасибо за четкую и правильную помощь/совет. Действительно извините за задержку с ответом. Я смог правильно запустить код на небольшом файле *.xlsx, хотя моя система дважды зависала с исходным файлом (даже с memory_limit = 2048M и max_execution_time = 0). Но я считаю, что этот вопрос теперь может быть разумно закрыт. Спасибо еще раз. - person rahulr92; 26.12.2011