Php İle Excel Dosyalarından Veri Aktarım Sistemi Nasıl Yapılır?

Php İle Excel Dosyalarından Veri Aktarım Sistemi Nasıl Yapılır?
Php İle Excel Dosyalarından Veri Aktarım Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

PHP ile Excel dosyalarını (XLSX, XLS, CSV) işlemek için günümüzde en güvenilir ve performanslı yöntem PhpSpreadsheet kütüphanesini kullanmaktır. Eski yöntem olan PHP-Excel gibi kütüphaneler artık desteklenmemektedir. Projenizde Composer paket yöneticisinin yüklü olduğundan emin olmalısınız.

Geliştirme ortamınızda şu gereksinimlerin sağlandığından emin olun:

  • PHP 8.2 veya üzeri bir sürüm.
  • Composer paket yöneticisi.
  • php-zip ve php-xml eklentilerinin sunucuda aktif olması.
  • Veritabanı işlemleri için PDO (PHP Data Objects) kullanımı.

Kütüphaneyi projenize dahil etmek için terminalde şu komutu çalıştırın:

composer require phpoffice/phpspreadsheet

Bu komut, projenizin vendor dizinine gerekli tüm bağımlılıkları yükleyecektir. Artık kodlamaya başlamaya hazırsınız.

Adım Adım Excel Dosyası Yükleme Formu Hazırlama

Kullanıcının Excel dosyasını sunucuya göndermesi için güvenli bir HTML formu oluşturmalıyız. Dosya yükleme süreçlerinde güvenlik en önemli konudur; bu nedenle dosya türünü ve boyutunu kısıtlamanız zorunludur.


    Excel Dosyasını Seçin:
    
    Verileri Aktar

Burada enctype="multipart/form-data" özelliği, formun dosya verilerini taşıyabilmesini sağlar. accept özniteliği ise kullanıcının sadece Excel dosyalarını seçmesine yardımcı olur.

PHP ile Excel Dosyasını Okuma ve İşleme

Dosya sunucuya yüklendikten sonra, PhpSpreadsheet kütüphanesini kullanarak verileri okumalıyız. Bu aşamada dosyanın gerçekten bir Excel dosyası olduğunu doğrulamak, güvenlik için kritiktir.

require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\IOFactory;

if (isset($_FILES['excel_file'])) {
    $filePath = $_FILES['excel_file']['tmp_name'];
    $spreadsheet = IOFactory::load($filePath);
    $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);

    // İlk satır başlık ise onu atlayalım
    array_shift($sheetData);

    foreach ($sheetData as $row) {
        $ad = $row['A'];
        $email = $row['B'];
        // Verileri işleme mantığı buraya gelecek
    }
}

IOFactory::load metodu, dosya türünü otomatik algılar. toArray metodu ise Excel sayfadaki verileri kolayca işleyebileceğimiz bir diziye dönüştürür.

Veri Doğrulama ve Güvenli Veritabanı Aktarımı

Excel'den gelen veriye asla güvenmemelisiniz. Veritabanına eklemeden önce mutlaka veri temizleme (sanitization) ve doğrulama (validation) işlemlerini yapmalısınız. SQL Injection saldırılarına karşı mutlaka Prepared Statements kullanın.

$pdo = new PDO('mysql:host=localhost;dbname=test_db', 'user', 'pass');
$stmt = $pdo->prepare("INSERT INTO kullanicilar (ad, email) VALUES (:ad, :email)");

foreach ($sheetData as $row) {
    $ad = htmlspecialchars(trim($row['A']));
    $email = filter_var(trim($row['B']), FILTER_VALIDATE_EMAIL);

    if ($email) {
        $stmt->execute(['ad' => $ad, 'email' => $email]);
    }
}

Bu kod bloğunda filter_var ile e-posta doğrulaması yapılıyor ve PDO ile veriler güvenli bir şekilde veritabanına gönderiliyor.

Excel Aktarım Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
PhpSpreadsheet Çok kapsamlı, tüm formatları destekler Büyük dosyalarda RAM tüketimi yüksek
CSV Okuma (fgetcsv) Çok hızlı, düşük RAM kullanımı Sadece CSV formatı, stil desteği yok
Spout (Box/Spout) Çok büyük dosyalar için optimize edilmiş Özellik seti daha kısıtlı
Kritik Güvenlik Uyarısı: Kullanıcı tarafından yüklenen dosyaları asla doğrudan web kök dizininde saklamayın. Dosyaları /tmp veya dışarıdan erişilemeyen güvenli bir klasöre taşıyın. Ayrıca, dosya uzantısı kontrolü ile birlikte MIME type kontrolü yaparak zararlı scriptlerin (PHP, JS) yüklenmesini engelleyin.

Sıkça Sorulan Sorular

Excel dosyasının boyutu çok büyükse ne yapmalıyım?

Eğer dosya boyutu 50MB üzerindeyse, PhpSpreadsheet yerine "Box/Spout" kütüphanesini kullanmanızı veya işlemi bir "Queue" (kuyruk) yapısı ile arka planda (background process) çalıştırmanızı öneririm.

Neden veritabanına aktarırken hata alıyorum?

Genellikle bu durum, Excel'deki hücre biçimlendirmelerinden kaynaklanır. Verileri alırken trim() fonksiyonu ile boşlukları temizlediğinizden ve veri tiplerinin veritabanı sütunlarıyla eşleştiğinden emin olun.

Hangi Excel formatlarını destekliyorum?

