Cara Mengubah Respons API Menjadi Laporan Excel di C#

Cara Mengubah Respons API Menjadi Laporan Excel di C#

Dalam dunia yang didorong oleh data saat ini, bisnis sangat bergantung pada REST API untuk pertukaran data. Namun, banyak pemangku kepentingan lebih memilih untuk mengkonsumsi data ini dalam format Excel untuk analisis dan pelaporan. Panduan ini menunjukkan cara membangun aplikasi C# lengkap yang:

  1. Terhubung ke REST API
  2. Mengambil data respons JSON
  3. Mengonversi data menjadi laporan Excel yang diformat secara profesional
  4. Menambahkan visualisasi dengan grafik dan tabel

Nilai Bisnis

Solusi ini memberikan nilai yang signifikan dengan:

  • Mengotomatiskan proses ekstraksi data manual dan pembuatan laporan
  • Memastikan akurasi data dengan menghilangkan penyalinan manual
  • Menyediakan format laporan yang konsisten
  • Memungkinkan pembuatan laporan terjadwal

Panduan Implementasi Langkah-demi-Langkah

Langkah 1: Buat Aplikasi C# Baru

Mulailah dengan membuat aplikasi konsol baru:

dotnet new console -n ApiToExcelReporter
cd ApiToExcelReporter

Langkah 2: Instal Paket yang Diperlukan

Tambahkan paket NuGet yang diperlukan:

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

Langkah 3: Implementasikan Klien REST API

Buat layanan untuk komunikasi 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);
        
        // Tambahkan otentikasi jika diperlukan
        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($"Panggilan API gagal: {response.ErrorMessage}");
    }
}

Langkah 4: Proses Data Respons JSON

Tambahkan kelas untuk memproses data 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);
        
        // Tangani struktur JSON yang berbeda
        if (token is JArray array)
        {
            foreach (var item in array)
            {
                results.Add(FlattenObject(item));
            }
        }
        else if (token is JObject obj)
        {
            // Untuk data bersarang seperti {"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;
        }
    }
}

Langkah 5: Konversi ke Excel dengan Aspose.Cells

Implementasikan konversi 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)
    {
        // Buat workbook baru
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];
        
        // Konfigurasi opsi tata letak JSON
        JsonLayoutOptions options = new JsonLayoutOptions
        {
            ArrayAsTable = true,
            ConvertNumericOrDate = true,
            IgnoreNull = true
        };
        
        // Buat header menjadi tebal
        options.TitleStyle = new CellsFactory().CreateStyle();
        options.TitleStyle.Font.IsBold = true;
        
        // Impor data JSON
        JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);
        
        // Sesuaikan lebar kolom secara otomatis
        sheet.AutoFitColumns();
        
        // Simpan workbook
        workbook.Save(outputPath);
    }
    
    public void GenerateReportFromObjects(List<Dictionary<string, object>> data, string outputPath)
    {
        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets[0];
        
        // Tambahkan header jika ada data
        if (data.Count > 0)
        {
            int col = 0;
            foreach (var key in data[0].Keys)
            {
                // Tambahkan header dengan gaya
                Cell cell = sheet.Cells[0, col];
                cell.PutValue(key);
                
                Style style = cell.GetStyle();
                style.Font.IsBold = true;
                cell.SetStyle(style);
                
                col++;
            }
            
            // Tambahkan baris data
            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++;
                }
            }
        }
        
        // Format sebagai tabel
        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");
        }
        
        // Sesuaikan lebar kolom secara otomatis
        sheet.AutoFitColumns();
        
        // Simpan workbook
        workbook.Save(outputPath);
    }
}

Langkah 6: Tambahkan Pemformatan Profesional

Tingkatkan output Excel dengan gaya profesional:

