我是从 Excel 文件导入到 Mysql,但结果是 1970-01-01

Posted

技术标签:

【中文标题】我是从 Excel 文件导入到 Mysql,但结果是 1970-01-01【英文标题】:I'm Import to Mysql from Excel files, but the results are 1970-01-01 【发布时间】:2016-07-05 20:12:10 【问题描述】:

,这是我的代码:

// server info
$server = 'localhost';
$user = 'root';
$pass = '';
$db = 'agenda';

// connect to the database
$mysqli = new mysqli($server, $user, $pass, $db);

// show errors (remove this line if on a live site)
mysqli_report(MYSQLI_REPORT_ERROR);

?>

<?php
require 'classes/phpexcel.php';
require_once 'classes/phpexcel/iofactory.php';
$inputFileName  = 'database/sql/agenda.xlsx';
$inputFileType  = 'Excel2007';
$objReader      = PHPExcel_IOFactory::createReader("$inputFileType");
$objReader->setReadDataOnly(true);
$objPHPExcel    = $objReader->load("$inputFileName");
$objWorksheet   = $objPHPExcel->getActiveSheet();
$highestRow     = $objWorksheet->getHighestRow();
$highestColumn  = $objWorksheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);

// view in table
echo '<table>' . "\n";
for ($row = 1; $row <= $highestRow; ++$row) 
    echo '<tr>' . "\n";
    for ($col = 0; $col <= $highestColumnIndex; ++$col) 
        echo '<td>' . $objWorksheet->getCellByColumnAndRow($col, $row)->getValue() . '</td>' . "\n";
    
    echo '</tr>' . "\n";

echo '</table>' . "\n";

//input to mysql
for($row = 2; $row <= $highestRow; ++$row) 
    for($col = 0; $col < $highestColumnIndex; ++$col)   
        $rows[$col] = $objWorksheet->getCellByColumnAndRow($col, $row); 
    
    $id   ="$rows[0]";
    $ts   ="$rows[1]";
    $pd   ="$rows[2]";

    $get_data1  = "$rows[3]";
    $st   = date("Y-m-d", strtotime ($get_data1));

    $stm  ="$rows[4]";

    $get_data2  ="$rows[5]";
    $et   = date("Y-m-d", strtotime ($get_data2));

    $etm  ="$rows[6]";
    $g    ="$rows[7]";
    $w    ="$rows[8]";
    // Prepared Statement
    $stmt = $mysqli->prepare("INSERT INTO `keyin` VALUES ('$id', '$ts', '$pd', '$st', '$stm', '$et', '$etm', '$g', '$w')");
    //Prepared Statement Bound$stmt->bind_param('sssssssss', $id, $ts, $pd, $st, $stm, $et, $etm, $g, $w);     


    //Prepared Statement Executed 
    $stmt->execute();
    printf("%s Row Inserted.\n", $stmt->affected_rows);
    //Prepared Statement Closed
    $stmt->close();

    // If you don't want to use prepared statement, you can use this one

    $mysqli->query("INSERT INTO users (Username,Email,Gender,Country) VALUES ('$rows[0]', '$rows[1]', '$rows[2]', '$rows[3]')");

$mysqli->close();

【问题讨论】:

听起来像是 $get_data1/$rows[3] 中的无效日期/时间戳var_dump($rows[3]) 能得到什么? 我从 excel 文件中得到的结果是 = 42604 这不是时间戳或字符串格式的日期。确定它是正确的列? excel 中显示的等效日期是多少? @Jeff 时间戳在 excel 中不计入 PHP 中。在 Excel 中,“时间”从 1900 开始,数字是天数,而不是 PHP 中的秒数。 ***.com/questions/11172644/… 【参考方案1】:

由于 excel 计算自 1900-01-01 以来的天数,因此您不能使用 strtotime()。

您需要做的是将 excel 天数转换为秒数。

$unix = ($get_data1 - 25569) * 86400; 
$st = date("Y-m-d", $unix);

您的 ~42000 的 excel 值小于以秒为单位的一天 (86400),因此您在 php 中得到 1970-01-01。 如果您在 php 代码中添加时间,您会看到时间大约是 1970 年 1 月 1 日中午。

https://3v4l.org/teI1F

【讨论】:

$st = PHPExcel_Style_NumberFormat::toFormattedString($get_data1, 'YYYY-MM-DD'); 很抱歉忘记从代码中删除 strtotime(),即使我写了它也不能使用....facepalm @EdiHaryono 我不知道它被取消了。但话又说回来,我经常使用 excel 并且我在 php 中编程了很多,但我从未将两者结合起来。好一个!我只知道如何用蛮力解决问题;-)【参考方案2】:

试试这个:

$st = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($get_data1));

【讨论】:

欢迎。如果您觉得有用,请为答案投票。

以上是关于我是从 Excel 文件导入到 Mysql,但结果是 1970-01-01的主要内容,如果未能解决你的问题,请参考以下文章

使用 ssis 包导入 excel 到 sql server 失败

PHP把MSSQL数据导入到MYSQL的方法

SQLyog查询数据后如何导到excel

将excel文件导入mysql数据库

将.sql文件导入mysql(最终导入excel)

怎样将EXCEL数据导入到sql中