如何使用PHPExcel库上传大型Excel文件?

时间:2019-02-05 16:22:08

标签: php phpexcel php-mysqlidb

当我在数据库(phpMySql)中使用php上传excel文件时,出现错误

  

加载文件“”时出错:无法打开供阅读!文件不存在

,Excel中几乎有超过40000行。 如果我要上传具有400-1000行的excel文件,那么它可以正常工作。

我正在使用PHPExcel库。

这是我的代码:

<html>
    <head>
        <title>Import Excel</title>
        <style>
            table {
                border-collapse: collapse;
                width: 100%;
            }

            th, td {
                text-align: left;
                padding: 8px;
            }

            tr:nth-child(even) {background-color: #f2f2f2;}
    </style>

    </head>

    <?php
        require 'Classes/PHPExcel/IOFactory.php';

        $servername = "localhost";
        $username = "root";
        $password = "";
        $dbname = "office";

        if(isset($_POST['upload'])){
            $inputfilename = $_FILES['file']['tmp_name'];
            $exceldata = array();

            $conn = mysqli_connect($servername, $username, $password, $dbname);

            if(!$conn){
                die("Connection Failed: " . mysqli_connect_error());
            }

            try {
                $inputfiletype = PHPExcel_IOFactory::identify($inputfilename);
                $objReader = PHPExcel_IOFactory::createReader($inputfiletype);
                $objPHPExcel = $objReader->load($inputfilename);
            } catch(Exception $e){
                die('Error loading file "'.pathinfo($inputfilename,PATHINFO_BASENAME).'": '.$e->getMessage());
            }

        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow();
        $highestColumn = $sheet->getHighestColumn();

        for($row = 2; $row <= $highestRow; $row++) {
            $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);

            $sql = "INSERT INTO allsec (emp_code, emp_full_name, request_type, leave_status, leave_from, leave_to, days, year, month, pl, pm, lpm, status, emp_name, wg, leave_type)
        VALUES ('".$rowData[0][0]."', '".$rowData[0][1]."', '".$rowData[0][2]."', '".$rowData[0][3]."', '".$rowData[0][4]."', '".$rowData[0][5]."', '".$rowData[0][6]."', '".$rowData[0][7]."', '".$rowData[0][8]."', '".$rowData[0][9]."', '".$rowData[0][10]."', '".$rowData[0][11]."', '".$rowData[0][12]."', '".$rowData[0][13]."', '".$rowData[0][14]."', '".$rowData[0][15]."')";

            if(mysqli_query($conn, $sql)){
                $exceldata[] = $rowData[0];
            } else{
                echo "Error: " .$sql . "<br>" . mysqli_error($conn);
            }

        }


        echo "<table border='1'>";
        foreach($exceldata as $index => $excelraw){
            echo "<tr>";
            foreach($excelraw as $excelcolumn){
                echo "<td>".$excelcolumn."</td>";
            }
            echo "</tr>";
        }
        echo "</table>";

        mysqli_close($conn);

    }
    ?>
    <body>
        <form action="" method="POST" enctype="multipart/form-data">
                <input type="file" name="file" >
                <input type="submit" name ="upload" value="upload">
        </form> 
    </body>
</html>

1 个答案:

答案 0 :(得分:1)

如果文件太大,则需要修改php.ini文件。默认情况下,您只能上传大小为8MB的文件。尝试将以下值更改为40 M,然后重新启动服务器。

;上载文件的最大允许大小。 upload_max_filesize = 40M

;必须大于或等于upload_max_filesize post_max_size = 40M

另一个原因可能是您的数据(40000个excel行)执行所花的时间比分配给在服务器上执行脚本的最大时间所花的时间更多。要更改默认的最大时间,您需要更改Apache服务器上的max_input_time设置(如果使用其他服务器,请搜索类似的设置)。

此链接将帮助您更改服务器超时设置- https://stackoverflow.com/a/8744184/10602679