【问题标题】:Object of class DateTime error when i export data to excel当我将数据导出到 Excel 时,类 DateTime 错误的对象
【发布时间】:2019-11-01 04:02:24
【问题描述】:

我有一个包含许多列的表。有些列包含数值,有些包含文本,有些包含日期。

当我尝试将数据导出到 Excel 时,可以导出数值和值,但是当我想要导出日期数据时,它显示此错误“无法将类 DateTime 的对象转换为字符串”。

我的导出功能的工作方式是,用户可以选择他们想要从 SQL 导出的列通过 PHP 导出到 excel。我的列存储在数组中。以下是我的代码:

   //Get list of selected column from selected checkboxes
    $colarray = $_GET['colarray'];

    //convert string to array 
    $string1 = ['[',']'];
    $string2 = ["",""];
    $newcolarray = str_replace($string1, $string2, $colarray);
    $newarray = explode(",",$newcolarray);

    $filename = "File name " . date('d-M-y') . ".csv"; // Create file name

    $f = fopen('php://memory', 'w');

//Insert column name in first row of excel
    fputcsv($f, $newarray);

    //dynamic Select query statement
    $query = "SELECT "; 
    $query .= $colarray;
    $query .= " FROM OVERALL_SUMMARY_ORIGINAL"; // Get data from Database from OVERALL_SUMMARY_ORIGINAL table
    $stmt = sqlsrv_query($conn, $query);

    while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){

/**how can i place this code $row['Date']->format('d M Y') here***/ 
        fputcsv($f, $row);

    }

    //move back to beginning of file
    fseek($f, 0);

    //set headers to download file rather than displayed
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="' . $filename . '";');

    //output all remaining data on a file pointer
    fpassthru($f);

由于我的列存储在数组中以导出到 csv,任何人都可以帮助我将日期数据转换为字符串吗?

【问题讨论】:

  • 您有评论的地方,请输入$row['Date'] = $row['Date']->format('d M Y');
  • @Nick 这绝对行不通,我必须声明一个变量 $date = $row['Date']->format('d M Y') 但是我在哪里放置 $日期,因为我将数组插入到我的 csv 中,并且数组取决于选定的列。
  • 我的意思是将$row['Date'] 中的DateTime 对象替换为该日期的字符串表示形式。我不明白为什么这不起作用?
  • @Nick 非常抱歉。我误解了你的第一条评论。现在可以了。非常抱歉
  • 完全没问题。我很高兴你能成功。

标签: php excel export-to-csv sqlsrv sql-server-2012-express


【解决方案1】:

使用 PHP Driver for SQL Server,您可以在连接字符串或语句级别使用 'ReturnDatesAsStrings' 选项将 PHP 日期和时间对象作为字符串或作为 DateTime 对象。

如果我正确理解您的情况,SQL 语句中的列是动态的。在这种情况下,您可以尝试在语句级别使用此功能。

<?php

    ...
    $query = "SELECT "; 
    $query .= $colarray;
    $query .= " FROM OVERALL_SUMMARY_ORIGINAL"; // Get data from Database from OVERALL_SUMMARY_ORIGINAL table
    $options = array('ReturnDatesAsStrings' => true);
    $stmt = sqlsrv_query($conn, $query, array(), $options);
    if ($stmt === false) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }
    while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
        fputcsv($f, $row);
    }   
    ...

?>  

当然,另一种选择是使用DateTime::format 方法格式化 PHP DateTime 对象,但在检查这些值是否为 PHP DateTime 对象之后。

<?php

    ...
    $query = "SELECT "; 
    $query .= $colarray;
    $query .= " FROM OVERALL_SUMMARY_ORIGINAL"; // Get data from Database from OVERALL_SUMMARY_ORIGINAL table
    $stmt = sqlsrv_query($conn, $query);
    if ($stmt === false) {
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
    }
    while($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)){
        foreach($row as $key => $value) {
            if ($value instanceof DateTime) {
                $row[$key] = $row[$key]->format('d M Y')
            }
        }
        fputcsv($f, $row);
    }   
    ...

?>

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2021-04-12
    • 2017-12-01
    相关资源
    最近更新 更多