چگونه پاسخ‌های API را به گزارش‌های اکسل در C# تبدیل کنیم

چگونه پاسخ‌های API را به گزارش‌های اکسل در C# تبدیل کنیم

در دنیای داده‌محور امروز، کسب‌وکارها به شدت به APIهای REST برای تبادل داده‌ها وابسته‌اند. با این حال، بسیاری از ذینفعان ترجیح می‌دهند این داده‌ها را در قالب Excel برای تحلیل و گزارش‌گیری مصرف کنند. این راهنما نشان می‌دهد که چگونه یک برنامه کامل C# بسازید که:

  1. به APIهای REST متصل می‌شود
  2. داده‌های پاسخ JSON را بازیابی می‌کند
  3. داده‌ها را به گزارش‌های Excel با فرمت حرفه‌ای تبدیل می‌کند
  4. با نمودارها و جداول، تجسم‌سازی را اضافه می‌کند

ارزش تجاری

این راه‌حل ارزش قابل توجهی را با ارائه می‌دهد:

  • خودکارسازی فرآیندهای استخراج داده‌های دستی و ایجاد گزارش
  • اطمینان از دقت داده‌ها با حذف کپی‌برداری دستی
  • ارائه فرمت‌بندی یکنواخت گزارش
  • امکان ایجاد گزارش‌های زمانبندی‌شده

راهنمای پیاده‌سازی مرحله به مرحله

مرحله 1: ایجاد یک برنامه جدید C#

با ایجاد یک برنامه کنسولی جدید شروع کنید:

dotnet new console -n ApiToExcelReporter
cd ApiToExcelReporter

مرحله 2: نصب بسته‌های مورد نیاز

بسته‌های NuGet لازم را اضافه کنید:

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

مرحله 3: پیاده‌سازی کلاینت API REST

یک سرویس برای ارتباط با API ایجاد کنید:

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);
        
        // در صورت نیاز احراز هویت را اضافه کنید
        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 call failed: {response.ErrorMessage}");
    }
}

مرحله 4: پردازش داده‌های پاسخ JSON

یک کلاس برای پردازش داده‌های JSON اضافه کنید:

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);
        
        // مدیریت ساختارهای مختلف JSON
        if (token is JArray array)
        {
            foreach (var item in array)
            {
                results.Add(FlattenObject(item));
            }
        }
        else if (token is JObject obj)
        {
            // برای داده‌های تو در تو مانند {"data": [{...}, {...}]}
            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;
        }
    }
}

مرحله 5: تبدیل به Excel با Aspose.Cells

پیاده‌سازی تبدیل به Excel:

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)
    {
        // ایجاد یک ورک‌بوک جدید
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];
        
        // پیکربندی گزینه‌های چیدمان JSON
        JsonLayoutOptions options = new JsonLayoutOptions
        {
            ArrayAsTable = true,
            ConvertNumericOrDate = true,
            IgnoreNull = true
        };
        
        // عناوین را بولد کنید
        options.TitleStyle = new CellsFactory().CreateStyle();
        options.TitleStyle.Font.IsBold = true;
        
        // وارد کردن داده‌های JSON
        JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);
        
        // تنظیم خودکار عرض ستون‌ها
        sheet.AutoFitColumns();
        
        // ذخیره کردن ورک‌بوک
        workbook.Save(outputPath);
    }
    
    public void GenerateReportFromObjects(List<Dictionary<string, object>> data, string outputPath)
    {
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];
        
        // اگر داده‌ای وجود دارد، عناوین را اضافه کنید
        if (data.Count > 0)
        {
            int col = 0;
            foreach (var key in data[0].Keys)
            {
                // افزودن عنوان با استایل
                Cell cell = sheet.Cells[0, col];
                cell.PutValue(key);
                
                Style style = cell.GetStyle();
                style.Font.IsBold = true;
                cell.SetStyle(style);
                
                col++;
            }
            
            // افزودن ردیف‌های داده
            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++;
                }
            }
        }
        
        // فرمت به عنوان یک جدول
        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");
        }
        
        // تنظیم خودکار عرض ستون‌ها
        sheet.AutoFitColumns();
        
        // ذخیره کردن ورک‌بوک
        workbook.Save(outputPath);
    }
}

مرحله 6: افزودن فرمت‌بندی حرفه‌ای

خروجی Excel را با استایل‌های حرفه‌ای بهبود دهید:

