15 اسفند 1398
یک فایل اکسل داریم که میتواند گزارش تراکنشهای بانکی، لیستی از افراد با مشخصات سن، قد و وزن، مشخصات کالاهای انبار و یا هر فهرست دیگری باشد. از شما خواستهاند آنها را به دیتابیس منتقل کنید. هدف ما این است که فایل اکسل یا csv را به برنامه داده و برنامه آن را برای ما به جدولی در دیتابیس منتقل کند. ضمنا هر یک از این دو روش زیر عبارات فارسی را هم پشتیبانی میکند.
1) انتقال فایل csv به دیتابیس
2) انتقال فایل اکسل به دیتابیس
در شروع کار، ابتدا نام دیتابیس و جدولی که قصد داریم دادههای اکسل را به آن منتقل کنیم، در فایلی به نام db.php تعریف میکنیم. لطفا متغیرهای زیر را با اطلاعات دلخواه خود جایگذاری کنید.
<?php $host = "localhost"; //هاست $user = "root"; //نام کاربری $pass = ""; //رمز عبور $db = "my_db"; //نام دیتابیس $table = "my_tbl"; //نام جدول $dsn = "mysql:host=$host;dbname=$db;charset=utf8"; $options = [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { $pdoConn = new PDO($dsn, $user, $pass, $options); } catch (Exception $e) { exit("خطای اتصال"); } ?>
1) جهت انتقال فایل cvs به دیتابیس، باید ابتدا فایل csv را بخوانیم و محتوای آن را در آرایهای ذخیره کنیم؛ سپس آرایه را به دیتابیس انتقال دهیم.
تابعی را با نام CSVtoArray ایجاد میکنیم؛ کار این تابع خواندن فایل csv و ذخیره آن در یک آرایه است. دقت کنید چنانچه فایل csv شما فارسی است، فرمت فایل بایستی utf8 باشد. با این وجود چنانچه کاراکترهای شما خوانا نبود میتوانید در خواندن کاراکترهای فارسی از تابع iconv مطابق مثال زیر استفاده کنید. در این مثال مقادیر نام، نام خانوادگی و نام پدر را از فایل sample.csv - که در سمپل این مقاله موجود است - خوانده و در ستونهای متناظر در جدول دیتابیس وارد میکنیم:
<?php header('Content-Type: text/html; charset=utf-8'); include("db.php"); $path = "sample.csv"; //مسیر فایل $csvArr = CSVtoArray($path); for($i=0;$i<count($csvArr);$i++) { $name = $csvArr[$i][1]; $lastname = $csvArr[$i][2]; $father = $csvArr[$i][3]; //$name = iconv('windows-1256', 'utf-8', $csvArr[$i][1]); //در صورت ناخوانا بودن کلمات //$lastname = iconv('windows-1256', 'utf-8', $csvArr[$i][2]); //در صورت ناخوانا بودن کلمات //$father = iconv('windows-1256', 'utf-8', $csvArr[$i][3]); //در صورت ناخوانا بودن کلمات $sql = "INSERT INTO $table (name,lastname,father) VALUES ('$name','$lastname','$father')"; $stmt = $pdoConn->prepare($sql); $stmt->execute(); } function CSVtoArray($csvFile) { $file_handle = fopen($csvFile, 'r'); while (!feof($file_handle)) $line_of_text[] = fgetcsv($file_handle, 0, ','); fclose($file_handle); return $line_of_text; } ?>
2) برای خواندن فایل اکسل - در این مثال excel.xls - در محیط php میتوان از کتابخانههایی مانند PHPExcel استفاده کرد. این کتابخانه و فایل اکسل را میتوانید از سمپل دانلود کرده و برای این پروژه استفاده کنید.
<?php header('Content-Type: text/html; charset=utf-8'); include("db.php"); include("PHPExcel/IOFactory.php"); $file = "excel.xls"; //مسیر فایل $objPHPExcel = PHPExcel_IOFactory::load($file); foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { $highestRow = $worksheet->getHighestRow(); $highestCol = \PHPExcel_Cell::columnIndexFromString($worksheet->getHighestColumn()); for($row=1; $row<=$highestRow; $row++) { $name = $worksheet->getCellByColumnAndRow(1, $row)->getValue(); $lastname = $worksheet->getCellByColumnAndRow(2, $row)->getValue(); $father = $worksheet->getCellByColumnAndRow(3, $row)->getValue(); $sql = "INSERT INTO myTable (name,lastname,father) VALUES ('$name','$lastname','$father')"; $stmt = $pdoConn->prepare($sql); $stmt->execute(); } } ?>