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:
- Terhubung ke REST API
- Mengambil data respons JSON
- Mengonversi data menjadi laporan Excel yang diformat secara profesional
- 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
- Pengiriman email - Secara otomatis kirim laporan melalui email
- Integrasi Multi-API - Gabungkan data dari beberapa API
- Laporan berbasis template - Gunakan template Excel untuk branding yang konsisten
- Pembuatan dasbor - Hasilkan dasbor Excel interaktif
- 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.