如何使用 PHPExcel 库读取 excel 一个单元格日期(DD/MM/YYYY)值并将日期格式转换为(M/D/YYYY)

Posted

技术标签:

【中文标题】如何使用 PHPExcel 库读取 excel 一个单元格日期(DD/MM/YYYY)值并将日期格式转换为(M/D/YYYY)【英文标题】:How to read excel one cell date(DD/MM/YYYY) value and convert date format into (M/D/YYYY) using PHPExcel library 【发布时间】:2020-04-11 17:59:35 【问题描述】:

我正在使用 php PHPExcel 库将 excel 文件数据转换为 csv 文件。目前我正在将所有数据从 excel 转换为 csv。但我需要在一个特定的单元格中更改日期格式 [例如。 B2] 在 excel 中它的日期(DD/MM/YYYY)我想将其更改为 M/D/YYYY 并将其与 csv 相同。

注意:我使用 phpexcel 库 来读取 excel fi

我尝试了以下代码:

<?php
$excel_lib = '/var/www/mp/cronfiles/data/Classes/PHPExcel/IOFactory.php';
include($excel_lib);
$filearray = array('file1.xlsx','file2.csv','file3.csv');
$file2 = fopen(dirname(__FILE__).'/'.$filearray[0],"r");
if (!$file2) 
                echo "File not exisit";
            
$inputFileType1 = PHPExcel_IOFactory::identify($filearray[0]);
$objReader1 = PHPExcel_IOFactory::createReader($inputFileType1);
$objPHPExcel1 = $objReader1->load($filearray[0]);
$sheet1 = $objPHPExcel1->getSheet(0);

      $highestRow1 = $sheet1->getHighestRow();

      $highestColumn1 = $sheet1->getHighestColumn();

      $rowData1 = array();

  for ($row1 = 1; $row1 <= $highestRow1; $row1++)  
    $rowData1[] = $sheet1->rangeToArray('A' . $row1 . ':' . $highestColumn1 . $row1, null, true, true);
  

  foreach($rowData1 AS $k => $v)
      foreach ($v AS $fk => $fv)
          $csv[] = $fv;
          
      

$excel_date = 'As of '.$csv[1][1]; //its B2 cell in excel value ex.[echo $excel_date; output 22/6/2019]
$changed_date = date_format('M/d/Y', $excel_date);
echo $change_date;

我收到以下错误:

警告:date_format() 期望参数 1 为 DateTimeInterface,在 var/www/html/mp/cronfiles/data/myfile.php 中给出的字符串**

我的问题: 1.如何获取日期格式的excel单元格值以便我可以转换它。

注意:在 excel 中,我试图获取的 B2 单元格值仅采用日期格式。但它的变化取决于我的 excel 默认语言。

如果您需要更多信息,请告诉我。我希望我能在这里解决问题。

提前致谢。

通过 阿甘

【问题讨论】:

可以给你的excel图片一行显示日期列。 excel截图请查看链接(awesomescreenshot.com/image/4414297/…) 【参考方案1】:

您收到的日期格式为 excel 日期格式。首先您必须转换为 php 日期时间格式,然后转换为所需的输出格式。

使用此代码:


$excel_date = $csv[1][1];  //22/6/2019;   
$changed_date = DateTime::createFromFormat('d/m/Y', $excel_date)->format('D/M/Y');
echo $changed_date;

您需要决定哪种格式是 excel 日期,请使用以下代码:


function convert_date_format($old_date = '')       
 $old_date = trim($old_date);        
    if (preg_match('/^(0[1-9]|1[0-2]|[1-9])\/(0[1-9]|[1-2][0-9]|3[0-1])\/[0-9]4$/', $old_date)) // mysql-compatible YYYY-MM-DD format  
        return 'm/d/Y';        
     elseif (preg_match('/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2]|[1-9])\/[0-9]4$/', $old_date)) // DD-MM-YYYY format  
        return 'd/m/Y';
         
 

$excel_format = convert_date_format($excel_date);
$changed_date = DateTime::createFromFormat($excel_format, $excel_date)->format('D/M/Y');
echo $changed_date;

【讨论】:

PHP 认为 / 表示 m/d/Y 和 - 表示 dmY。(在 excel 中,我在同一单元格中获取两个类型的日期值,例如 m/d/Y 有时 d/m/Y : excel 文件每天都在变化)问题是我需要在 excel 中找到值是 m/d/YYYY 或 d/m/YYYY。不知道这一点很难得到我想要的输出。你能帮我解决这个问题吗? 试试这个我得到这个 $dt = DateTime::createFromFormat('d/m/Y', '22/6/2019')->format('D/M/Y' );是星期六/六月/2019 有时我得到 d/m/Y 格式(22/6/2019)的 excel 值,有时是 m/d/y 格式(2019 年 6 月 22 日)。这就是让这变得困难的原因。如何在不知道它无法获得输出的情况下在 excel 中找到当前的格式。无论 excel 中的哪种格式,我都只能以 m/d/Y 格式输出。 @aviboy2066 仅适用于(13/9/2019 至 30/9/2019)[DD/MM/YYYY] 的日期限制。如果我给出低于 13 日的日期,例如 12/9/2019[DD/MM/YYYY],则它计算错误,并以 MM/DD/YYYY 格式表示 12/9/2019。但它错了。 它为我工作。对于任何日期,都没有特定的年份或月份。我将代码更改为处理 1-9 个月而不尾随 0

以上是关于如何使用 PHPExcel 库读取 excel 一个单元格日期(DD/MM/YYYY)值并将日期格式转换为(M/D/YYYY)的主要内容,如果未能解决你的问题,请参考以下文章

ci框架读取上传的excel文件数据

PHPExcel读取excel文件示例

php上传excel文件,如何读取文件中的信息?

对PHPExcel一些简单的理解 及怎么读取单元格数据

求助,使用PHPExcel类读取Excel2007,出现错误

PHPExcel使用-使用PHPExcel导入文件