วิธีการแปลงการตอบสนอง API เป็นรายงาน Excel ใน C#
ในโลกที่ขับเคลื่อนด้วยข้อมูลในปัจจุบัน ธุรกิจต่างๆ ขึ้นอยู่กับ REST APIs สำหรับการแลกเปลี่ยนข้อมูลอย่างมาก อย่างไรก็ตาม ผู้มีส่วนได้ส่วนเสียหลายคนชอบที่จะบริโภคข้อมูลนี้ในรูปแบบ Excel เพื่อการวิเคราะห์และการรายงาน คู่มือนี้จะแสดงวิธีการสร้างแอปพลิเคชัน C# ที่สมบูรณ์ ซึ่งมีคุณสมบัติดังต่อไปนี้:
- เชื่อมต่อกับ REST APIs
- ดึงข้อมูล JSON ที่ตอบกลับ
- แปลงข้อมูลเป็นรายงาน Excel ที่จัดรูปแบบอย่างมืออาชีพ
- เพิ่มการแสดงผลด้วยกราฟและตาราง
คุณค่าทางธุรกิจ
โซลูชันนี้มอบคุณค่าอย่างมากโดยการ:
- อัตโนมัติการดึงข้อมูลและกระบวนการสร้างรายงานที่ทำด้วยมือ
- รับประกันความถูกต้องของข้อมูลโดยการกำจัดการคัดลอกด้วยมือ
- ให้การจัดรูปแบบรายงานที่สอดคล้องกัน
- เปิดใช้งานการสร้างรายงานตามกำหนดเวลา
คู่มือการดำเนินการทีละขั้นตอน
ขั้นตอนที่ 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: นำไปใช้ REST API Client
สร้างบริการสำหรับการสื่อสาร 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 ที่แตกต่างกัน
REST APIs ส่งคืนข้อมูลในรูปแบบต่างๆ นี่คือวิธีการจัดการโครงสร้างทั่วไป:
1. อาร์เรย์ของวัตถุ
[
{ "id": 1, "name": "Product A", "price": 29.99 },
{ "id": 2, "name": "Product 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": "Product A", "price": 29.99 },
{ "id": 2, "name": "Product 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": "Electronics",
"products": [
{ "id": 1, "name": "Laptop", "price": 999.99 },
{ "id": 2, "name": "Phone", "price": 699.99 }
]
},
{
"name": "Books",
"products": [
{ "id": 3, "name": "Novel", "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);
}
}
ฟีเจอร์ขั้นสูงที่ควรพิจารณา
- การจัดส่งทางอีเมล - ส่งรายงานโดยอัตโนมัติทางอีเมล
- การรวมหลาย API - รวมข้อมูลจาก API หลายตัว
- รายงานตามแม่แบบ - ใช้แม่แบบ Excel สำหรับการสร้างแบรนด์ที่สอดคล้องกัน
- การสร้างแดชบอร์ด - สร้างแดชบอร์ด Excel แบบโต้ตอบ
- การติดตามและรายงานข้อผิดพลาด - บันทึกปัญหาและรายงานความสำเร็จ/ความล้มเหลว
โดยการปฏิบัติตามคู่มือนี้ คุณได้สร้างแอปพลิเคชัน C# ที่มีความแข็งแกร่งซึ่งช่วยอัตโนมัติกระบวนการดึงข้อมูล API และแปลงเป็นรายงาน Excel ที่มีคุณภาพสูง—ประหยัดเวลา รับประกันความถูกต้อง และมอบคุณค่าทางธุรกิจ