public void ApplyProfessionalFormatting(Workbook workbook)
{
    Worksheet sheet = workbook.Worksheets[0];
    
    // Buat gaya untuk judul
    Style titleStyle = workbook.CreateStyle();
    titleStyle.Font.Size = 14;
    titleStyle.Font.IsBold = true;
    titleStyle.HorizontalAlignment = TextAlignmentType.Center;
    
    // Tambahkan judul ke laporan
    sheet.Cells.Merge(0, 0, 1, sheet.Cells.MaxColumn + 1);
    Cell titleCell = sheet.Cells[0, 0];
    titleCell.PutValue("Laporan Data API - " + DateTime.Now.ToString("yyyy-MM-dd"));
    titleCell.SetStyle(titleStyle);
    
    // Sisipkan baris kosong setelah judul
    sheet.Cells.InsertRow(1);
    
    // Terapkan warna baris bergantian ke data
    Style evenRowStyle = workbook.CreateStyle();
    evenRowStyle.ForegroundColor = Color.FromArgb(240, 240, 240);
    evenRowStyle.Pattern = BackgroundType.Solid;
    
    int dataStartRow = 3; // Menghitung judul dan baris kosong
    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);
        }
    }
    
    // Tambahkan header dan footer halaman
    sheet.PageSetup.SetHeader(1, "&\"Arial,Bold\"&14Laporan API");
    sheet.PageSetup.SetFooter(1, "Halaman &P dari &N");
    
    // Atur opsi cetak
    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;
}

Langkah 7: Tambahkan Visualisasi Data

Tingkatkan laporan dengan grafik:

public void AddChartVisualization(Workbook workbook, int dataColumn)
{
    Worksheet sheet = workbook.Worksheets[0];
    Worksheet chartSheet = workbook.Worksheets.Add("Analisis Grafik");
    
    // Dapatkan rentang data (lewati baris header)
    int lastRow = sheet.Cells.MaxRow;
    int nameColumn = 0; // Menganggap kolom pertama memiliki nama/kategori
    
    // Tambahkan grafik
    int chartIndex = chartSheet.Charts.Add(ChartType.Column, 2, 2, 20, 10);
    Chart chart = chartSheet.Charts[chartIndex];
    
    // Atur rentang data untuk grafik
    chart.NSeries.Add($"Sheet1!B2:B{lastRow + 1}", true);
    chart.NSeries.CategoryData = $"Sheet1!A2:A{lastRow + 1}";
    
    // Atur judul grafik dan properti lainnya
    chart.Title.Text = "Analisis Data";
    chart.Legend.Position = LegendPositionType.Bottom;
    
    // Kustomisasi grafik tambahan
    chart.NSeries[0].Area.ForegroundColor = Color.FromArgb(79, 129, 189);
    chart.PlotArea.Area.ForegroundColor = Color.White;
    
    // Tambahkan label data
    chart.NSeries[0].DataLabels.IsValueShown = true;
    chart.NSeries[0].DataLabels.Position = DataLabelPositionType.OutsideEnd;
}

Langkah 8: Satukan Semua

Buat program utama yang menghubungkan semuanya:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        try
        {
            // Konfigurasi endpoint API
            string baseUrl = "https://api.example.com";
            string endpoint = "/data/endpoint";
            string apiKey = "your-api-key"; // Jika diperlukan
            
            // Terhubung ke API dan ambil data
            Console.WriteLine("Menghubungkan ke API...");
            var apiService = new ApiService(baseUrl);
            var jsonData = await apiService.GetApiDataAsync<string>(endpoint, apiKey);
            
            Console.WriteLine("Data berhasil diambil");
            
            // Buat laporan Excel
            Console.WriteLine("Menghasilkan laporan Excel...");
            var reportGenerator = new ExcelReportGenerator();
            
            // Opsi 1: Konversi JSON langsung ke Excel
            string outputPath = "LaporanApi_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx";
            reportGenerator.GenerateReport(jsonData, outputPath);
            
            // Opsi 2: Proses JSON dan buat laporan yang ditingkatkan
            // var processor = new DataProcessor();
            // var processedData = processor.FlattenJsonData(jsonData);
            // reportGenerator.GenerateReportFromObjects(processedData, outputPath);
            
            Console.WriteLine($"Laporan disimpan di {outputPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Kesalahan: {ex.Message}");
        }
    }
}

