Gereksinimler ve Ön Hazırlık
Dinamik bir veri dışa aktarma modülü oluşturmak için öncelikle projenizde gerekli olan bağımlılıkları yüklemelisiniz. Veri formatlama ve dosya indirme işlemleri için "xlsx" (SheetJS) kütüphanesi, endüstri standardı olarak kabul edilmektedir. Bu kütüphane, verileri Excel (.xlsx) veya CSV formatına dönüştürmek için oldukça hızlı ve güvenilirdir.
Projenize başlamadan önce terminalinizde aşağıdaki komutu çalıştırarak gerekli paketleri yükleyin:
npm install xlsx
Bu kütüphane, veriyi JSON formatından Excel dosya yapısına dönüştüren fonksiyonlar sağlar. Ayrıca, React bileşenlerinizde veriyi yönetmek için en az React 18+ sürümünü kullanmanızı öneririz. Bu sürüm, "Concurrent Rendering" (eşzamanlı işleme) özellikleri sayesinde büyük veri setlerini işlerken arayüzün kilitlenmesini engellemeye yardımcı olur.
Veri Dışa Aktarma Modülünün Temel Yapısı
Dinamik bir modül, herhangi bir veri setini kabul edebilmeli ve bunu istenen formata dönüştürebilmelidir. İlk adım olarak, veriyi işleyecek ve indirme işlemini başlatacak olan yardımcı fonksiyonumuzu (utility function) oluşturalım. Bu fonksiyon, uygulamanın herhangi bir yerinden çağrılabilir olmalıdır.
import * as XLSX from 'xlsx';
export const exportToExcel = (data, fileName) => {
const worksheet = XLSX.utils.json_to_sheet(data);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, "Veriler");
XLSX.writeFile(workbook, `${fileName}.xlsx`);
};
Yukarıdaki kod, aldığı JSON dizisini bir Excel çalışma sayfasına dönüştürür ve tarayıcı üzerinden otomatik indirme işlemini başlatır. json_to_sheet metodu, nesne anahtarlarını otomatik olarak sütun başlıklarına dönüştürerek iş yükünüzü azaltır.
React Bileşeni İle Dinamik Buton Oluşturma
Modülü kullanıcıya sunmak için temiz bir arayüz bileşeni gereklidir. Bu bileşen, dışa aktarılacak veriyi ve dosya ismini prop olarak almalıdır. Aşağıdaki örnekte, kullanıcının butona bastığında veriyi dışa aktardığı basit bir yapı bulunmaktadır.
import React from 'react';
import { exportToExcel } from './utils/exportUtils';
const ExportButton = ({ data, fileName }) => {
return (
exportToExcel(data, fileName)}>
Excel Olarak İndir
);
};
Bu bileşeni sayfanızın herhangi bir yerine ekleyebilir ve data prop'una API'den gelen veriyi geçebilirsiniz. Bileşen, verinin yapısından bağımsız çalıştığı için oldukça dinamiktir.
Büyük Veri Setlerinde Performans Optimizasyonu
Binlerce satırdan oluşan verileri dışa aktarırken, tarayıcıda "donma" (UI freezing) yaşanabilir. Bunu engellemek için JavaScript'in "Web Workers" yapısını veya "useTransition" hook'unu kullanmalıyız. Aşağıdaki kod, büyük verileri işlerken arayüzü nasıl akıcı tutacağımızı gösterir.
import { useTransition } from 'react';
const ExportHandler = ({ data }) => {
const [isPending, startTransition] = useTransition();
const handleExport = () => {
startTransition(() => {
exportToExcel(data, 'Rapor');
});
};
return (
{isPending ? 'İşleniyor...' : 'Dışa Aktar'}
);
};
useTransition kullanımı, dışa aktarma işleminin düşük öncelikli bir görev olarak işaretlenmesini sağlar. Böylece kullanıcı arayüzü, işlem arka planda yapılırken yanıt vermeye devam eder.
Veri Formatlama ve Güvenlik Uyarıları
Veri dışa aktarırken en önemli konulardan biri, verinin doğruluğu ve güvenliğidir. Özellikle kullanıcıdan gelen verileri dışa aktarıyorsanız, XSS (Cross-Site Scripting) saldırılarına karşı veriyi mutlaka temizlemelisiniz. Ayrıca, hassas verilerin (şifreler, özel anahtarlar vb.) dışa aktarılmadığından emin olun.
Kritik Güvenlik Uyarısı: Dışa aktarma modülüne gönderdiğiniz verileri mutlaka filtreleyin. Kullanıcı tarafından girilen metinlerdeki HTML etiketlerini temizleyin ve asla şifre veya kişisel tanımlayıcı bilgileri (KVKK kapsamındaki veriler) dışa aktarılacak JSON nesnesine dahil etmeyin.
Veriyi dışa aktarmadan önce belirli sütunları seçmek veya yeniden adlandırmak için bir yardımcı fonksiyon kullanabilirsiniz:
const formatData = (rawData) => {
return rawData.map(item => ({
"Ad Soyad": item.fullName,
"E-posta": item.email,
"Kayıt Tarihi": new Date(item.createdAt).toLocaleDateString()
}));
};
Yöntemlerin Karşılaştırılması
Veri dışa aktarma işlemlerinde kullanabileceğiniz farklı yöntemlerin avantaj ve dezavantajları aşağıda özetlenmiştir:
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| XLSX Kütüphanesi | Zengin özellik, Excel desteği | Paket boyutu biraz büyüktür |
| CSV Native | Hafif, kütüphane gerektirmez | Excel formatlama desteği yok |
| Server-Side Export | Büyük veriler için çok hızlı | Sunucu yükü oluşturur |
Sıkça Sorulan Sorular
Dışa aktarma sırasında neden "undefined" hatası alıyorum?
Bu genellikle verinin henüz yüklenmediği veya boş bir dizi olduğu durumlarda yaşanır. Veriyi dışa aktarmadan önce data && data.length > 0 kontrolü yapmalısınız.
Excel dosyasında tarih formatı bozuk görünüyor, ne yapmalıyım?
Excel, tarihleri sayısal değer olarak saklar. Veriyi dışa aktarmadan önce JavaScript'te toLocaleDateString() ile formatlayarak string olarak göndermek, Excel'in bunu metin olarak doğru tanımasını sağlar.
Mobil cihazlarda indirme çalışmıyor, neden?
Bazı mobil tarayıcılar, blob nesneleri üzerinden dosya indirmeyi kısıtlayabilir. XLSX.writeFile metodu genellikle modern tarayıcılarda sorunsuz çalışır; ancak eski tarayıcılar için bir polyfill gerekebilir.
Çok büyük verilerde tarayıcı çöküyor, çözüm nedir?
Veriyi küçük parçalara ayırarak (pagination) dışa aktarmayı deneyin veya veriyi doğrudan sunucudan bir CSV dosyası olarak stream edin.
Dosya ismini dinamik olarak nasıl verebilirim?
exportToExcel fonksiyonuna ikinci parametre olarak dosya ismini dinamik bir değişken (örneğin: `Rapor_${new Date().getTime()}.xlsx`) şeklinde geçebilirsiniz.
Gelişmiş Senaryo: Sunucu Taraflı (Server-Side) Veri İşleme ve Streaming
İstemci tarafında (Client-side) veri işlemek, tarayıcının bellek kapasitesiyle sınırlıdır. Eğer milyonlarca satırlık verilerle çalışıyorsanız, tarayıcının çökmesini engellemek için "Server-Side Streaming" yöntemini kullanmalısınız. Bu yöntemde, veriler sunucudan parça parça (chunk) çekilir ve doğrudan bir ReadableStream üzerinden dosyaya dönüştürülür.
Aşağıdaki örnekte, fetch API'si ile sunucudan gelen veriyi nasıl işleyebileceğinizi görebilirsiniz:
const exportLargeData = async () => {
const response = await fetch('/api/export-large-data', {
method: 'POST',
headers: { 'Content-Type': 'application/json' }
});
const reader = response.body.getReader();
const stream = new ReadableStream({
start(controller) {
function push() {
reader.read().then(({ done, value }) => {
if (done) {
controller.close();
return;
}
controller.enqueue(value);
push();
});
}
push();
}
});
const newResponse = new Response(stream);
const blob = await newResponse.blob();
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'buyuk_veri_seti.csv';
a.click();
};
Alternatif Kütüphane Karşılaştırması: SheetJS vs. ExcelJS
Dışa aktarma işlemlerinde en çok tercih edilen iki kütüphane olan SheetJS (xlsx) ve ExcelJS arasında seçim yaparken projenizin ihtiyaçlarını göz önünde bulundurmalısınız. Aşağıdaki tablo, bu iki kütüphanenin temel farklarını özetlemektedir:
| Özellik | SheetJS (xlsx) | ExcelJS |
|---|---|---|
| Hız | Çok Yüksek | Orta |
| Stil Desteği | Sınırlı (Pro sürüm gerektirir) | Gelişmiş (Renk, kenarlık, font) |
| Dosya Boyutu | Küçük | Daha Büyük |
| Kullanım Alanı | Hızlı veri aktarımı | Raporlama ve şablon oluşturma |
ExcelJS ile Stil Uygulama Örneği
Eğer dışa aktardığınız dosyanın profesyonel bir görünüme sahip olmasını istiyorsanız, ExcelJS kullanarak hücrelere stil verebilirsiniz:
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('Rapor');
worksheet.columns = [
{ header: 'ID', key: 'id', width: 10 },
{ header: 'Ad Soyad', key: 'name', width: 30 }
];
// Başlık satırını stillendirme
worksheet.getRow(1).font = { bold: true, color: { argb: 'FFFFFF' } };
worksheet.getRow(1).fill = {
type: 'pattern',
pattern: 'solid',
fgColor: { argb: '4F81BD' }
};
const buffer = await workbook.xlsx.writeBuffer();
// Blob oluşturma ve indirme işlemleri...
İpucu: Kullanıcı deneyimini artırmak için, dışa aktarma işlemi devam ederken bir loading durumu (örneğin bir spinner veya ilerleme çubuğu) göstermeyi unutmayın. Büyük dosyalarda kullanıcıya "İşlem devam ediyor, lütfen bekleyin" mesajı vermek, uygulamanızın kalitesini doğrudan artıracaktır.
Sonuç
React ile dinamik bir veri dışa aktarma modülü oluşturmak, uygulamanızın profesyonelliğini artıran ve kullanıcıların iş süreçlerini kolaylaştıran bir özelliktir. Bu rehberde, temel kurulumdan performans optimizasyonuna ve güvenlik önlemlerine kadar izlemeniz gereken yolu adım adım inceledik. Bir sonraki adım olarak, dışa aktarma modülünüze "sütun seçimi" veya "filtreleme" gibi gelişmiş kullanıcı arayüzü özellikleri ekleyerek modülünüzü daha da özelleştirebilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce, verilerin doğruluğunu ve güvenlik standartlarına uygunluğunu (özellikle KVKK ve GDPR uyumluluğu) kendi sisteminizde test etmeniz ve doğrulamanız gerekmektedir.

Yorumlar (0)
Yorum Yaz