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

news2024/12/21 8:21:44

前言

Microsoft Excel的XLSX格式以及基于文本的CSV(逗号分隔值)格式,是数据交换中常见的文件格式。应用程序通过实现对这些格式的读写支持,可以显著提升性能。在本文中,小编将为大家介绍如何借助葡萄城公司地Java API组件GrapeCity Documents for Excel(以下简称GcExcel)将CSV文件转化为XLSX 文件。

具体操作步骤如下:

  1. 创建项目(使用intelliJ IDEA创建一个新的Maven项目)
  2. 查询数据(使用AlphaVantage Web服务获取CSV格式的月度BTC-USD数据)
  3. 加载CSV
  4. 处理CSV(重新排列、创建表格并创建带有趋势线的图表)
  5. 返回XLSX

1)创建项目

(1)使用intelliJ IDEA,创建一个新项目。
在这里插入图片描述

(2)为项目输入项目名称“BTC_Chart_WebService”,并在左侧菜单中选择Maven Archetype后选择一个项目存放位置,然后点击下一步。
在这里插入图片描述

(3)打开pom.xml文件并添加GcExcel依赖项

<dependency>
  <groupId>com.grapecitysoft.documents</groupId>
  <artifactId>gcexcel</artifactId>
  <version>7.0.1</version>
</dependency>

在这里插入图片描述

2)查询数据

创建一个CSV类,用于从AlphaVantage Web服务查询CSV格式的月度BTC-USD数据。

public static String getCsvData() {
    String csv = null;
    String apiKey = "YOUR_API_KEY";

    String queryUrl = String.format(
            "https://www.alphavantage.co/query?function=DIGITAL_CURRENCY_MONTHLY&symbol=BTC&market=USD&apikey=%s&datatype=csv",
            apiKey);

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(queryUrl))
            .GET()
            .build();
    try {
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        csv = response.body();
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

    return csv;
}

3)加载CSV

接下来,创建一个XLSX类,并添加方法AnalysisCSV,入参为csv字符串,该方法会返回一个Workbook类型的工作簿对象。

public static Workbook AnalysisCSV(String csvStr) {
    Workbook workbook = new Workbook();
    byte[] arr = csvStr.getBytes(StandardCharsets.UTF_8);
    try (InputStream s = new ByteArrayInputStream(arr)) {
        workbook.open(s, OpenFileFormat.Csv);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return workbook;
}

4)处理CSV

首先,用代码获取带有CSV数据的IWorksheet,并重排列列的顺序,将Volume列放在Date和Open列之间。然后,创建一个名为“每月比特币数据”的表格,包含CSV数据,并自动适应表中的列。

接着,在工作表中添加一个新的StockVOHLC(成交量、开盘、最高、最低、收盘)类型的图标,并覆盖整个表格范围;设置图标的标题,添加系列到图标,改变类别轴的单位为月份,更新类别轴刻度标签的方向和数字格式;然后创建三条趋势线。趋势线分别以蓝色、绿色和红色显示成交量、最高价和最低价的三个月移动平均线。

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);
}

5)返回XLSX

最后,创建一个Main类,并添加相关方法作为整个程序的入口,右键执行程序后就可以获得最终的Excel XLSX文件。

public static void main(String[] args) {
    Workbook workbook = AnalysisCSV(CSV.getCsvData());
    processWorkbook(workbook);
    workbook.save("比特币月度数据.xlsx");
}

在这里插入图片描述

运行结果如下所示:
在这里插入图片描述

最后附上完整的代码工程文件:https://gitee.com/GrapeCity/btc_-chart_-web-service

总结

以上就是在Java 中以编程的方式将 CSV转化为 Excel XLSX 文件的全过程,如果您想了解更多信息,欢迎点击这篇参考资料访问。

扩展链接:

轻松构建低代码工作流程:简化繁琐任务的利器

优化预算管理流程:Web端实现预算编制的利器

如何在.NET电子表格应用程序中创建流程图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1487671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构c版(2)——二叉树

本章我们来了解一下二叉树这一概念。 目录 1.树概念及结构 1.1树的概念​​​​​​​ 1.2 树的特点&#xff1a; 1.3 树的相关概念 1.4 树的表示​​​​​​​ 1.5 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 …

H3C接入交换机收到大量上行口(连接汇聚交换机)TC报文该怎么处理?(排查思路及解决办法)

一、问题描述 H3C接入交换机收到大量上行口的TC报文。 二、告警信息 三、TC报文排查思路 1、检查物理链路是否有问题。 2、检查是否有可能存在环路。 3、终端接入的端口开启STP边缘端口。 4、根桥的下联端口开启STP根保护。 5、如果对端设备不是管辖的范围且无法管理到,可考虑…

「优选算法刷题」:在每个树行中找最大值

一、题目 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < N…

WebSocket介绍+3分钟时间使用WebSocket搭建属自己的聊天室

WebSocket 的由来 在 WebSocket 出现之前&#xff0c;我们想实现实时通信、变更推送、服务端消息推送功能&#xff0c;我们一般的方案是使用 Ajax 短轮询、长轮询两种方式&#xff1a;比如我们想实现一个服务端数据变更时&#xff0c;立即通知客户端功能&#xff0c;没有 WebS…

【探索AI】二十一 深度学习之第4周:循环神经网络(RNN)与长短时记忆(LSTM)

循环神经网络&#xff08;RNN&#xff09;与长短时记忆&#xff08;LSTM&#xff09; RNN的基本原理与结构LSTM的原理与实现序列建模与文本生成任务实践&#xff1a;使用RNN或LSTM进行文本分类或生成任务步骤 1: 数据准备步骤 2: 构建模型步骤 3: 定义损失函数和优化器步骤 4: …

