【问题标题】:Unable to display date, time and numbers properly using PHPExcel无法使用 PHPExcel 正确显示日期、时间和数字
【发布时间】:2014-03-11 18:28:24
【问题描述】:

这是我在 stackoverflow 中的第一个问题。我正在尝试使用 PHPExcel 从 .xlsx 文件创建 HTML 表。您可以在以下位置找到我的项目: 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() 函数。但它不起作用或可能被错误地使用。我的这个项目的截止日期很紧,所以如果有人能指出我正确的方向,那就太好了。如果答案很明显,真的很抱歉。提前非常感谢。 拉胡尔

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    如果您希望能够识别日期/时间值,请不要设置 $objReader-&gt;setReadDataOnly(true);... Excel 将日期/时间存储为浮点数,区分数字与日期/时间的唯一方法是使用格式掩码:isDateTime() 使用该格式掩码来识别值是数字还是日期/时间...$objReader-&gt;setReadDataOnly(true) 告诉文件读取器只读取数据(数字)并忽略格式掩码,所以它只读取原始数据。

    但是,我不确定我完全理解您所说的“随机乱码”是什么意思...数字仍应显示为数字...您能举个例子吗?

    编辑

    请注意,getFormattedValue() 等单元格方法将返回数字,因为它们在工作簿中被格式屏蔽,因此日期/时间值将被格式化为日期/时间,数字将以适当的小数位数显示,千位分隔符或货币或百分比(如果它们在 Excel 文件中具有适当的格式),因此您无需测试 isDateTime()...。只要未为阅读器设置 $objReader-&gt;setReadDataOnly(true)

    【讨论】:

    • 感谢您的回复。你可以在这里看到我所说的“随机胡言乱语”的一个例子:rahulr92.x10.mx/excel/view.php?user=admin
    • 我尝试评论 $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。我该如何解决?
    • 我遇到了一些你自己以前对这个问题的回答。将尝试修复这些错误。我会带着结果回来。
    • “随机乱码”是 Excel 日期/时间数字...以“=”开头的单元格是公式。使用 getCalculatedValue() 或 getFormattedValue() 计算公式,使用 setReadDataOnly(false) 或刚刚注释掉的那一行。
    • 对于内存错误,这里或 Codeplex 上的 PHPExcel 论坛上都有很多关于 PHPExcel 内存需求的答案:要么通过 php.ini 增加 PHP 内存,要么单元缓存应该是第一件事尝试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多