.NET ekosisteminde Excel işlemleri denildiğinde akla gelen paketlerden
biri Microsoft.Office.Interop.Excel
olsa da, sunucu bağımlılıkları, bellek sızıntıları ve performans darboğazları
günümüz modern uygulamalarında bu yaklaşımı sürdürülemez kılıyor.
Bu yazıda, uygulamada bulunan Interop paketinden, EPPlus'a nasıl geçiş yaptığımızı ele alıyoruz. Bu süreçte, bir yapay zeka aracı olan Claude'dan planlama ve mimari öneriler konusunda nasıl yararlandığımızı, ancak en önemlisi gelen AI çıktısını mühendislik bakış açısıyla değerlendirerek canlı ortamda çalışır duruma getirme sürecini adım adım paylaşıyorum.
Neden Interop'tan EPPlus'a Geçişe İhtiyaç Duyuldu?
1. Office Uygulaması Bağımlılığı
Microsoft.Office.Interop.Excel
kütüphanesi, uygulamanın çalıştığı sunucuda
Microsoft Excel uygulamasının kurulu olmasını zorunlu kılar. Bu
durum, canlı ortamda ciddi riskler doğurur.
-
Versiyon Uyumsuzluğu: Sunucudaki Excel versiyonunda yapılacak güncellemeler, projenin bağımlı olduğu COM bileşenlerini bozarak çalışma esnasında hatalara yol açabilir.
-
Sunucu Maliyeti ve Lisanslama: Sunucu ortamlarına Office kurmak hem güvenlik/bakım yükü getirir hem de ek lisans maliyeti yaratır.
EPPlus ise bir
OpenXML işleyicisidir; arka planda Office kurulumu gerektirmeden
.xlsx
dosyalarını bellek üzerinde doğrudan oluşturur ve yönetir.
2. Kaynak Yönetimi
Interop kullanırken en sık karşılaşılan sorunlardan biri, arka planda
kapanmayan excel process'leridir. Bir Excel process'i tamamlansa bile
unmanaged COM nesneleri bellekten düzgün temizlenmediğinde sunucuda
onlarca
excel.exe
süreci birikir ve kaynakları tüketir.
-
Interop Yaklaşımı: Her nesne için
Marshal.ReleaseComObject()çağırmak, karmaşıktry-finallyblokları yazmak veapp.Quit()ile süreci manuel öldürmek gerekir (ve bu bile her zaman garanti çözüm değildir). -
EPPlus Yaklaşımı: COM yaşam döngüsü yoktur.
IDisposablepattern desteği sayesinde standart birusingbloğu tüm kaynak temizliğini otomatik üstlenir. Bu da kod karmaşıklığını azaltırken kaynak yönetimini sadeleştirir.
3. Platform Bağımsızlığı
-
Interop: Yalnızca Windows sunucularda çalışır.
-
EPPlus: .NET Core ve sonraki sürümlerle birlikte farklı işletim sistemleri üzerinde de çalışır.
AI Destekli Migration Planlaması
Bu geçiş sürecinde mimari planlamayı hızlandırmak adına yapay zeka araçlarından Claude'dan (model olarak Sonnet 4.6 modeli) bir yol haritası taslağı oluşturmasını istedim.
Claude, kullanılan dili ve paketleri net bir şekilde tanımlayan basit bir prompt ile adımları oluşturdu.
Prompt: "Create a migration plan from Microsoft.Interop.Excel to EPPlus for C# application."
|
|
| Migration aşamaları |
1. Aşama – Kurulum ve Mevcut Kodun Analizi
NuGet Package Manager üzerinden projenin .NET versiyonuna uygun
EPPlus paketi
kurulduktan sonra
Microsoft.Office.Interop.Excel
referansı projeden kaldırıldı.
a) Lisans Yapılandırması (EPPlus 5.0 / LicenseContext)
EPPlus, çalışma zamanında (runtime) lisans ayarının yapılmasına ihtiyaç duymaktadır. Tanımlanmadığı takdirde uygulama işlem sırasında lisans hatası verecektir.
-
Ticari kullanım için ücretli bir lisansa ihtiyaç vardır (
LicenseContext.Commercial). -
Ticari olmayan kullanım ise ücretsizdir (
LicenseContext.NonCommercial).
|
|
| EPPlus LicenseContext tipleri |
-
.NET Core ve üzeri versiyondaki projelerde bu ayar
Program.csveyaStartup.csiçerisinde uygulamanın başlangıç noktasına eklenir. -
.NET Framework projelerinde ise
web.configveyaapp.configdosyasındaki<appSettings>bölümünden tanımlanabilir.
b) Mevcut Kodların Temizlenmesi ve Dönüştürülmesi
Kurulum ve lisans ayarlarının ardından, projedeki kaynak kodları ve referanslar taranarak Interop kullanımları ortaya çıkarıldı. Sonraki aşamalarda EPPlus paketindeki karşılıklarına göre değişiklikler yapılabilir. Projenizde bulunması muhtemel olan ve silinmesi/değiştirilmesi gereken temel Interop yapıları aşağıdaki tablo üzerinden inceleyebilrsiniz.
|
|
| Interop → EPPlus karşılığı |
2. Aşama - Interop API'lerinin EPPlus'a Taşınması
Interop kütüphanesinde önce bir Excel.Application
nesnesi başlatılır, sunucu ortamında Excel arayüzü açılmaması için Visible = false
yapılır ve ardından dosya verilen yoldan açılır.
EPPlus'ta ise
Application
nesnesi veya COM yaşam döngüsü yoktur. Mevcut bir Excel dosyası veya yeni bir
dosya ile yapılan işlemler, using
bloğu içerisinde
ExcelPackage
nesnesi ile yönetilir:
b) Workbook / Worksheet
c) Index Farklılıkları
Worksheet ile çalışırken index bilgisine dikkat edilmelidir. Interop'ta koleksiyonlar 1-indexed başlarken (Worksheets[1]), EPPlus'ta 0-indexed mimari geçerlidir (Worksheets[0]). Ancak hücre erişimlerinde (Cells[row, col]) her iki kütüphane de 1-indexed yapıyı kullanır.
Birden fazla index ile çalışılırken, mevcut bir sheet'e index ile erişmeye çalışmak potansiyel bir hata oluşturabilir. Bu hata ile karşılaşmamak için; Claude'un yönlendirmesiyle sheet sırasına bağımlılığı ortadan kaldırdığı için daha güvenli ve sürdürülebilir bir yaklaşımdır.
EPPlus dokümantasyonu da bu bilgiyi doğrulamaktadır.
d) Cells / Range
Temel hücre erişim senaryolarında API'lerin birbirine oldukça yakın olması sayesinde hücre okuma, yazma ve döngü kodlarınızı minimum eforla taşıyabilirsiniz.
ws.Cells[1, 1].Value
veya
ws.Cells["A2"].Value
gibi temel kullanım kalıpları iki kütüphanede de aynıdır.
|
|
Interop'ta dosya kaydetme işlemi, Workbook nesnesinin SaveAs metodu üzerinden dosya yolu ve formatının parametre olarak verilmesiyle gerçekleştirilir. Devamında gelen satırlarda workbook Close() metoduyla kapatılıp Excel uygulamasından çıkış işlemini gerçekleştirmek için Excel.Application'den app.Quit() fonksiyonu kullanılır.
Marshal.ReleaseComObject
ile tüm unmanaged nesnelerin sırayla serbest bırakılması ve ardından
GC.Collect()
çağrılması bile zaman zaman arka planda asılı kalan süreçleri
engelleyemeyebilir.
EPPlus nesneleri yönetilen bellek üzerinde çalıştığından,
using bloğunun
kapanmasıyla birlikte kaynaklar otomatik serbest bırakılır. Arka planda
sonlandırılması gereken bir Excel process'i olmadığı için
app.Quit() veya
ReleaseComObject
kodlarına ihtiyaç kalmaz.
SaveAsAsync desteği, asenkron işlem gerektiren .NET uygulamalarında kullanılabilecek bir
alternatif sunar.
3. Aşama - Stil Yönetimi ve Formatlama İşlemleri
Bu aşamada hücre formatları, stil nesne hiyerarşisi, alan (range) tanımlamaları ve sütun hizalamaları gibi görsel/yapısal dönüştürmelere odaklanıyoruz.
a) Sayı/Tarih Formatları ve Sütun Genişliği
Interop ve EPPlus paketleri arasında
NumberFormat
erişim noktalarında önemli bir mimari fark bulunmaktadır:
-
Interop: Hücre üzerinden doğrudan
.NumberFormatözelliğine erişilerek atama yapılır. -
EPPlus: Tüm nesne biçimlendirmeleri bir nesne hiyerarşisine bağlıdır. Biçimlendirme doğrudan hücreye değil,
Style.NumberFormat.Formatproperty'sine atanır.
ws.Columns[1].ColumnWidth
kullanımına karşın EPPlus,
ws.Column(1).Width
şeklinde daha akıcı ve okunabilir bir metot yapısı sunar.
AutoFitColumns()
kullanılabilir.
Özellikle Interop'taki dinamik iki hücre arası alan alma (get_Range) kodunu EPPlus'a dönüştürmek için Claude'a şu prompt'u verdim:
Prompt: "Convert this code to epplus
Excel.Range rng = sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[5,
1]);"
Claude’un verdiği bu çıktıyı
EPPlus dokümantasyonundan teyit ettiğimde, kütüphanenin
Cells[startRow, startColumn, endRow, endColumn]
şeklinde 4 parametreli bir overload (Item[Int32, Int32, Int32, Int32]) sunduğunu ve üretilen kodun ilgili senaryo için doğru olduğunu
doğruladım.
c) Kenarlık (Border), Font ve Hizalama İşlemleri
Kenarlık çizgileri, kalın yazı tipi (bold) ve yatay/dikey hizalamalar için Interop kodlarını EPPlus'a çevirmesini Claude'dan istedim.
İnceleme sonucunda tespit ettiğim ana farklar:
-
Style Hiyerarşisi: EPPlus tarafında her türlü görsel müdahale
rng.StylealtındakiBorder,FontveyaHorizontalAlignmentgibi alt gruplara ayrılmıştır. -
Enum Tipleri: Interop'taki
XlLineStyleveyaXlHAlignenum yapılarının yerini EPPlus'taExcelBorderStyleveExcelHorizontalAlignmentalmıştır.
Excel oluşturma senaryolarındaki iş akışları test edildiğinde Interop kütüphanesi ile aynı çıktıyı aldım. Başlıkların kalınlığı, hücre hizalamaları, border çizgileri ve verilerin belirtilen hücrelere yazılması kontrol listemde yer alıyordu.
4. Aşama - Migration Sonrası Kontrol Listesi
Geçiş sürecini tamamlayıp kodu yayına almadan önce, projede unutulmuş legacy kalıntıların temizlendiğinden ve EPPlus entegrasyonunun eksiksiz çalıştığından emin olunmalıdır.
- Artık gerekli olmayan tüm Marshal.ReleaseComObject() çağrılarının kod tabanından tamamen kaldırıldığını doğrulayın.
- app.Quit() ve Excel işlem sonlandırmaya yönelik yazılmış manuel işlem sonlandırma kodlarını temizleyin.
-
Arka planda takılı kalan COM nesnelerini zorla temizlemek için yazılmış
GC.Collect()veGC.WaitForPendingFinalizers()çağrılarını silin. -
Worksheetkoleksiyonuna erişilen tüm noktalarda indeks değerlerinin 1 tabanlıdan (Interop) 0 tabanlıya (EPPlus) dönüştürüldüğünü teyit edin. -
ExcelPackage.LicenseContexttanımının uygulamanın başlangıç noktasında (Program.cs/Startup.csveyaweb.config) doğru ayarlandığını doğrulayın. - Eski Interop kütüphanesi ile üretilen dosyaları yeni EPPlus çıktıları ile birebir karşılaştırarak teyit edin.
Özetle;
Microsoft.Office.Interop.Excel
yapısından EPPlus'a
geçiş, Office bağımlılığını ortadan kaldırarak daha sade ve modern bir
mimariye geçmemizi sağladı.
Bu dönüşüm sürecinde Claude (Sonnet) yapay zeka modelini mimari planlama ve kod dönüştürme aşamalarında destekçi olarak kullandık. Ancak sürecin en kritik noktası, AI tarafından üretilen her çıktının mühendis gözüyle incelenmesi, resmi dokümantasyonlarla doğrulanması ve test süzgecinden geçirilmesiydi.
Doğru yönlendirmeler (prompting) ve insan kontrolü bir araya geldiğinde, hem zaman alıcı refactoring süreçleri ciddi oranda hızlanıyor hem de canlı ortam için güvenli sonuçlar elde ediliyor.
Yazının faydalı olmasını umarak, çalışmalarınızda kolaylıklar diliyorum :)
Yorumlar
Yorum Gönder