• 如何在 C# 中以编程的方式将 CSV 转为 Excel XLSX 文件


    前言

    Microsoft Excel的XLSX格式以及基于文本的CSV(逗号分隔值)格式,是数据交换中常见的文件格式。应用程序通过实现对这些格式的读写支持,可以显著提升性能。在本文中,小编将为大家介绍如何在C#中以编程的方式将【比特币-美元】市场数据CSV文件转化为XLSX 文件。

    具体操作步骤如下:

    1.创建项目 (使用 Visual Studio 2022 创建新的 ASP.NET Core Web API 项目)。
    2.查询数据 (使用 AlphaVantage Web 服务获取 CSV格式的每月BTC-USD 数据 )。
    3.加载 CSV (使用 GrapeCity Documents for Excel.NET API)
    4.处理 CSV (重新排列列、创建表格并创建带有趋势线的图表)。
    5.返回 XLSX (使用 GrapeCity Documents for Excel.NET 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 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 文件的全过程,如果您想了解更多信息,欢迎点击这篇参考资料访问。

  • 相关阅读:
    每日三题 8.29
    2022-中医基础-《阴阳 20问与答》
    【Zookeeper专题】Zookeeper特性与节点数据类型详解
    2022版 的IDEA创建一个maven项目(超详细)
    【Kafka系列】(一)Kafka入门
    汽车级瞬态抑制TVS二极管优势特性及型号大全
    vue 状态管理vuex笔记
    面试突击:Bean 作用域是啥?它有几种类型?
    TypeScript入门及面向对象
    羧基化稀土荧光微球/稀土掺杂二氧化硅荧光微球/水性稀土配合物复合微球荧光油墨应用
  • 原文地址:https://www.cnblogs.com/powertoolsteam/p/18044483