C#實(shí)現(xiàn)將CSV轉(zhuǎn)為XLSX文件
前言
Microsoft Excel的XLSX格式以及基于文本的CSV(逗號(hào)分隔值)格式,是數(shù)據(jù)交換中常見(jiàn)的文件格式。應(yīng)用程序通過(guò)實(shí)現(xiàn)對(duì)這些格式的讀寫(xiě)支持,可以顯著提升性能。在本文中,小編將為大家介紹如何在C#中以編程的方式將市場(chǎng)數(shù)據(jù)CSV文件轉(zhuǎn)化為XLSX 文件。
具體操作步驟如下:
- 創(chuàng)建項(xiàng)目(使用intelliJ IDEA創(chuàng)建一個(gè)新的Maven項(xiàng)目)
- 查詢(xún)數(shù)據(jù)(使用AlphaVantage Web服務(wù)獲取CSV格式的月度BTC-USD數(shù)據(jù))
- 加載CSV(使用GrapeCity Documents for Excel API)
- 處理CSV(重新排列列、創(chuàng)建表格并創(chuàng)建帶有趨勢(shì)線(xiàn)的圖表)
- 返回XLSX(使用GrapeCity Documents for Excel API)
實(shí)現(xiàn)步驟
創(chuàng)建項(xiàng)目
(1)使用 Visual Studio 2022,創(chuàng)建一個(gè)新項(xiàng)目 ( CTRL+SHIFT+N ) 并 在下拉列表中 選擇 C#、 所有平臺(tái)和 WebAPI ,以快速找到項(xiàng)目類(lèi)型ASP.NET Core Web API,然后選擇它并單擊 下一步。

(2)輸入BTC_Chart_WebService 作為 項(xiàng)目名稱(chēng) 并選擇 項(xiàng)目的 位置,然后單擊下一步。

(3)對(duì)于 Framework ,選擇 .NET 6.0(長(zhǎng)期支持)或更高版本。在對(duì)話(huà)框中為其他配置選擇默認(rèn)值后,單擊 “下一步”。

(4)這將創(chuàng)建一個(gè)模板 ASP.NET Core WebAPI 項(xiàng)目,其中包含返回天氣預(yù)報(bào)的示例代碼。我們的項(xiàng)目中不需要它,但我們可以重用和重新調(diào)整控制器的用途。
使用 解決方案資源管理器 ( CTRL+ALT+L ) 將項(xiàng)目中的控制器文件(在 Controllers下)重命名為 BTCChartController.cs:

在 Controllers下,將 WeatherForecastController.cs 文件重命名為 BTCChartController.cs ,當(dāng)更改文件名時(shí), Visual Studio 將提示您并詢(xún)問(wèn)您是否還要更改項(xiàng)目中的所有代碼引用 - 在對(duì)話(huà)框中單擊“是” :

然后在解決方案資源管理器 ( CTRL+ALT+L ) 中,右鍵單擊 “依賴(lài)項(xiàng)” 并選擇 “管理 NuGet 包”:

