如何在 C# 中以編程的方式將 CSV 轉爲 Excel XLSX 文件

前言

Microsoft Excel的XLSX格式以及基於文本的CSV(逗號分隔值)格式,是數據交換中常見的文件格式。應用程序通過實現對這些格式的讀寫支持,可以顯著提升性能。在本文中,小編將爲大家介紹如何在Java中以編程的方式將【比特幣-美元】市場數據CSV文件轉化爲XLSX 文件。

具體操作步驟如下:

  1. 創建項目(使用intelliJ IDEA創建一個新的Maven項目)
  2. 查詢數據(使用AlphaVantage Web服務獲取CSV格式的月度BTC-USD數據)
  3. 加載CSV(使用GrapeCity Documents for Excel API)
  4. 處理CSV(重新排列列、創建表格並創建帶有趨勢線的圖表)
  5. 返回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 文件的全過程,如果您想了解更多信息,歡迎點擊這篇參考資料訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章