Как прочитать каждую строку таблицы Excel с помощью SpreadsheetReader inPHP? - PullRequest
0 голосов
/ 23 октября 2019

Я использую SpreadsheetReader для импорта электронной таблицы Excel на сервер MySQL, однако она читает только первую строку. Что я делаю не так в коде и как заставить его читать все строки?

<?php
require_once('../spreadsheet-reader-master/php-excel-reader/excel_reader2.php');
require_once('../spreadsheet-reader-master/SpreadsheetReader.php');

if (isset($_POST["import"])) {

    if (!$db) {
        die("Connection failed: " . mysqli_connect_error());
    }
    $device_type_id = $_POST['device_type_id'];
    $allowedFileType = ['application/vnd.ms-excel', 'text/xls', 'text/xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];


    if (in_array($_FILES["file"]["type"], $allowedFileType)) {

        $targetPath = '../upload/' . $_FILES['file']['name'];
        move_uploaded_file($_FILES['file']['tmp_name'], $targetPath);

        $Reader = new SpreadsheetReader($targetPath);

        $sheetCount = count($Reader->sheets());
        error_reporting(E_ALL ^ E_NOTICE); //this hides all notices that php displays on the page
        for ($i = 0; $i < $sheetCount; $i++) {
            $Reader->ChangeSheet($i);

            foreach ($Reader as $Row) {

                $serial_imei = "";
                if (isset($Row[0])) {
                    $serial_imei = mysqli_real_escape_string($db, $Row[0]);
                }

                $serial_no = "";
                if (isset($Row[1])) {
                    $serial_no = mysqli_real_escape_string($db, $Row[1]);
                }

                if (empty($device_type_id)) {
                    echo "Please select a device type from the dropdown list!";
                }


                if (!empty($serial_no) || !empty($serial_imei) || !empty($device_type_id)) {

                    $query = "INSERT INTO 
                    devices (serial_imei, serial_no, type_id) 
                    VALUES ('$serial_imei', '$serial_no', '$device_type_id')";

                    if (mysqli_multi_query($db, $query)) {
                        echo "New records created successfully";
                    } else {
                        echo "Error: " . $query . "<br>" . mysqli_error($db);
                    }
                    mysqli_close($db);
                }
            }
        }
    } else {
        $type = "error";
        $message = "Invalid File Type. Upload Excel File.";
    }
}
?>

1 Ответ

0 голосов
/ 23 октября 2019

Вы уверены, что листы используют числовые индексы? Глядя на примеры кода в файле readme , они используют foreach для доступа к каждой строке. Я бы попробовал что-то вроде:

foreach ( $Reader->sheets() as $index => $name ) {
    $Reader->ChangeSheet( $index );

    foreach ( $Reader as $Row ) {

        $serial_imei = "";
        if ( isset( $Row[0] ) ) {
            $serial_imei = mysqli_real_escape_string( $db, $Row[0] );
        }

        $serial_no = "";
        if ( isset( $Row[1] ) ) {
            $serial_no = mysqli_real_escape_string( $db, $Row[1] );
        }

        if ( empty( $device_type_id ) ) {
            echo "Please select a device type from the dropdown list!";
        }


        if ( ! empty( $serial_no ) || ! empty( $serial_imei ) || ! empty( $device_type_id ) ) {

            $query = "INSERT INTO
                    devices (serial_imei, serial_no, type_id)
                    VALUES ('$serial_imei', '$serial_no', '$device_type_id')";

            if ( mysqli_multi_query( $db, $query ) ) {
                echo "New records created successfully";
            } else {
                echo "Error: " . $query . "<br>" . mysqli_error( $db );
            }
            mysqli_close( $db );
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...