Как вы можете указать, с какой позиции столбца начинать импорт данных из excel в mysql


Привет, ребята, у меня проблема с php excel. Проблема в том, что у меня есть файл excel с несколькими строками и столбцами, дело в том, что я хочу импортировать только из определенной позиции строки, например A11 или C12. Как я могу сказать это на php? Вот код выбора столбца:

    $csv_file = $a; 

if (($getfile = fopen($csv_file, "r")) !== FALSE) {

    while(! feof($getfile))
  {
    $data = fgetcsv($getfile, NULL,"\t");
    $col1 = $data[0];
    $col2 = $data[1];
    $col3 = $data[2];
     $col4 = $data[3];
     $col5 = $data[4];
     $col6 = $data[5];
     $col7 = $data[6];
     $col8 = $data[7];

     $query = "INSERT INTO $tableName(cod, den_material, furnizor, cant_reper ,lg, cod_furnizor, obs, data) VALUES('".$col1."','".$col2."','".$col3."','".$col4."','".$col5."','".$col6."','".$col7."','".$col8."')";
    $s=mysql_query($query);
}

Вот полный код:

<?php
if ($_FILES["file"]["error"] > 0)
{
    echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 10240) . " Kb<br>";
    //echo "Stored in: " . $_FILES["file"]["tmp_name"];
    $a=$_FILES["file"]["tmp_name"];
    //echo $a;
    $tableName = str_replace('.txt','',$_FILES["file"]["name"]);    

    $connect = mysql_connect('localhost','root','password');

if (!$connect) {
    die('Could not connect to MySQL: ' . mysql_error());
}   
//your database name
$cid =mysql_select_db('database_test',$connect);
if(mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$tableName."'"))!=1){
    $table = mysql_query("CREATE TABLE `$tableName` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `cod` TEXT NOT NULL,
    `den_material` TEXT NOT NULL,
    `furnizor` VARCHAR(255) NOT NULL,
    `cant_reper` VARCHAR(255) NOT NULL,
    `lg` VARCHAR(255) NOT NULL,
    `cod_furnizor` VARCHAR(255) NOT NULL,
    `obs` TEXT(255) NOT NULL,
    `data` DATE ,
    PRIMARY KEY (`id`)
    );");

    if(!$table){
        die("Upload failed");
    }
}



// path where your CSV file is located
//define('CSV_PATH','C:/xampp/htdocs/');
//<!-- C:\xampp\htdocs -->
// Name of your CSV file
$csv_file = $a; 

if (($getfile = fopen($csv_file, "r")) !== FALSE) {

    while(! feof($getfile))
  {
    $data = fgetcsv($getfile, NULL,"\t");
    $col1 = $data[0];
    $col2 = $data[1];
    $col3 = $data[2];
     $col4 = $data[3];
     $col5 = $data[4];
     $col6 = $data[5];
     $col7 = $data[6];
     $col8 = $data[7];

     $query = "INSERT INTO $tableName(cod, den_material, furnizor, cant_reper ,lg, cod_furnizor, obs, data) VALUES('".$col1."','".$col2."','".$col3."','".$col4."','".$col5."','".$col6."','".$col7."','".$col8."')";
    $s=mysql_query($query);
}


}

echo "<script>alert('Data succesfully added!');window.location.href='index.php';</script>";
//echo "File data successfully imported to database!!";

}
?>

Надеюсь, вы сможете мне помочь, заранее спасибо!:)

Author: Radu Campian, 2015-04-27

1 answers

Справедливое предупреждение: Я никогда не использовал fgetcsv ни для чего, однако я понимаю принцип.

Однако, работая с руководством по php.net Я создал цикл, который начинает чтение только с указанной строки и столбца. Я выбрал случайные значения, но вы можете сделать их такими, какими захотите. A=0, B=1 и так далее. Итак, я сказал что-то вроде всех данных из строки 5 и из col C.

<?php
$row = 1;
$mydata = array();
$wantrow = 4;
$wantcol = 2;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data); // number of fields in the line
        $row++;
        for ($c=0; $c < $num; $c++) {
            if($c<$wantcol){
                // this is what we do not want
            }elseif($row<$wantrow){
                // also we do not want this
            }else{
                // ah-ha, we do want this
                $mydata[$row][$c] = $data[$c];
            }

        }
    }
    fclose($handle);
}
?>

Затем у вас будет двумерный массив значений в этом разделе. Я выбрал выглядеть немного неуклюже, чтобы вы могли легко понять логику того, что я пытаюсь продемонстрировать.

На самом деле вы могли бы сделать его более понятным для чтения следующим образом:

if( ($c>=3) && ($row>=5) ){
    $mydata[$row][$c] = $data[$c];
}

Вы могли бы применить дополнительные ограничения с помощью операторов if и также установить верхний предел, но я уверен, что вы знаете, как это сделать.

if( ($c>=3) && ($c<=22) && ($row>=5) && ($row<=6) ){
    $mydata[$row][$c] = $data[$c];
}

Это даст вам квадрат только внутри от C6 до E23.

Также в вашем приложении вы, вероятно, захотите сделать что-то более полезное, чем просто затолкать данные в массив. Я предполагаю, что вы, вероятно, захотите встроить данные в SQL или что-то в этом роде.

ЙЫМВ. Я не тестировал этот код, но это было бы примерно так.

 1
Author: Matthew Brown aka Lord Matt, 2015-04-27 21:38:00