查詢(xún)數(shù)據(jù)
創(chuàng)建一個(gè)CSV類(lèi),用于從AlphaVantage Web服務(wù)查詢(xún)CSV格式的月度BTC-USD數(shù)據(jù)。小編在該類(lèi)中創(chuàng)建一個(gè)getCsvData方法用于獲取具體的數(shù)據(jù)(在代碼中替換成你的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;
}
加載CSV
現(xiàn)在,將Get()方法的代碼替換為以下代碼片段。這會(huì):
- 將HttpGet屬性 中的 Name更新 為 GetBTC-USDChartWorkbook,
- 將返回類(lèi)型更改為 FileContentResult,
- 注釋掉與天氣預(yù)報(bào)相關(guān)的代碼
- 添加調(diào)用GetCsvData() 的代碼 并將其導(dǎo)入到新 工作簿中
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);
}
處理CSV
接下來(lái),復(fù)制以下代碼(在上一個(gè)代碼片段中的using塊之后)以處理 工作簿中的 CSV :
BTCChartController.Get(續(xù))
public static void processWorkbook(Workbook workbook){
IWorksheet worksheet = workbook.getWorksheets().get(0);
// 把第K列數(shù)據(jù)移動(dòng)到B列位置
worksheet.getRange("B:B").insert();
worksheet.getRange("K:K").copy(worksheet.getRange("B:B"));
worksheet.getRange("K:K").delete();
// 獲取數(shù)據(jù)范圍
IRange usedRange = worksheet.getUsedRange();
// 創(chuàng)建表格
ITable addTable = worksheet.getTables().add(usedRange, true);
addTable.setName("每月數(shù)據(jù)");
usedRange.autoFit();
// 創(chuàng)建圖表
IShape iShape = worksheet.getShapes().addChart(ChartType.StockVOHLC, 0, 0, usedRange.getWidth(), usedRange.getHeight());
IChart chart = iShape.getChart();
chart.getChartTitle().setText("每月開(kāi)盤(pán)-最高-最低-收盤(pán)-成交量");
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個(gè)月移動(dòng)平均成交量");
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個(gè)月移動(dòng)平均最高價(jià)");
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個(gè)月移動(dòng)平均最低價(jià)");
lowtrend.setType(TrendlineType.MovingAvg);
lowtrend.setPeriod(3);
lowtrend.getFormat().getLine().getColor().setRGB(Color.GetRed());
lowtrend.getFormat().getLine().setDashStyle(LineDashStyle.RoundDot);
}
首先,代碼獲取 包含 CSV數(shù)據(jù)的IWorksheet ,并重新排列列以將 Volume 列放在 Date 和 Open列之間。然后,它創(chuàng)建一個(gè) 名為 BTC_Monthly的表 ,其中包含 CSV 數(shù)據(jù)并自動(dòng)調(diào)整 表中的列。
然后,代碼在整個(gè)表格范圍內(nèi)添加一個(gè)StockVOHLC 類(lèi)型的工作表 (成交量-開(kāi)盤(pán)-高-低-收盤(pán))新圖表,設(shè)置圖表標(biāo)題,將系列添加到圖表中,將類(lèi)別軸單位更改為“月”,更新類(lèi)別軸刻度標(biāo)簽方向和數(shù)字格式,然后創(chuàng)建三個(gè) Trendlines。趨勢(shì)線(xiàn)以藍(lán)色顯示成交量的三個(gè)月移動(dòng)平均線(xiàn) , 以綠色顯示最高價(jià),以 紅色顯示最低價(jià)。
返回XLSX
最后,創(chuàng)建一個(gè)Main類(lèi),并添加相關(guān)方法作為整個(gè)程序的入口,右鍵執(zhí)行程序后就可以獲得最終的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()
運(yùn)行結(jié)果如下所示:

到此這篇關(guān)于C#實(shí)現(xiàn)將CSV轉(zhuǎn)為XLSX文件的文章就介紹到這了,更多相關(guān)C# CSV轉(zhuǎn)XLSX內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#.net實(shí)現(xiàn)在Winform中從internet下載文件的方法
這篇文章主要介紹了C#.net實(shí)現(xiàn)在Winform中從internet下載文件的方法,實(shí)例分析了基于Winform實(shí)現(xiàn)文件下載的相關(guān)技巧,需要的朋友可以參考下2015-07-07
C#實(shí)現(xiàn)向函數(shù)傳遞不定參數(shù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)向函數(shù)傳遞不定參數(shù)的方法,涉及C#操作函數(shù)參數(shù)的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
C# Stream 和 byte[] 之間的轉(zhuǎn)換
Stream 和 byte[] 之間的轉(zhuǎn)換2008-03-03
深入理解C#實(shí)現(xiàn)快捷鍵(系統(tǒng)熱鍵)響應(yīng)的方法
本篇文章是對(duì)使用C#實(shí)現(xiàn)快捷鍵(系統(tǒng)熱鍵)響應(yīng)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#如何動(dòng)態(tài)創(chuàng)建Label,及動(dòng)態(tài)label事件
這篇文章主要介紹了C#如何動(dòng)態(tài)創(chuàng)建Label,及動(dòng)態(tài)label事件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
C#?利用Autofac批量接口注入依賴(lài)的問(wèn)題小結(jié)
這篇文章主要介紹了C#?利用Autofac批量接口注入依賴(lài)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12

