5

目前,我正在为我的工作制作一个程序,该程序使用 PHPexcel 基本上从 excel 表中获取所有数据,制作一个新的 excel 表并将其格式化为文本,并从旧的 excel 表中传输所有数据。

我的 php 必须能够从旧的 excel 表中获取值并正确解析它们,尤其是日期/数字/等。

除日期外,一切正常。出于某种原因,当我获得单元格的格式化值时;它与第一张表中的日期格式不匹配。特别是这样的值: 12/31/2099 。由于某种原因,它错误地将格式代码读取为 mm-dd-yy 并输出 12-31-99。这非常令人沮丧,我已经在互联网上搜索了一半的答案。请帮忙; 我不确定是什么问题!代码:

<?php
$spreadSheet=$_FILES["filebrowser"]["tmp_name"];
/** PHPExcel_IOFactory */
require_once 'Classes/PHPExcel/IOFactory.php';
require_once 'Classes/PHPExcel/Shared/Date.php';
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
//Create temporary sheet from uploaded file data
$objPHPExcel = $objReader->load($spreadSheet);
$sheet = $objPHPExcel->getActiveSheet();
$sheet->setTitle("Original Data");
$data=$sheet->getCell("D9")->getFormattedValue();

var_dump($data);
exit;?>

D9 是 DATE 格式的单元格,值为 12/31/2099。此代码打印 12-31-99...

4

3 回答 3

6

使用PHPExcel v1.7.9

打开文件 “PHPExcel\Style\NumberFormat.php”

转到第 278 行:

self::$_builtInFormats[22] = 'm/d/yy h:mm'; 

用。。。来代替

self::$_builtInFormats[22] = 'dd-mm-yyyy hh:mm';

或您想要的任何格式。

我找不到一种有效的方法来即时更改它,而且我没有理由以任何方式格式化日期,所以这个解决方案对我有用。

于 2013-07-13T23:37:59.130 回答
2

使用 v1.7.8 并假设 Excel2007 aka.xlsx文件

$a1Cell = $sheet->getCell('A1');
$a1CellFormattedValue = trim($a1Cell->getFormattedValue());
if (!empty($a1CellFormattedValue)) {
    $dateInTimestampValue = PHPExcel_Shared_Date::ExcelToPHP($a1Cell->getValue());
}

让我解释每一行。

  • 第 1 行是获取 Cell 对象
  • 第 2 行和 if 块是这样我们只对非空单元格执行
  • 第 4 行是我们如何将单元格内的值转换为 unix 时间戳。

您需要决定将值写入目标 Excel 文件的日期格式。我的建议是您与利益相关者一起决定目标 excel 文件中的所有日期都将遵循特定格式。

这是我能想到的最干净的方式。

PS 如果您有一个空单元格,并且您尝试对PHPExcel_Shared_Date::ExcelToPHP单元格值进行操作,您将获得当前日期。

更新

刚刚意识到您的评论提到您不能随意决定格式。对于那个很抱歉。如果我遇到有帮助的东西,我会更新这个答案。

于 2013-11-29T03:55:54.703 回答
1

我刚看到你的问题。如果您知道 excel 保存日期的格式,那么您可以使用 PHP 类DateTime作为中间日期表示

$data=$sheet->getCell("D9")->getFormattedValue();
$date = DateTime::createFromFormat ("m-d-y" , $data);
$string_date = $date->format($format);

$format你想要的格式在哪里

于 2014-08-26T08:00:40.087 回答