前言

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 文件的全过程,如果您想了解更多信息,欢迎点击这篇参考资料访问。

如何在 C# 中以编程的方式将 CSV 转为 Excel XLSX 文件的更多相关文章

  1. 在C语言中以编程的方式获取函数名

    仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧. 对象反射库.调试工具及代码分析器,经常会需要在运行时访问 ...

  2. 如何在Linux中自动删除或清理/tmp文件夹内容?

    每个Linux系统都有一个名为的目录/tmp,该目录已挂载了单独的文件系统. 它具有称为tmpfs的特殊文件系统.这是一个虚拟文件系统,操作系统将在系统引导时自动挂载/tmp挂载点. 如果要根据应用程 ...

  3. PLC状态机编程-如何在STL中使用状态机

    搞PLC编程多年,一直不知道状态机,学习matlab后,发现状态机编程异常方便,过去很多编程时的疑惑豁然开朗起来.今天跟大家分享一下如何在STL中使用状态机. 下面是用状态机描述的控制任务. 这个状态 ...

  4. C#中异步编程异常的处理方式

    异步编程异常处理 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.但是对于异步编程来说,异常处理一直 ...

  5. Android中多线程编程(三)Handler更新UI的方式

    Handler更新UI的方式和原因以及遇到的问题 1.方式: 仅仅能通过Handler来更新UI. 代码例如以下: package com.chengdong.su.handlerdemo; impo ...

  6. 【Java编程思想读书笔记】继承中父类的初始化方式

    继承中父类的初始化方式 p144页有感 一.提出问题 假设有一些类,这些类有继承关系的时候,当初始化一个子类对象,对于该类的父类而言,发生了什么呢?是仅仅只是复制了一个引用还是也会同时new一个父类对 ...

  7. 如何正确的使用json?如何在.Net中使用json?

    什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...

  8. 如何在VC++ 中调试MEX文件

    MEX文件对应的是将C/C++文件语言的编写之后 得到的相关文件加载到Matlab中运行的一种方式, 现对于Matlab 中的某些程序运行效率而言, C/C++ 代码某些算法的领域上面执行效率很高,若 ...

  9. Android中JNI编程的那些事儿(1)

    转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...

  10. 服务化改造实践 | 如何在 Dubbo 中支持 REST

    什么是 REST REST 是 Roy Thomas Fielding [[1]](#fn1) 在 2000 年他的博士论文 [[2]](#fn2) “架构风格以及基于网络的软件架构设计” 中提出来的 ...

随机推荐

  1. vue在render函数中如何实现v-model和事件绑定(4)

    1.h函数的三个参数 第一个参数是必须的. 类型:{String | Object | Function} 一个 HTML 标签名.一个组件.一个异步组件.或一个函数式组件. 是要渲染的html标签. ...

  2. 【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:加速乐加密 ...

  3. 爬虫逆向基础,认识 SM1-SM9、ZUC 国密算法

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! [01x00] 简介 国密即国家密码局认定的国产加密算法,爬虫工程师在做 JS 逆向的时候,会遇 ...

  4. 简单的git拉取修改提交用法

    打开终端,进入要存放代码的本地文件夹,并使用git clone命令克隆远程仓库到本地: git clone https://github.com/username/repo.git 这里的userna ...

  5. Java开发中PO、VO、DAO、BO、DTO、POJO 含义

    PO(persistant object) 持久对象 可以看成是与数据库中的表相映射的java对象.使用 Mybatis 来生成 PO 是不错的选择. VO(value object) 值对象 通常用 ...

  6. Mybatis 源码系列:领略设计模式在 Mybatis 其中的应用

    目录 一.Builder模式 二.工厂模式 三.单例模式 四.代理模式 五.组合模式 六.模板方式模式 七.适配器模式 八.装饰器模式 九.迭代器模式 虽然我们都知道有23种设计模式,但是大多停留在概 ...

  7. (C语言)每日代码||2023.12.27||关于(++i)+(++i)以及(++i)+(i = 100)

    #include <stdio.h> int main() { int i = 1; int a = (++i) + (++i); printf("a = %d,i = %d\n ...

  8. 下载安装JDK 和 IntelliJ IDEA 和 ActiveMq

    wget http://yun.diandaxia.com/other/jdk-8u92-linux-x64.rpm rpm -ivh jdk-8u92-linux-x64.rpm wget http ...

  9. NC23482 小A的最短路

    题目链接 题目 题目描述 小A这次来到一个景区去旅游,景区里面有N个景点,景点之间有N-1条路径.小A从当前的一个景点移动到下一个景点需要消耗一点的体力值.但是景区里面有两个景点比较特殊,它们之间是可 ...

  10. CSS实现渐隐渐现效果

    CSS实现渐隐渐现效果 实现渐隐渐现效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求--希望元素消失 ...