PhpSpreadsheet kütüphanesi XLSX, XLS, CSV, ODS ve HTML formatlarını destekler. Kodunuzda IOFactory kullandığınız sürece bu formatların çoğu otomatik olarak tanınacaktır.

Veri aktarımı sırasında kullanıcıya nasıl geri bildirim veririm?

İşlem uzun sürüyorsa, AJAX kullanarak bir progress bar (yükleme çubuğu) gösterebilir veya işlemi arka planda başlatıp kullanıcıya bir bildirim ID'si döndürebilirsiniz.

Güvenlik için başka ne yapabilirim?

Yüklenen dosyaları mutlaka bir virüs taramasından geçirin ve dosya ismini sunucuda saklarken mutlaka benzersiz (UUID/hash) bir isimle değiştirin.

Performans Optimizasyonu: Büyük Veri Setlerinde Bellek Yönetimi

Excel dosyaları binlerce satıra ulaştığında, standart PhpSpreadsheet kullanımı sunucunun bellek (RAM) limitlerini hızla tüketebilir. Bu durum Fatal error: Allowed memory size of X bytes exhausted hatasına yol açar. Büyük dosyaları işlerken bellek dostu yöntemler kullanmak zorunludur.

Bellek kullanımını düşürmek için Read Filter (Okuma Filtresi) kullanarak dosyanın tamamını değil, sadece ihtiyaç duyulan satırları belleğe yükleyebilirsiniz. Aşağıdaki örnek, dosyayı parçalar halinde okumak için bir filtre sınıfı tanımlar:


class ChunkReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter {
    private $startRow = 0;
    private $endRow = 0;

    public function setRows($startRow, $chunkSize) {
        $this->startRow = $startRow;
        $this->endRow = $startRow + $chunkSize;
    }

    public function readCell($columnAddress, $row, $worksheetName = '') {
        if ($row >= $this->startRow && $row < $this->endRow) {
            return true;
        }
        return false;
    }
}

Bu filtreyi kullanarak verileri 500'erli bloklar halinde işleyebilir, her bloktan sonra veritabanına kaydedip belleği temizleyebilirsiniz. Ayrıca, hücre değerlerini okurken setReadDataOnly(true) metodunu kullanmak, stil ve biçimlendirme verilerini okumayacağı için bellek tüketimini ciddi oranda azaltır.

Hata Ayıklama ve Loglama Stratejileri

Veri aktarım süreçlerinde kullanıcıya sadece "Hata oluştu" demek yerine, hangi satırda ve neden hata oluştuğunu raporlamak sistemin sürdürülebilirliği için kritiktir. Bir hata loglama mekanizması kurarak, geçersiz formatları veya veritabanı kısıtlamalarına takılan satırları izole edebilirsiniz.

Aşağıdaki yapı, hatalı satırları bir diziye toplayarak işlem sonunda kullanıcıya detaylı bir rapor sunmanızı sağlar:


$errors = [];
$rowNumber = 1;

foreach ($sheetData as $row) {
    $rowNumber++;
    try {
        if (empty($row['email']) || !filter_var($row['email'], FILTER_VALIDATE_EMAIL)) {
            throw new Exception("Geçersiz e-posta formatı.");
        }
        // Veritabanı kayıt işlemi...
    } catch (Exception $e) {
        $errors[] = [
            'satir' => $rowNumber,
            'hata' => $e->getMessage()
        ];
    }
}

if (!empty($errors)) {
    // Hataları bir JSON dosyasına yaz veya kullanıcıya göster
    file_put_contents('logs/import_errors_' . time() . '.json', json_encode($errors));
}

Bu yaklaşım, kullanıcının yüklediği dosyadaki hatalı satırları düzeltip tekrar yüklemesine olanak tanır. Özellikle kurumsal uygulamalarda, "Hatalı Satırlar Raporu" indirme özelliği kullanıcı deneyimini (UX) doğrudan iyileştiren bir unsurdur.

İleri İpuçları: Veritabanı İşlemlerini Hızlandırma

  • Transaction Kullanımı: Veritabanına her satır için ayrı sorgu göndermek yerine, 100'lü gruplar halinde BEGIN TRANSACTION ve COMMIT blokları kullanın.
  • Prepared Statements: SQL Injection riskini tamamen ortadan kaldırmak için PDO ile hazırlanan ifadeleri kullanmayı asla ihmal etmeyin.
  • Asenkron İşleme: Çok büyük dosyalar için işlemi arka planda (background job) yürütecek bir kuyruk sistemi (Redis veya RabbitMQ ile) kurun.

Sonuç

PHP ile Excel dosyalarından veri aktarım sistemi kurmak, doğru kütüphaneler ve güvenlik pratikleri ile oldukça verimli bir süreçtir. Bu rehberde PhpSpreadsheet kütüphanesini kullanarak güvenli bir veri işleme hattı oluşturmayı öğrendiniz. Bir sonraki adımınız, büyük ölçekli dosyalar için "Kuyruk Yönetimi" (Queue Management) konusunu araştırmak ve veritabanı işlemlerini optimize etmek olmalıdır.

Yasal Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka kendi güvenlik testlerinizi yapın ve veritabanı bağlantı bilgilerini environment (.env) dosyalarında saklayın.
Bu yazıya tepkinizi paylaşın:
Pelin Aydın

Kullanıcı deneyimi odaklı içerik stratejileri geliştiriyorum. Pratik bilgi arayan okuyucular için en hızlı ve etkili yöntemleri içeren rehberler hazırlıyorum.

Yorumlar (0)

Yorum Yaz