【问题标题】:Import CSV/Excel with PHP into MYSQL使用 PHP 将 CSV/Excel 导入 MYSQL
【发布时间】:2015-02-13 05:28:09
【问题描述】:

在将 CSV/Excel 导入 MYSQL 时遇到了一些问题,坦率地说,不确定这种情况是否可行?抱歉,我没有任何代码,我只是想了解如何执行此操作。

这是偏差:我有一个有 4 列的表,id、userid、starttime、endtime。 ID,是主键。开始时间和结束时间都存储为 DATETIME。 示例:

id    userid      starttime              endtime
1        3    2015-01-18 12:00:00  2015-01-18 16:00:00

我想导入一个布局如下的 excel 表:http://tinypic.com/r/281lyd/8(另外,开始和结束都是自己的列)

问题:

  1. 这可能吗?如果是这样,怎么做?
  2. 如果不是,还有哪些其他替代解决方案可以解决此问题?我需要以某种方式将每周数据导入 mysql 数据库,然后按周将其输出到在线表格中。 (管理员会这样做,但应该不费力或费时。)

【问题讨论】:

  • 看看(phpexcel)[phpexcel.codeplex.com/]
  • @Tiberiu-IonuțStan 对不起,你能解释一下我如何在我的情况下使用它吗?感谢您的评论
  • phpexcel 的使用示例数不胜数,google 一下,或者从链接开始。

标签: php mysql excel csv excel-2010


【解决方案1】:

您可以使用EasyXLS 库来导入 Excel 文件。我不知道你是否需要导入 xls 或 xlsx 文件,所以我下面的源代码是针对 xlsx 的。 xlsx 文件的代码类似。首先将单元格值导入行列表,然后将列表值插入 MySQL 数据库。

// Create an instance of the class that imports Excel files
$xls = new COM("EasyXLS.ExcelDocument");
    
// Import Excel file to List
$rows = $xls->easy_ReadXLSXSheet_AsList("Excel.xls", "Sheet1");

// Iterate List values
for ($rowIndex=0; $rowIndex<$rows->size(); $rowIndex++)
{
        $row = $rows->elementAt($rowIndex);
        for ($cellIndex=0; $cellIndex<$row->size(); $cellIndex++)
        {
            echo "At row ".($rowIndex + 1).", column ".($cellIndex + 1).
                        " the value is '".$row->elementAt($cellIndex)."'<br>";
            // SQL syntax to insert cell value into MySQL database: $row->elementAt($cellIndex)
            ...
        }
}

有关更多技术数据,您可以查看以下链接: http://www.easyxls.com/manual/FAQ/import-excel-to-mysql.html

要将数据插入 MySQL,请使用类似的语法: http://www.w3schools.com/php/php_mysql_insert.asp

并在 SQL 语法的 VALUE 部分使用$row-&gt;elementAt($cellIndex)

对于导入 CSV 文件,您可以使用 easy_ReadCSVFile_AsList 以类似的方式。

【讨论】:

  • 我有 xlsx。这段代码有什么作用?如何将我拥有的列导入到我在 MYSQL 中拥有我的表的列中?我知道它会与 SQL 一起使用,但我不知道如何组合它/写什么。
  • 请帮帮我,我很迷茫,从来没有做过这样的事情,我需要它能够向用户输出东西:(
  • 另外,我要付钱吗?
  • 是的,我知道将数据插入 MYSQL 的语法,但我对我必须使用的查询感到困惑,因为我必须以某种方式将 Excel 表中的日期和时间组合到 mysql 表等中
  • 是的,它是一个商业 Excel 库。 DarkBee 向您推荐了一个免费的。
【解决方案2】:

如果您想使用 csv 而不是 xls 文件,您可以这样做,您可以将 php 脚本和 html 表单放在一个 php 文件中,它应该完全符合您的需要

php 脚本

<?php
    session_start();

$message = null;

$allowed_extensions = array('csv');

$upload_path = 'uploadlocation';

if (!empty($_FILES['file'])) {

    if ($_FILES['file']['error'] == 0) {

        // check extension
        $file = explode(".", $_FILES['file']['name']);
        $extension = array_pop($file);

        if (in_array($extension, $allowed_extensions)) {

            if (move_uploaded_file($_FILES['file']['tmp_name'], $upload_path.'/'.$_FILES['file']['name'])) {

                if (($handle = fopen($upload_path.'/'.$_FILES['file']['name'], "r")) !== false) {

                    $keys = array();
                    $out = array();

                    $insert = array();

                    $line = 1;

                    while (($row = fgetcsv($handle, 0, ',', '"')) !== FALSE) {

                        foreach($row as $key => $value) {
                            if ($line === 1) {
                                $keys[$key] = $value;
                            } else {
                                $out[$line][$key] = $value;

                            }
                        }

                        $line++;

                    }

                    fclose($handle);    

                    if (!empty($keys) && !empty($out)) {

                        $db = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
                        $db->exec("SET CHARACTER SET utf8");

                        foreach($out as $key => $value) {

                            $sql  = "INSERT INTO wherever(`";
                            $sql .= implode("`, `", $keys);
                            $sql .= "`) VALUES (";
                            $sql .= implode(", ", array_fill(0, count($keys), "?"));
                            $sql .= ")";
                            $statement = $db->prepare($sql);
                            $statement->execute($value);

                        }

                        $message = '<span color="green">File has been uploaded successfully</span>';

                    }   

                }

            }

        } else {
            $message = '<span class="red">Only .csv file format is allowed</span>';
        }

    } else {
        $message = '<span class="red">There was a problem with your file</span>';
    }

}
?>

HTML 表单

<table cellpadding="0" cellspacing="0" border="0" class="table">
    <tr>
        <C><label for="file">Select file</label> <?php echo $message; ?></th>
    </tr></h2>
    <tr>
        <td><input type="file" name="file" id="file" size="30" /></td>
    </tr>
    <tr>
        <td><input type="submit" id="btn" class="fl_l" value="Submit" /></td>
    </tr>
</table>

你需要像你的数据库表一样布局你的excel,这个代码才能工作,你需要更改数据库的登录名等。由于这是 Dbo,它应该适用于所有数据库或至少大多数数据库!如果您需要任何帮助,请在下方评论

【讨论】:

  • 有没有办法可以上传 Excel 文件(这种格式类型的电子表格 tinypic.com/r/281lyd/8),它将日期和开始时间字段转换为一个字段作为开始时间和结束时间,并创建一个类似 userid 的 csv 文件, starttime, endtime 还是只上传excel文件?在不转换为 csv 的情况下执行上述操作。对不起,如果我要求太多,但我通常不知道如何处理这个......
  • 如果你修改你的 excel/csv 文件,以便格式与内爆兼容,一切皆有可能。我建议这样制作,但你可以按照自己的喜好制作…………………… …………………………………………………………………………………………………………………………………………………… userid, username, startdate, starttime, endtime
  • 当您从 excel 插入值时,有没有办法合并或连接某种单元格?所以像 startdate 和 starttime 会成为一个值吗?
  • 您可以使用数据库中的触发器来执行此操作我不知道如何通过 php 执行此操作
  • 嘿,我昨晚真的有这个想法!我想我可以这样做 -> 将 excel 按原样插入到 mysql 表中,当它插入时,我会以某种方式连接字符串,然后将其插入到我的实际表中......虽然不知道该怎么做......
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多