Menangani Berbagai Struktur Respons API

REST API mengembalikan data dalam berbagai format. Berikut cara menangani struktur umum:

1. Array Objek

[
  { "id": 1, "name": "Produk A", "price": 29.99 },
  { "id": 2, "name": "Produk B", "price": 49.99 }
]

Untuk struktur ini, gunakan:

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

2. Objek Bersarang dengan Array Data

{
  "status": "success",
  "data": [
    { "id": 1, "name": "Produk A", "price": 29.99 },
    { "id": 2, "name": "Produk B", "price": 49.99 }
  ]
}

Gunakan kelas DataProcessor untuk mengekstrak array “data”, atau:

// Analisis dengan Newtonsoft.Json
JObject jsonObj = JObject.Parse(jsonData);
JArray dataArray = (JArray)jsonObj["data"];

// Konversi ke string dan impor
string dataArrayJson = dataArray.ToString();
JsonUtility.ImportData(dataArrayJson, sheet.Cells, 0, 0, options);

3. Array dan Objek Bersarang

{
  "categories": [
    {
      "name": "Elektronik",
      "products": [
        { "id": 1, "name": "Laptop", "price": 999.99 },
        { "id": 2, "name": "Telepon", "price": 699.99 }
      ]
    },
    {
      "name": "Buku",
      "products": [
        { "id": 3, "name": "Novel", "price": 14.99 }
      ]
    }
  ]
}

Untuk struktur kompleks, buat beberapa worksheet:

// Analisis JSON
JObject root = JObject.Parse(jsonData);
JArray categories = (JArray)root["categories"];

// Buat worksheet untuk setiap kategori
foreach (var category in categories)
{
    string categoryName = category["name"].ToString();
    Worksheet sheet = workbook.Worksheets.Add(categoryName);
    
    // Dapatkan dan impor array produk
    JArray products = (JArray)category["products"];
    JsonUtility.ImportData(products.ToString(), sheet.Cells, 0, 0, options);
}

Membawa ke Tingkat Selanjutnya: Laporan Terjadwal

Untuk mengotomatiskan pembuatan laporan, tambahkan kemampuan penjadwalan:

// Instal paket Penjadwal Tugas
// dotnet add package TaskScheduler

using Microsoft.Win32.TaskScheduler;

public void ScheduleDailyReportGeneration(string appPath)
{
    using (TaskService ts = new TaskService())
    {
        // Buat tugas baru
        TaskDefinition td = ts.NewTask();
        td.RegistrationInfo.Description = "Pembuatan Laporan Data API Harian";
        
        // Buat pemicu yang akan berjalan setiap hari pada pukul 7 pagi
        td.Triggers.Add(new DailyTrigger { StartBoundary = DateTime.Today.AddHours(7) });
        
        // Buat aksi yang akan menjalankan aplikasi
        td.Actions.Add(new ExecAction(appPath));
        
        // Daftarkan tugas di folder root
        ts.RootFolder.RegisterTaskDefinition("LaporanApiHarian", td);
    }
}

Fitur Lanjutan yang Perlu Dipertimbangkan

  1. Pengiriman email - Secara otomatis kirim laporan melalui email
  2. Integrasi Multi-API - Gabungkan data dari beberapa API
  3. Laporan berbasis template - Gunakan template Excel untuk branding yang konsisten
  4. Pembuatan dasbor - Hasilkan dasbor Excel interaktif
  5. Pelacakan dan pelaporan kesalahan - Catat masalah dan laporkan keberhasilan/kegagalan

Dengan mengikuti panduan ini, Anda telah membuat aplikasi C# yang kuat yang mengotomatiskan proses pengambilan data API dan mengonversinya menjadi laporan Excel profesional—menghemat waktu, memastikan akurasi, dan memberikan nilai bisnis.

 Indonesia