Невозможно правильно отобразить дату, время и цифры, используя PHPExcel - PullRequest
4 голосов
/ 24 декабря 2011

это мой первый вопрос в 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 () таким образом.Но это не работает или, вероятно, используется неправильно.У меня сжатые сроки для этого проекта, поэтому было бы здорово, если бы кто-нибудь мог указать мне правильное направление.Очень жаль, если ответ был очень очевидным.Заранее большое спасибо.Рахул

1 Ответ

4 голосов
/ 24 декабря 2011

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

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

EDIT

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

...