C#'ta API Yanıtlarını Excel Raporlarına Dönüştürme Yöntemi

C#'ta API Yanıtlarını Excel Raporlarına Dönüştürme Yöntemi

Günümüz veri odaklı dünyasında, işletmeler veri alışverişi için REST API’lerine büyük ölçüde bağımlıdır. Ancak, birçok paydaş bu verileri analiz ve raporlama için Excel formatında tüketmeyi tercih etmektedir. Bu kılavuz, aşağıdaki adımları izleyerek tam bir C# uygulaması oluşturmayı göstermektedir:

  1. REST API’lerine bağlanır
  2. JSON yanıt verilerini alır
  3. Verileri profesyonelce biçimlendirilmiş Excel raporlarına dönüştürür
  4. Grafikler ve tablolar ile görselleştirme ekler

İş Değeri

Bu çözüm, aşağıdaki yollarla önemli bir değer sunar:

  • Manuel veri çıkarma ve rapor oluşturma süreçlerini otomatikleştirir
  • Manuel kopyalamayı ortadan kaldırarak veri doğruluğunu sağlar
  • Tutarlı rapor biçimlendirmesi sunar
  • Planlı rapor üretimini mümkün kılar

Adım Adım Uygulama Kılavuzu

Adım 1: Yeni Bir C# Uygulaması Oluşturun

Yeni bir konsol uygulaması oluşturarak başlayın:

dotnet new console -n ApiToExcelReporter
cd ApiToExcelReporter

Adım 2: Gerekli Paketleri Yükleyin

Gerekli NuGet paketlerini ekleyin:

dotnet add package Aspose.Cells
dotnet add package Newtonsoft.Json
dotnet add package RestSharp

Adım 3: REST API İstemcisini Uygulayın

API iletişimi için bir hizmet oluşturun:

using RestSharp;
using Newtonsoft.Json;
using System;
using System.Threading.Tasks;

public class ApiService
{
    private readonly RestClient _client;
    
    public ApiService(string baseUrl)
    {
        _client = new RestClient(baseUrl);
    }
    
    public async Task<T> GetApiDataAsync<T>(string endpoint, string apiKey = null)
    {
        var request = new RestRequest(endpoint, Method.Get);
        
        // Gerekirse kimlik doğrulama ekleyin
        if (!string.IsNullOrEmpty(apiKey))
        {
            request.AddHeader("Authorization", $"Bearer {apiKey}");
        }
        
        var response = await _client.ExecuteAsync(request);
        
        if (response.IsSuccessful)
        {
            return JsonConvert.DeserializeObject<T>(response.Content);
        }
        
        throw new Exception($"API çağrısı başarısız oldu: {response.ErrorMessage}");
    }
}

Adım 4: JSON Yanıt Verilerini İşleyin

JSON verilerini işlemek için bir sınıf ekleyin:

using Newtonsoft.Json.Linq;
using System.Collections.Generic;

public class DataProcessor
{
    public List<Dictionary<string, object>> FlattenJsonData(string jsonData)
    {
        var results = new List<Dictionary<string, object>>();
        JToken token = JToken.Parse(jsonData);
        
        // Farklı JSON yapılarını ele alın
        if (token is JArray array)
        {
            foreach (var item in array)
            {
                results.Add(FlattenObject(item));
            }
        }
        else if (token is JObject obj)
        {
            // {"data": [{...}, {...}]} gibi iç içe veriler için
            var dataToken = obj["data"] as JArray;
            if (dataToken != null)
            {
                foreach (var item in dataToken)
                {
                    results.Add(FlattenObject(item));
                }
            }
            else
            {
                results.Add(FlattenObject(obj));
            }
        }
        
        return results;
    }
    
    private Dictionary<string, object> FlattenObject(JToken token)
    {
        var result = new Dictionary<string, object>();
        FillDictionary(result, token, "");
        return result;
    }
    
