【问题标题】:Fatal error: Uncaught Error: Call to a member function format() on bool on line 58致命错误:未捕获的错误:在第 58 行调用 bool 上的成员函数 format()
【发布时间】:2022-07-02 04:39:30
【问题描述】:

我必须从 CSV 文件中检索数据,并显示以字符串格式编写的日期的月份和年份。我运行代码,它显示了一个非格式正确的数值遇到错误。我还尝试了其他转换方法日期,我得到每个日期的 1900 年。

use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
require('php_library/spreadsheet-reader-master/php-excel-reader/excel_reader2.php');

require('php_library/spreadsheet-reader-master/SpreadsheetReader.php');


if(isset($_FILES["filename"]))
{
 $file = $_FILES["filename"]["tmp_name"];
 $file_open = fopen($file,"r");
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();
$spreadsheet = $reader->load($file);
$sheetData = $spreadsheet->getActiveSheet()->toArray();
 foreach ($sheetData as $i=>$Row)
    {
        foreach($Row as $j=>$column)
        {
            // echo $Row[$j].", ";
            if($i == 0)
            {
            if($Row[$j] == "Codice cliente")
                $column1 = $j;
            if($Row[$j] == "Data emissione")
            {
                $column2 = $j;
                // echo $j;
            }
        }
            
        }
      

    }
foreach ($sheetData as $i=>$row)

    {  
        if($i!=0){
      json_encode(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[$column2])->format('Y'));
}

【问题讨论】:

  • 不要截断或解释错误消息 - 这对于那些试图诊断问题的人来说真的没有帮助。这就像告诉你的医生“很痛”,但没有指向你身体的某个地方。 edit 您的问题是为了显示准确、完整的错误消息,并告诉我们您的代码的哪一行抛出了它。还请展示您在发生这种情况时尝试处理的数据示例。我们需要问题的minimal reproducible example,而不是一些无法解释的代码和半条错误消息。另见How to Ask。请记住,我们并没有越过你的肩膀。谢谢:-)
  • 除了您描述的问题之外,为什么您重复两次foreach 而不是两次都使用第一次?
  • 另外请在使用前阅读标签说明。 “web”标签的描述以“不要使用这个标签”开头......!可能一个 phpspreadsheet 标记将是有用的,也许日期时间。您也可以在编辑时重新标记它。
  • 不要只告诉我们错误消息的行号。通过评论或其他内容向我们展示导致崩溃的行。而且,如果您可以使用调试器安装 IDE,那么您就可以逐步完成这类事情并检查您的实际数据是否符合您的期望。
  • edit向我们展示$row[$column2]的文本内容,或者print_r( $row[$column2] )的输出。

标签: php spreadsheet phpoffice-phpspreadsheet


【解决方案1】:

我猜这是您代码中的违规行;这是唯一使用->format() 方法的行。

json_encode(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[$column2])->format('Y'));

让我们试着把它分成多行以便可读。

$excelDatestamp = $row[$column2];
$dto = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject( $excelDatestamp ); 
$year = $dto->format( 'Y' );
json_encode( $year );

在我看来,您的代码重构所生成的$excelDatestamp 格式可能不正确。这使得::excelToDateTimeObject() 返回false,让你知道你有一个错误。然后你尝试像(false)->format( 'Y' ) 这样调用格式方法。这就是为什么 php 抛出了你向我们展示的错误信息。

而且,您不会对 json_encode() 的输出做任何事情,所以即使一切正常,它也会丢失。

【讨论】:

  • 你知道格式化日期的方法吗?当我尝试显示 $row[$column2] 时,它提供了正确的日期,但我不知道为什么它在尝试显示时总是显示 1970格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2020-02-15
  • 1970-01-01
  • 2018-09-10
  • 2017-07-31
  • 2020-10-04
  • 2016-04-20
相关资源
最近更新 更多