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:
- REST API’lerine bağlanır
- JSON yanıt verilerini alır
- Verileri profesyonelce biçimlendirilmiş Excel raporlarına dönüştürür
- 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
- E-posta ile teslimat - Raporları otomatik olarak e-posta ile gönderin
- Çoklu API entegrasyonu - Birden fazla API’den verileri birleştirin
- Şablon tabanlı raporlar - Tutarlı marka için Excel şablonları kullanın
- Gösterge panosu oluşturma - Etkileşimli Excel gösterge panoları oluşturun
- 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.