public void ApplyProfessionalFormatting(Workbook workbook)
{
    Worksheet sheet = workbook.Worksheets[0];
    
    // ایجاد یک استایل برای عنوان
    Style titleStyle = workbook.CreateStyle();
    titleStyle.Font.Size = 14;
    titleStyle.Font.IsBold = true;
    titleStyle.HorizontalAlignment = TextAlignmentType.Center;
    
    // افزودن عنوان به گزارش
    sheet.Cells.Merge(0, 0, 1, sheet.Cells.MaxColumn + 1);
    Cell titleCell = sheet.Cells[0, 0];
    titleCell.PutValue("گزارش داده‌های API - " + DateTime.Now.ToString("yyyy-MM-dd"));
    titleCell.SetStyle(titleStyle);
    
    // وارد کردن یک ردیف خالی بعد از عنوان
    sheet.Cells.InsertRow(1);
    
    // اعمال رنگ‌های متناوب به ردیف‌های داده
    Style evenRowStyle = workbook.CreateStyle();
    evenRowStyle.ForegroundColor = Color.FromArgb(240, 240, 240);
    evenRowStyle.Pattern = BackgroundType.Solid;
    
    int dataStartRow = 3; // با احتساب عنوان و ردیف خالی
    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);
        }
    }
    
    // افزودن سربرگ و پاورقی صفحه
    sheet.PageSetup.SetHeader(1, "&\"Arial,Bold\"&14گزارش API");
    sheet.PageSetup.SetFooter(1, "صفحه &P از &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;
}

مرحله 7: افزودن تجسم داده‌ها

گزارش را با نمودارها بهبود دهید:

public void AddChartVisualization(Workbook workbook, int dataColumn)
{
    Worksheet sheet = workbook.Worksheets[0];
    Worksheet chartSheet = workbook.Worksheets.Add("تحلیل نمودار");
    
    // دریافت محدوده داده (ردیف عنوان را نادیده بگیرید)
    int lastRow = sheet.Cells.MaxRow;
    int nameColumn = 0; // فرض بر این است که اولین ستون نام‌ها/دسته‌ها را دارد
    
    // افزودن یک نمودار
    int chartIndex = chartSheet.Charts.Add(ChartType.Column, 2, 2, 20, 10);
    Chart chart = chartSheet.Charts[chartIndex];
    
    // تنظیم محدوده داده برای نمودار
    chart.NSeries.Add($"Sheet1!B2:B{lastRow + 1}", true);
    chart.NSeries.CategoryData = $"Sheet1!A2:A{lastRow + 1}";
    
    // تنظیم عنوان نمودار و سایر ویژگی‌ها
    chart.Title.Text = "تحلیل داده‌ها";
    chart.Legend.Position = LegendPositionType.Bottom;
    
    // سفارشی‌سازی اضافی نمودار
    chart.NSeries[0].Area.ForegroundColor = Color.FromArgb(79, 129, 189);
    chart.PlotArea.Area.ForegroundColor = Color.White;
    
    // افزودن برچسب‌های داده
    chart.NSeries[0].DataLabels.IsValueShown = true;
    chart.NSeries[0].DataLabels.Position = DataLabelPositionType.OutsideEnd;
}

مرحله 8: همه چیز را کنار هم قرار دهید

برنامه اصلی که همه چیز را به هم پیوند می‌دهد ایجاد کنید:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        try
        {
            // پیکربندی نقطه پایانی API
            string baseUrl = "https://api.example.com";
            string endpoint = "/data/endpoint";
            string apiKey = "your-api-key"; // در صورت نیاز
            
            // اتصال به API و دریافت داده
            Console.WriteLine("در حال اتصال به API...");
            var apiService = new ApiService(baseUrl);
            var jsonData = await apiService.GetApiDataAsync<string>(endpoint, apiKey);
            
            Console.WriteLine("داده با موفقیت بازیابی شد");
            
            // تولید گزارش Excel
            Console.WriteLine("در حال تولید گزارش Excel...");
            var reportGenerator = new ExcelReportGenerator();
            
            // گزینه 1: تبدیل مستقیم JSON به Excel
            string outputPath = "ApiReport_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx";
            reportGenerator.GenerateReport(jsonData, outputPath);
            
            // گزینه 2: پردازش JSON و ایجاد گزارش بهبود یافته
            // var processor = new DataProcessor();
            // var processedData = processor.FlattenJsonData(jsonData);
            // reportGenerator.GenerateReportFromObjects(processedData, outputPath);
            
            Console.WriteLine($"گزارش در {outputPath} ذخیره شد");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"خطا: {ex.Message}");
        }
    }
}

