前言
Microsoft Excel的XLSX格式以及基於文字的CSV(逗號分隔值)格式,是資料交換中常見的檔案格式。應用程式透過實現對這些格式的讀寫支援,可以顯著提升效能。在本文中,小編將為大家介紹如何在Java中以程式設計的方式將【比特幣-美元】市場資料CSV檔案轉化為XLSX 檔案。
具體操作步驟如下:
- 建立專案(使用intelliJ IDEA建立一個新的Maven專案)
- 查詢資料(使用AlphaVantage Web服務獲取CSV格式的月度BTC-USD資料)
- 載入CSV(使用GrapeCity Documents for Excel API)
- 處理CSV(重新排列列、建立表格並建立帶有趨勢線的圖表)
- 返回XLSX(使用GrapeCity Documents for Excel API)
1)建立專案
(1)使用 Visual Studio 2022,建立一個新專案 ( CTRL+SHIFT+N ) 並 在下拉選單中 選擇 C#、 所有平臺和 WebAPI ,以快速找到專案型別ASP.NET Core Web API,然後選擇它並單擊 下一步。
(2)輸入BTC_Chart_WebService 作為 專案名稱 並選擇 專案的 位置,然後單擊下一步。
(3)對於 Framework ,選擇 .NET 6.0(長期支援)或更高版本。在對話方塊中為其他配置選擇預設值後,單擊 “下一步”。
(4)這將建立一個模板 ASP.NET Core WebAPI 專案,其中包含返回天氣預報的示例程式碼。我們的專案中不需要它,但我們可以重用和重新調整控制器的用途。
使用 解決方案資源管理器 ( CTRL+ALT+L ) 將專案中的控制器檔案(在 Controllers下)重新命名為 BTCChartController.cs:
在 Controllers下,將 WeatherForecastController.cs 檔案重新命名為 BTCChartController.cs ,當更改檔名時, Visual Studio 將提示您並詢問您是否還要更改專案中的所有程式碼引用 - 在對話方塊中單擊“是” :
然後在解決方案資源管理器 ( CTRL+ALT+L ) 中,右鍵單擊 “依賴項” 並選擇 “管理 NuGet 包”:
2)查詢資料
建立一個CSV類,用於從AlphaVantage Web服務查詢CSV格式的月度BTC-USD資料。小編在該類中建立一個getCsvData方法用於獲取具體的資料(在程式碼中替換成你的API金鑰即可):
// Get the CSV data from the AlphaVantage web service
private string GetCsvData()
{
string csv;
string API_KEY = "YOUR_KEY_HERE";
string QUERY_URL = $"https://www.alphavantage.co/query?function=DIGITAL_CURRENCY_MONTHLY&symbol=BTC&market=USD&apikey={API_KEY}&datatype=csv";
Uri queryUri = new Uri(QUERY_URL);
using (HttpClient client = new HttpClient())
{
Task<string> t = client.GetStringAsync(queryUri);
while (!t.IsCompleted)
t.Wait();
csv = t.Result;
}
return csv;
}
3)載入CSV
現在,將Get()方法的程式碼替換為以下程式碼片段。這會:
- 將HttpGet屬性 中的 Name更新 為 GetBTC-USDChartWorkbook,
- 將返回型別更改為 FileContentResult,
- 註釋掉與天氣預報相關的程式碼
- 新增呼叫GetCsvData() 的程式碼 並將其匯入到新 工作簿中
BTCChartController.Get
[HttpGet(Name = "GetBTC-USDChartWorkbook")]
//public IEnumerable<WeatherForecast> Get()
public FileContentResult Get()
{
//return Enumerable.Range(1, 5).Select(index => new WeatherForecast
//{
// Date = DateTime.Now.AddDays(index),
// TemperatureC = Random.Shared.Next(-20, 55),
// Summary = Summaries[Random.Shared.Next(Summaries.Length)]
//})
//.ToArray();
// first get CSV data
string csv = GetCsvData();
// create new workbook
IWorkbook wbk = new Workbook();
// open CSV data in GcExcel using MemoryStream
using (Stream s = new MemoryStream())
{ // convert to byte array using UTF8 encoding
byte[] arr = System.Text.Encoding.UTF8.GetBytes(csv.ToCharArray());
s.Write(arr);
s.Seek(0, SeekOrigin.Begin);
// open CSV in workbook
wbk.Open(s, OpenFileFormat.Csv);
}
4)處理CSV
接下來,複製以下程式碼(在上一個程式碼片段中的using塊之後)以處理 工作簿中的 CSV :
BTCChartController.Get(續)
public static void processWorkbook(Workbook workbook){
IWorksheet worksheet = workbook.getWorksheets().get(0);
// 把第K列資料移動到B列位置
worksheet.getRange("B:B").insert();
worksheet.getRange("K:K").copy(worksheet.getRange("B:B"));
worksheet.getRange("K:K").delete();
// 獲取資料範圍
IRange usedRange = worksheet.getUsedRange();
// 建立表格
ITable addTable = worksheet.getTables().add(usedRange, true);
addTable.setName("每月比特幣資料");
usedRange.autoFit();
// 建立圖表
IShape iShape = worksheet.getShapes().addChart(ChartType.StockVOHLC, 0, 0, usedRange.getWidth(), usedRange.getHeight());
IChart chart = iShape.getChart();
chart.getChartTitle().setText("比特幣每月開盤-最高-最低-收盤-成交量");
chart.getSeriesCollection().add(worksheet.getRange(0,0,usedRange.getRowCount(),6), RowCol.Columns,true,true);
IAxis categoryAxis = chart.getAxes().item(AxisType.Category);
categoryAxis.setBaseUnit(TimeUnit.Months);
categoryAxis.getTickLabels().setOrientation(45);
categoryAxis.getTickLabels().setNumberFormat("d/m/yyyy");
ITrendline voltrend = chart.getSeriesCollection().get(0).getTrendlines().add();
voltrend.setName("3個月移動平均成交量");
voltrend.setType(TrendlineType.MovingAvg);
voltrend.setPeriod(3);
voltrend.getFormat().getLine().getColor().setRGB(Color.GetBlue());
voltrend.getFormat().getLine().setDashStyle(LineDashStyle.RoundDot);
ITrendline hightrend = chart.getSeriesCollection().get(2).getTrendlines().add();
hightrend.setName("3個月移動平均最高價");
hightrend.setType(TrendlineType.MovingAvg);
hightrend.setPeriod(3);
hightrend.getFormat().getLine().getColor().setRGB(Color.GetGreen());
hightrend.getFormat().getLine().setDashStyle(LineDashStyle.RoundDot);
ITrendline lowtrend = chart.getSeriesCollection().get(3).getTrendlines().add();
lowtrend.setName("3個月移動平均最低價");
lowtrend.setType(TrendlineType.MovingAvg);
lowtrend.setPeriod(3);
lowtrend.getFormat().getLine().getColor().setRGB(Color.GetRed());
lowtrend.getFormat().getLine().setDashStyle(LineDashStyle.RoundDot);
}
首先,程式碼獲取 包含 CSV資料的IWorksheet ,並重新排列列以將 Volume 列放在 Date 和 Open列之間。然後,它建立一個 名為 BTC_Monthly的表 ,其中包含 CSV 資料並自動調整 表中的列。
然後,程式碼在整個表格範圍內新增一個StockVOHLC 型別的工作表 (成交量-開盤-高-低-收盤)新圖表,設定圖表標題,將系列新增到圖表中,將類別軸單位更改為“月”,更新類別軸刻度標籤方向和數字格式,然後建立三個 Trendlines。趨勢線以藍色顯示成交量的三個月移動平均線 , 以綠色顯示最高價,以 紅色顯示最低價。
5)返回XLSX
最後,建立一個Main類,並新增相關方法作為整個程式的入口,右鍵執行程式後就可以獲得最終的Excel XLSX檔案。
// Save Workbook to XLSX and return from web service as "BTC_Chart.xlsx"
using (MemoryStream ms = new MemoryStream())
{
wbk.Save(ms, SaveFileFormat.Xlsx);
ms.Seek(0, SeekOrigin.Begin);
byte[] bytes = ms.ToArray();
return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "BTC_Chart.xlsx");
}
} // Get()
執行結果如下所示:
總結
以上就是在C# 中以程式設計的方式將 CSV 轉為 Excel XLSX 檔案的全過程,如果您想了解更多資訊,歡迎點選這篇參考資料訪問。