数字电路三宝:锁存器、寄存器和触发器

在数字电路设计中&#xff0c;很多电子工程师经常会用到锁存器、寄存器和触发器&#xff0c;它们各自承担着不同的功能&#xff0c;但共同为数字电路的稳定性和高效性提供了坚强保障&#xff0c;下面将谈谈这三大元件&#xff0c;希望对小伙伴们有所帮助。 1、锁存器&#xff0…

HOOPS Communicator对3D大模型轻量化加载与渲染的4种解决方案

今天给大家介绍一些关于3D Web轻量化引擎HOOPS Commuicator的关键概念&#xff0c;这些概念可以帮您在HOOPS Communicator流缓存服务器之上更好地构建您自己的模型流服务器。如果您是有大型数据集&#xff0c;那么&#xff0c;使用流缓存服务器可以极大地帮助您最大限度地减少内…

EthSign联合创始人 POTTER LI 确认出席Hack .Summit() 香港区块链开发者大会!

thSign联合创始人 POTTER LI确认将出席由 Hack VC 主办&#xff0c;并由 AltLayer 和 Berachain 联合主办&#xff0c;与 SNZ 和数码港合作&#xff0c;由 Techub News 承办的Hack.Summit() 2024区块链开发者盛会。 Potter Li&#xff0c;南加州大学应有数学系&#xff0c;南加…

hook函数——useReducer

目录 1.useReducer定义2.useReducer用法3.useState和useReducer区别 1.useReducer定义 const [state, dispatch] useReducer(reducer, initialArg, init?) reducer&#xff1a;用于更新 state 的纯函数。参数为 state 和 action&#xff0c;返回值是更新后的 state。state …

excel统计分析——拉丁方设计

参考资料&#xff1a;生物统计学 拉丁方设计也是随机区组设计&#xff0c;是对随机区组设计的一种改进。它在行的方向和列的方向都可以看成区组&#xff0c;因此能实现双向误差的控制。在一般的试验设计中&#xff0c;拉丁方常被看作双区组设计&#xff0c;用于提高发现处理效应…

新《公司法》规定5年内完成注册资本实缴有哪些影响

2024年对很多企业可谓是一个洗牌的年份。随着新公司法的颁布&#xff0c;很多企业都忧心忡忡面临着各种挑战。其中新《公司法》规定5年内完成注册资本实缴就让很多企业老板睡不着觉。新《公司法》规定注册资本实缴制度将对市场和企业产生一系列影响。主要有以下这几方面&#x…

【Java项目介绍和界面搭建】拼图小游戏——键盘、鼠标事件

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

【javascript】快速入门javascript

本文前言及说明 适合学过一门语言有一定基础的人看。 省略最初学习编程时的各种编程重复的基础知识。 javascript简介 编程语言&#xff08;主前端&#xff09; 用途&#xff1a;主web前后端&#xff0c;游戏&#xff0c;干别人网站 优点&#xff1a;速度快&#xff0c;浏…

Python之Web开发初学者教程----卸载ubuntu系统

Python之Web开发初学者教程----卸载ubuntu系统 Windows 10自带了Subsytem for Linux (WSL)功能&#xff0c;可以让用户在Windows命令行环境下运行Linux命令。用户可以在Windows应用商店中下载和安装Ubuntu子系统&#xff0c;有时在使用过程中需要完全删除Ubuntu子系统以释放硬…

Go语言学习-实现一个workshop

Creating new Go packages 1、创建一个Go package&#xff0c;叫&#xff1a; MyLib • Let’s create a Go package called MyLib and use it in our program 2、在go_project文件夹下开启终端&#xff0c;输入指令创建go.mod文件。 go mod init go_project• Assuming our…

【HTML】HTML基础6.1(表格以及常见属性)

目录 表格介绍 表格标签 表格标签的常见属性 案例 知识点总结 表格介绍 在浏览器中&#xff0c;我们经常见到形如 这样的表格形式&#xff0c;一般来说&#xff0c;表格是为了让数据看起来更加清晰&#xff0c;增强数据的可读性 有的程序员也会用表格进行排版 表格标签 &…

(UE4升级UE5)Selected Level Actor节点升级到UE5

本问所用工具为&#xff1a; UE5 UE4 插件AssetDeveTool包含&#xff1a;快速选择功能自动化批量LOD功能自动化批量展UV功能自动化批量减面功能自动化批量修改查找替换材质功能批量重命名工具碰撞器修改工具资源整理工具支持4.26 - 5.3版本https://mbd.pub/o/bread/mbd-ZZubkp…

ControlNet作者新作LayerDiffusion,让SD直接生成生成透明图像,堪比商用抠图软件

ControlNet作者又出新工作&#xff0c;这次的工作LayerDiffusion它使得大规模预训练的Stable Diffusion能够生成透明图像。该方法允许生成单个透明图像或多个透明图层&#xff0c;效果堪比商业产品Adobe Stock。而且LayerDiffusion和ControlNet一样支持基于SD微调的模型。 &quo…

Flutter的线程模型

在Flutter框架中&#xff0c;Embedder层负责把Flutter嵌入到各个平台上去&#xff0c;其所做的主要工作包括线程设置、渲染Surface设置&#xff0c;以及插件等。因此&#xff0c; Embedder负责线程的创建和管理&#xff0c;并且提供Task Runner给Engine使用。Engine则是负责提供…

钉钉h5应用 环境报错Error: Do not support the current environment:notInDingTalk

钉钉h5应用 环境报错 Error: Do not support the current environment&#xff1a;notInDingTalk problem Error: Do not support the current environment&#xff1a;notInDingTalk reason 前端页面运行在普通浏览器 solution 需要将h5页面在后台发布后&#xff0c;在钉…