前言
microsoft excel的xlsx格式以及基于文本的csv(逗号分隔值)格式,是数据交换中常见的文件格式。应用程序通过实现对这些格式的读写支持,可以显著提升性能。在本文中,小编将为大家介绍如何在c#中以编程的方式将市场数据csv文件转化为xlsx 文件。
具体操作步骤如下:
- 创建项目(使用intellij idea创建一个新的maven项目)
- 查询数据(使用alphavantage web服务获取csv格式的月度btc-usd数据)
- 加载csv(使用grapecity documents for excel api)
- 处理csv(重新排列列、创建表格并创建带有趋势线的图表)
- 返回xlsx(使用grapecity documents for excel api)
实现步骤
创建项目
(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 包”:

查询数据
创建一个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;
}
加载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);
}
处理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。趋势线以蓝色显示成交量的三个月移动平均线 , 以绿色显示最高价,以 红色显示最低价。
返回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转为xlsx文件的文章就介绍到这了,更多相关c# csv转xlsx内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论