    private void FillDictionary(Dictionary<string, object> dict, JToken token, string prefix)
    {
        switch (token.Type)
        {
            case JTokenType.Object:
                foreach (var prop in token.Children<JProperty>())
                {
                    FillDictionary(dict, prop.Value, 
                        string.IsNullOrEmpty(prefix) ? prop.Name : $"{prefix}.{prop.Name}");
                }
                break;
                
            case JTokenType.Array:
                int index = 0;
                foreach (var item in token.Children())
                {
                    FillDictionary(dict, item, $"{prefix}[{index}]");
                    index++;
                }
                break;
                
            default:
                dict[prefix] = ((JValue)token).Value;
                break;
        }
    }
}

Adım 5: Aspose.Cells ile Excel’e Dönüştürün

Excel dönüşümünü uygulayın:

using Aspose.Cells;
using Aspose.Cells.Utility;
using System;
using System.Collections.Generic;
using System.IO;

public class ExcelReportGenerator
{
    public void GenerateReport(string jsonData, string outputPath)
    {
        // Yeni bir çalışma kitabı oluşturun
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];
        
        // JSON düzenleme seçeneklerini yapılandırın
        JsonLayoutOptions options = new JsonLayoutOptions
        {
            ArrayAsTable = true,
            ConvertNumericOrDate = true,
            IgnoreNull = true
        };
        
        // Başlıkları kalın yapın
        options.TitleStyle = new CellsFactory().CreateStyle();
        options.TitleStyle.Font.IsBold = true;
        
        // JSON verisini içe aktarın
        JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);
        
        // Sütunları otomatik olarak sığdırın
        sheet.AutoFitColumns();
        
        // Çalışma kitabını kaydedin
        workbook.Save(outputPath);
    }
    
    public void GenerateReportFromObjects(List<Dictionary<string, object>> data, string outputPath)
    {
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];
        
        // Eğer veri varsa başlıkları ekleyin
        if (data.Count > 0)
        {
            int col = 0;
            foreach (var key in data[0].Keys)
            {
                // Stil ile başlık ekleyin
                Cell cell = sheet.Cells[0, col];
                cell.PutValue(key);
                
                Style style = cell.GetStyle();
                style.Font.IsBold = true;
                cell.SetStyle(style);
                
                col++;
            }
            
            // Veri satırlarını ekleyin
            for (int row = 0; row < data.Count; row++)
            {
                col = 0;
                foreach (var value in data[row].Values)
                {
                    sheet.Cells[row + 1, col].PutValue(value);
                    col++;
                }
            }
        }
        
        // Tablo olarak biçimlendirin
        if (data.Count > 0)
        {
            int lastRow = data.Count;
            int lastCol = data[0].Count - 1;
            
            var tableRange = sheet.Cells.CreateRange(0, 0, lastRow + 1, lastCol + 1);
            sheet.ListObjects.Add(tableRange, "DataTable");
        }
        
        // Sütunları otomatik olarak sığdırın
        sheet.AutoFitColumns();
        
        // Çalışma kitabını kaydedin
        workbook.Save(outputPath);
    }
}

Adım 6: Profesyonel Biçimlendirme Ekleyin

Excel çıktısını profesyonel stil ile geliştirin:

public void ApplyProfessionalFormatting(Workbook workbook)
{
    Worksheet sheet = workbook.Worksheets[0];
    
    // Başlık için bir stil oluşturun
    Style titleStyle = workbook.CreateStyle();
    titleStyle.Font.Size = 14;
    titleStyle.Font.IsBold = true;
    titleStyle.HorizontalAlignment = TextAlignmentType.Center;
    
    // Rapor başlığı ekleyin
    sheet.Cells.Merge(0, 0, 1, sheet.Cells.MaxColumn + 1);
    Cell titleCell = sheet.Cells[0, 0];
    titleCell.PutValue("API Veri Raporu - " + DateTime.Now.ToString("yyyy-MM-dd"));
    titleCell.SetStyle(titleStyle);
    
    // Başlıktan sonra boş bir satır ekleyin
    sheet.Cells.InsertRow(1);
    
    // Verilere alternatif satır renkleri uygulayın
    Style evenRowStyle = workbook.CreateStyle();
    evenRowStyle.ForegroundColor = Color.FromArgb(240, 240, 240);
    evenRowStyle.Pattern = BackgroundType.Solid;
    
    int dataStartRow = 3; // Başlık ve boş satırı dikkate alarak
    int lastRow = sheet.Cells.MaxRow;
    
    for (int row = dataStartRow; row <= lastRow; row += 2)
    {
        for (int col = 0; col <= sheet.Cells.MaxColumn; col++)
        {
            sheet.Cells[row, col].SetStyle(evenRowStyle);
        }
    }
    
    // Sayfa başlığı ve alt bilgisi ekleyin
    sheet.PageSetup.SetHeader(1, "&\"Arial,Bold\"&14API Raporu");
    sheet.PageSetup.SetFooter(1, "Sayfa &P / &N");
    
    // Yazdırma seçeneklerini ayarlayın
    sheet.PageSetup.Orientation = PageOrientationType.Landscape;
    sheet.PageSetup.FitToPagesWide = 1;
    sheet.PageSetup.TopMargin = 0.5;
    sheet.PageSetup.LeftMargin = 0.5;
    sheet.PageSetup.RightMargin = 0.5;
    sheet.PageSetup.BottomMargin = 0.5;
}