مدیریت ساختارهای مختلف پاسخ API

APIهای REST داده‌ها را در فرمت‌های مختلفی برمی‌گردانند. در اینجا نحوه مدیریت ساختارهای رایج آورده شده است:

1. آرایه‌ای از اشیاء

[
  { "id": 1, "name": "محصول A", "price": 29.99 },
  { "id": 2, "name": "محصول B", "price": 49.99 }
]

برای این ساختار، از:

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

2. شی تو در تو با آرایه داده

{
  "status": "success",
  "data": [
    { "id": 1, "name": "محصول A", "price": 29.99 },
    { "id": 2, "name": "محصول B", "price": 49.99 }
  ]
}

از کلاس DataProcessor برای استخراج آرایه “data” استفاده کنید، یا:

// تجزیه با Newtonsoft.Json
JObject jsonObj = JObject.Parse(jsonData);
JArray dataArray = (JArray)jsonObj["data"];

// تبدیل به رشته و وارد کردن
string dataArrayJson = dataArray.ToString();
JsonUtility.ImportData(dataArrayJson, sheet.Cells, 0, 0, options);

3. آرایه‌ها و اشیاء تو در تو

{
  "categories": [
    {
      "name": "الکترونیک",
      "products": [
        { "id": 1, "name": "لپ‌تاپ", "price": 999.99 },
        { "id": 2, "name": "تلفن", "price": 699.99 }
      ]
    },
    {
      "name": "کتاب‌ها",
      "products": [
        { "id": 3, "name": "رمان", "price": 14.99 }
      ]
    }
  ]
}

برای ساختارهای پیچیده، چندین شیت ایجاد کنید:

// تجزیه JSON
JObject root = JObject.Parse(jsonData);
JArray categories = (JArray)root["categories"];

// ایجاد یک شیت برای هر دسته
foreach (var category in categories)
{
    string categoryName = category["name"].ToString();
    Worksheet sheet = workbook.Worksheets.Add(categoryName);
    
    // دریافت و وارد کردن آرایه محصولات
    JArray products = (JArray)category["products"];
    JsonUtility.ImportData(products.ToString(), sheet.Cells, 0, 0, options);
}

ارتقاء به سطح بعدی: گزارش‌های زمانبندی‌شده

برای خودکارسازی تولید گزارش، قابلیت‌های زمانبندی را اضافه کنید:

// نصب بسته Task Scheduler
// dotnet add package TaskScheduler

using Microsoft.Win32.TaskScheduler;

public void ScheduleDailyReportGeneration(string appPath)
{
    using (TaskService ts = new TaskService())
    {
        // ایجاد یک کار جدید
        TaskDefinition td = ts.NewTask();
        td.RegistrationInfo.Description = "تولید گزارش داده‌های API روزانه";
        
        // ایجاد یک تریگر که روزانه در ساعت 7 صبح فعال شود
        td.Triggers.Add(new DailyTrigger { StartBoundary = DateTime.Today.AddHours(7) });
        
        // ایجاد یک عمل که برنامه را اجرا کند
        td.Actions.Add(new ExecAction(appPath));
        
        // ثبت کار در پوشه ریشه
        ts.RootFolder.RegisterTaskDefinition("DailyApiReport", td);
    }
}

ویژگی‌های پیشرفته‌ای که باید در نظر بگیرید

  1. تحویل ایمیلی - به‌طور خودکار گزارش‌ها را از طریق ایمیل ارسال کنید
  2. ادغام چند API - داده‌ها را از چندین API ترکیب کنید
  3. گزارش‌های مبتنی بر الگو - از الگوهای Excel برای برندینگ یکنواخت استفاده کنید
  4. ایجاد داشبورد - داشبوردهای تعاملی Excel تولید کنید
  5. ردیابی و گزارش خطا - مشکلات را ثبت کرده و در مورد موفقیت/شکست گزارش دهید

با پیروی از این راهنما، شما یک برنامه قوی C# ایجاد کرده‌اید که فرآیند بازیابی داده‌های API و تبدیل آن به گزارش‌های حرفه‌ای Excel را خودکار می‌کند—زمان را صرفه‌جویی کرده، دقت را تضمین کرده و ارزش تجاری ارائه می‌دهد.

 فارسی