AI Destekli Refactoring: Microsoft.Office.Interop.Excel'den EPPlus'a Geçiş

.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şık try-finally blokları yazmak ve app.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. IDisposable pattern desteği sayesinde standart bir using bloğ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ı

Claude'un oluşturduğu plandaki aşamalar, temel olarak yol haritası olup projenin ihtiyacına göre önerileri değerlendirdim ve projeme uygun şekilde geçişe başladım. Claude'un önerdiği kod yapılarını EPPlus dokümantasyonundan doğrulamaya özen gösterdim. 

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.cs veya Startup.cs içerisinde uygulamanın başlangıç noktasına eklenir.

  • .NET Framework projelerinde ise web.config veya app.config dosyası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ı

a) Application → ExcelPackage

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

ExcelPackage üzerinden Workbook'a, Workbook üzerinden de Worksheets koleksiyonuna erişilir.

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.


e) Dosya Kaydetme ve Kaynakların Temizlenmesi

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. 


Ayrıca 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.Format property'sine atanır.


Ayrıca sütun genişliği tanımlamalarında Interop'un 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.

Interop'ta hücre aralıklarına Range üzerinden erişilirken, EPPlus'ta bu işlemler Cells üzerinden gerçekleştirilebilir.

b) AutoFit

Sütun genişliklerinin içeriğe göre otomatik ayarlanması için EPPlus'ta 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.Style altındaki Border, Font veya HorizontalAlignment gibi alt gruplara ayrılmıştır.

  • Enum Tipleri: Interop'taki XlLineStyle veya XlHAlign enum yapılarının yerini EPPlus'ta ExcelBorderStyle ve ExcelHorizontalAlignment almış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() ve GC.WaitForPendingFinalizers() çağrılarını silin.
  • Worksheet koleksiyonuna 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.LicenseContext tanımının uygulamanın başlangıç noktasında (Program.cs / Startup.cs veya web.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