Adım 7: Veri Görselleştirmesi Ekleyin

Raporu grafiklerle geliştirin:

public void AddChartVisualization(Workbook workbook, int dataColumn)
{
    Worksheet sheet = workbook.Worksheets[0];
    Worksheet chartSheet = workbook.Worksheets.Add("Grafik Analizi");
    
    // Veri aralığını alın (başlık satırını atlayın)
    int lastRow = sheet.Cells.MaxRow;
    int nameColumn = 0; // İlk sütunun isimler/kategoriler içerdiğini varsayıyoruz
    
    // Bir grafik ekleyin
    int chartIndex = chartSheet.Charts.Add(ChartType.Column, 2, 2, 20, 10);
    Chart chart = chartSheet.Charts[chartIndex];
    
    // Grafiğin veri aralığını ayarlayın
    chart.NSeries.Add($"Sheet1!B2:B{lastRow + 1}", true);
    chart.NSeries.CategoryData = $"Sheet1!A2:A{lastRow + 1}";
    
    // Grafik başlığını ve diğer özellikleri ayarlayın
    chart.Title.Text = "Veri Analizi";
    chart.Legend.Position = LegendPositionType.Bottom;
    
    // Ek grafik özelleştirmeleri
    chart.NSeries[0].Area.ForegroundColor = Color.FromArgb(79, 129, 189);
    chart.PlotArea.Area.ForegroundColor = Color.White;
    
    // Veri etiketleri ekleyin
    chart.NSeries[0].DataLabels.IsValueShown = true;
    chart.NSeries[0].DataLabels.Position = DataLabelPositionType.OutsideEnd;
}

Adım 8: Hepsini Bir Araya Getirin

Her şeyi bir araya getiren ana programı oluşturun:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        try
        {
            // API uç noktasını yapılandırın
            string baseUrl = "https://api.example.com";
            string endpoint = "/data/endpoint";
            string apiKey = "your-api-key"; // Gerekirse
            
            // API'ye bağlanın ve verileri alın
            Console.WriteLine("API'ye bağlanıyor...");
            var apiService = new ApiService(baseUrl);
            var jsonData = await apiService.GetApiDataAsync<string>(endpoint, apiKey);
            
            Console.WriteLine("Veri başarıyla alındı");
            
            // Excel raporu oluşturun
            Console.WriteLine("Excel raporu oluşturuluyor...");
            var reportGenerator = new ExcelReportGenerator();
            
            // Seçenek 1: JSON'dan Excel'e doğrudan dönüşüm
            string outputPath = "ApiReport_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx";
            reportGenerator.GenerateReport(jsonData, outputPath);
            
            // Seçenek 2: JSON'u işleyin ve geliştirilmiş rapor oluşturun
            // var processor = new DataProcessor();
            // var processedData = processor.FlattenJsonData(jsonData);
            // reportGenerator.GenerateReportFromObjects(processedData, outputPath);
            
            Console.WriteLine($"Rapor {outputPath} konumuna kaydedildi");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Hata: {ex.Message}");
        }
    }
}

Farklı API Yanıt Yapılarını Ele Alma

