如何在 C# 中以编程的方式将 CSV 转为 Excel XLSX 文件
前言
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 文件的全过程,如果您想了解更多信息,欢迎点击这篇
参考资料
访问。