REST API’leri verileri çeşitli formatlarda döndürür. İşte yaygın yapıların nasıl ele alınacağı:

1. Nesneler Dizisi

[
  { "id": 1, "name": "Ürün A", "price": 29.99 },
  { "id": 2, "name": "Ürün B", "price": 49.99 }
]

Bu yapı için şunu kullanın:

JsonLayoutOptions options = new JsonLayoutOptions();
options.ArrayAsTable = true;
JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);

2. Veriler Dizisi ile İç İçe Nesne

{
  "status": "başarılı",
  "data": [
    { "id": 1, "name": "Ürün A", "price": 29.99 },
    { "id": 2, "name": "Ürün B", "price": 49.99 }
  ]
}

“data” dizisini çıkarmak için DataProcessor sınıfını kullanın veya:

// Newtonsoft.Json ile ayrıştırın
JObject jsonObj = JObject.Parse(jsonData);
JArray dataArray = (JArray)jsonObj["data"];

// Dizeye dönüştürün ve içe aktarın
string dataArrayJson = dataArray.ToString();
JsonUtility.ImportData(dataArrayJson, sheet.Cells, 0, 0, options);

3. İç İçe Diziler ve Nesneler

{
  "categories": [
    {
      "name": "Elektronik",
      "products": [
        { "id": 1, "name": "Dizüstü Bilgisayar", "price": 999.99 },
        { "id": 2, "name": "Telefon", "price": 699.99 }
      ]
    },
    {
      "name": "Kitaplar",
      "products": [
        { "id": 3, "name": "Roman", "price": 14.99 }
      ]
    }
  ]
}

Karmaşık yapılar için birden fazla çalışma sayfası oluşturun:

// JSON'u ayrıştırın
JObject root = JObject.Parse(jsonData);
JArray categories = (JArray)root["categories"];

// Her kategori için bir çalışma sayfası oluşturun
foreach (var category in categories)
{
    string categoryName = category["name"].ToString();
    Worksheet sheet = workbook.Worksheets.Add(categoryName);
    
    // Ürünler dizisini alın ve içe aktarın
    JArray products = (JArray)category["products"];
    JsonUtility.ImportData(products.ToString(), sheet.Cells, 0, 0, options);
}

Raporları Zamanlama: Bir Sonraki Aşama

Rapor üretimini otomatikleştirmek için zamanlama yetenekleri ekleyin:

// Görev Zamanlayıcı paketini yükleyin
// dotnet add package TaskScheduler

using Microsoft.Win32.TaskScheduler;

public void ScheduleDailyReportGeneration(string appPath)
{
    using (TaskService ts = new TaskService())
    {
        // Yeni bir görev oluşturun
        TaskDefinition td = ts.NewTask();
        td.RegistrationInfo.Description = "Günlük API Veri Raporu Üretimi";
        
        // Her gün sabah 7'de tetiklenecek bir tetikleyici oluşturun
        td.Triggers.Add(new DailyTrigger { StartBoundary = DateTime.Today.AddHours(7) });
        
        // Uygulamayı çalıştıracak bir eylem oluşturun
        td.Actions.Add(new ExecAction(appPath));
        
        // Görevi kök klasörde kayıt edin
        ts.RootFolder.RegisterTaskDefinition("GünlükApiRaporu", td);
    }
}

Dikkate Alınacak Gelişmiş Özellikler

  1. E-posta ile teslimat - Raporları otomatik olarak e-posta ile gönderin
  2. Çoklu API entegrasyonu - Birden fazla API’den verileri birleştirin
  3. Şablon tabanlı raporlar - Tutarlı marka için Excel şablonları kullanın
  4. Gösterge panosu oluşturma - Etkileşimli Excel gösterge panoları oluşturun
  5. Hata izleme ve raporlama - Sorunları kaydedin ve başarı/başarısızlık hakkında rapor verin

Bu kılavuzu takip ederek, API verilerini alma ve profesyonel Excel raporlarına dönüştürme sürecini otomatikleştiren sağlam bir C# uygulaması oluşturmuş oldunuz—zaman tasarrufu sağlıyor, doğruluğu garanti ediyor ve iş değeri sunuyor.

 Türkçe