高效数据传输:Java通过绑定快速将数据导出至Excel

news2024/9/23 17:19:22

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前言

把数据导出至 Excel 是很常见的需求,而数据的持久化,往往又放在数据库中。因此把数据库中的数据导出到 Excel中,成了非常普遍的一个需求。

以关系型数据库为例,数据表是一个二维矩阵,但是为了易于操作和维护,在数据读取中,都会定义类,并且以对象的形式在内存中存放数据。但是Excel的工作表又是另一个二维矩阵,这就意味着,从数据库读取出的对象数据,又需要循环写入另一个表格中,这使得代码难以维护。

为了解决数据不易维护的问题,可以给工作表,单元格或者表格设置对象及单元格的绑定关系,这样在保存时便可以根据数据源的绑定关系,自动填充数据。

具体实现方法

现有数据类如下:

public static class SalesRecord {
   public int sales;
   public String productType;
   public String product;
   public String salesman;
   public String area;
 }

 public static class SalesData {
   public ArrayList records;
 }

样本数据如下:

private SalesData getDataSource() {
   // 创建数据源
   SalesData datasource = new SalesData();
   datasource.records = new ArrayList();

   // 添加数据
   SalesRecord record1 = new SalesRecord();
   record1.area = "NorthChina";
   record1.salesman = "Hellen";
   record1.product = "Apple";
   record1.productType = "Fruit";
   record1.sales = 120;
   datasource.records.add(record1);

   SalesRecord record2 = new SalesRecord();
   record2.area = "NorthChina";
   record2.salesman = "Hellen";
   record2.product = "Banana";
   record2.productType = "Fruit";
   record2.sales = 143;
   datasource.records.add(record2);

   SalesRecord record3 = new SalesRecord();
   record3.area = "NorthChina";
   record3.salesman = "Hellen";
   record3.product = "Kiwi";
   record3.productType = "Fruit";
   record3.sales = 322;
   datasource.records.add(record3);
   return datasource;
 }

1.数据源绑定至工作表

下面是给工作表设置数据源绑定的代码,其中setAutoGenerateColumns设置为false,当setAutoGenerateColumns为true 时,工作表会根据数据源自动生成列。

public void SheetBinding() {
   // 创建一个新的workbook
   Workbook workbook = new Workbook();
   // 获取默认sheet
   IWorksheet worksheet = workbook.getWorksheets().get(0);

   SalesData datasource = getDataSource();

   // 自动生成列设置为false
   worksheet.setAutoGenerateColumns(false);

   // 给工作表中的每一列绑定数据源
   worksheet.getRange("A:A").getEntireColumn().setBindingPath("area");
   worksheet.getRange("B:B").getEntireColumn().setBindingPath("salesman");
   worksheet.getRange("C:C").getEntireColumn().setBindingPath("product");
   worksheet.getRange("D:D").getEntireColumn().setBindingPath("productType");
   worksheet.getRange("E:E").getEntireColumn().setBindingPath("sales");

   // 设置数据源
   worksheet.setDataSource(datasource.records);

   // 保存为Excel文件
   workbook.save("output/SheetBinding.xlsx");
 }

实现效果如下:

2.数据源绑定至单元格

// 创建workbook
 Workbook workbook = new Workbook();
 // 获取默认的sheet
 IWorksheet worksheet = workbook.getActiveSheet();

 // 添加数据
 SalesRecord record = new SalesRecord();
 record.area = "北方";
 record.salesman = "李强";
 record.product = "苹果";
 record.productType = "水果";
 record.sales = 120;

 // 给单元格设置绑定
 worksheet.getRange("A1").setBindingPath("area");
 worksheet.getRange("B2").setBindingPath("salesman");
 worksheet.getRange("C2").setBindingPath("product");
 worksheet.getRange("D3").setBindingPath("productType");

 // 设置数据源
 worksheet.setDataSource(record);

 // 保存为Excel
 workbook.save("output/CellBinding.xlsx");

实现效果如下:

3.数据源绑定至表格

下面的代码使用了setExpandBoundRows ,ITable.setExpandBoundRows方法用来处理一个绑定的表格对数据源的更改该如何响应。当属性设置为true时,该绑定表格会使用整行操作自动调整行数以适应数据源更改。

// 创建workbook
 Workbook workbook = new Workbook();
 // 获取默认的sheet
 IWorksheet worksheet = workbook.getActiveSheet();

 SalesData datasource = getDataSource();
 // 添加一个表格
 ITable table = worksheet.getTables().add(worksheet.getRange("B2:F5"), true);

 // 设置表格,不自动生成列
 table.setAutoGenerateColumns(false);

 // 给表格设置绑定path
 table.setBindingPath("records");

 // 设置setExpandBoundRows为true,
 table.setExpandBoundRows(true);

 // 设置表格列的数据字段
 table.getColumns().get(0).setDataField("area");
 table.getColumns().get(1).setDataField("salesman");
 table.getColumns().get(2).setDataField("product");
 table.getColumns().get(3).setDataField("productType");
 table.getColumns().get(4).setDataField("sales");

 // 设置数据源
 worksheet.setDataSource(datasource);

 // 保存为excel
 workbook.save("output/TableBinding.xlsx");

实现效果如下:

总结

通过给工作表、单元格或表格设置数据源绑定关系,可以实现将数据库中的数据导出到Excel的功能。这种方法使用对象和属性的绑定关系,将内存中的数据源与Excel中的工作表、单元格或表格进行连接。这样,在保存数据时,只需要根据数据源的绑定关系自动填充数据,而无需手动循环写入。这种实现方式简化了代码,提高了代码的可维护性和可扩展性。同时,通过设置自动生成列、设置绑定路径以及处理数据源变化等操作,还可以进一步增强导出功能的灵活性和适应性。总的来说,这种数据源绑定的方法为数据导出提供了一种优雅而高效的解决方案。

扩展链接:

从表单驱动到模型驱动,解读低代码开发平台的发展趋势

低代码开发平台是什么?

基于分支的版本管理,帮助低代码从项目交付走向定制化产品开发

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

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

相关文章

为什么选择HubSpot电子邮件营销?

在数字时代,电子邮件营销是企业吸引、互动和保留客户的关键工具之一。然而,要在竞争激烈的市场中脱颖而出,并确保你的消息被准确地传达给目标受众,需要一款强大而智能的电子邮件营销平台。这就是HubSpot电子邮件营销背后的核心理念…

聊聊分布式架构06——[NIO入门]简单的Netty NIO示例

目录 Java NIO和Netty NIO比较 Java NIO: Netty: Netty NIO中的主要模块 Transport(传输层) Buffer(缓冲区) Codec(编解码器) Handler(处理器) Even…

王杰C++day3

#include <iostream>using namespace std;class Per { private:string name;int age;int *height;int *weight; public://有参构造函数Per(string n,int a,int h,int w):name(n),age(a),height(new int(h)),weight(new int(w)){cout << "p有参" <<…

Godot2D角色导航-自动寻路教程(角色随鼠标移动)

文章目录 运行结果2D导航概述开始前的准备2D导航创建导航网格创建角色 其他文章 运行结果 2D导航概述 Godot为2D和3D游戏提供了多个对象、类和服务器&#xff0c;以便于基于网格或基于网格的导航和路径查找。 说到导航&#xff0c;就得说一下导航网格&#xff0c;导航网格定义…

miRNA测序数据生信分析——第一讲,总结概述

miRNA测序数据生信分析——第一讲&#xff0c;总结概述 miRNA测序数据生信分析——第一讲&#xff0c;总结概述1. miRNA提取建库测序2. miRNA的生物学功能3. miRNA的生信分析模块3.1 miRNA鉴定3.2 miRNA表达量计算和差异表达miRNA分析3.3 miRNA靶基因注释3.4 另一个miRNA生信分…

Bridge

Bridge 动机 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个纬度的变化如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化&#xff0c;而不引入额外的复杂度&#xff1…

UML图 - 类图(Class Diagram)

类图是描述系统中的类&#xff0c;以及各个类之间的关系的静态视图。能够让我们在正确编写代码以前对系统有一个全面的认识。类图是一种模型类型&#xff0c;确切的说&#xff0c;是一种静态模型类型。类图表示类、接口和它们之间的协作关系。 类图的结构 类一般由三部分组成&…

很烦的Node报错积累

目录 1. 卡在sill idealTree buildDeps2、Node Sass老是安装不上的问题3、unable to resolve dependency tree4、nvm相关命令5、设置淘宝镜像等基操5.1 镜像 5.2 npm清理缓存6、Browserslist: caniuse-lite is outdated loader 1. 卡在sill idealTree buildDeps 参考&#xf…

【数据库系统概论】SQL是什么?它有什么特点?

SQL是什么SQL的特点SQL的基本概念感谢 &#x1f496; SQL是什么 SQL&#xff08;Structured Query Language&#xff09;即结构化查询语句&#xff0c;是关系数据库的标准语言。它的功能不仅仅是查询&#xff0c;而是包括数据库模式创建、数据库数据的插入和修改、数据库安全性…

【iOS】Fastlane一键打包上传到TestFlight、蒲公英

Fastlane一键打包上传到TestFlight、蒲公英 前言一、准备二、探索一、Fastlane配置1、Fastlane安装2、Fastlane更新3、Fastlane卸载4、查看Fastlane版本5、查看Fastlane位置6、Fastlane初始化 二、Fastlane安装蒲公英插件三、Fastlane文件编辑1、Gemfile文件2、Appfile文件3、F…

虹科方案丨自动驾驶多传感器数据融合方法

文章来源&#xff1a;雅名特自动驾驶 点此阅读原文&#xff1a;https://mp.weixin.qq.com/s/QsPMWZDGZaPdEx47L2VmeA 近年来&#xff0c;深度学习技术在涉及高维非结构化数据领域展现出了最先进的性能&#xff0c;如计算机视觉、语音、自然语言处理等方面&#xff0c;并且开始涉…

Vue3中reactive, onMounted, ref,toRaw,conmpted 使用方法

import { reactive, onMounted, ref,toRaw,conmpted } from vue; vue3中 reactive &#xff0c;ref &#xff0c; toRaw&#xff0c;watch&#xff0c;conmpted 用法 toRaw 返回原响应式对象 用法&#xff1a; const rowList toRaw(row) reactive:ref: ref和reactive都是V…

Microsoft Office 2019 for Mac:提升工作效率的必备办公软件套装

在现代社会&#xff0c;办公软件已经成为我们工作生活中不可或缺的一部分。作为全球领先的办公软件品牌&#xff0c;Microsoft Office 2019 for Mac&#xff08;Office全家桶&#xff09;凭借其强大的功能和稳定性&#xff0c;成为了无数Mac用户提升工作效率的首选。 首先&…

教资成绩什么时候出来 2023教资笔试成绩查询时间介绍

上半年教资笔试成绩查询开放时期为2023年4月13日&#xff0c;面试成绩查询开放时间在6月14日。而下半年教资笔试成绩查询开放时间为2023年11月8日&#xff0c;2023下半年教资面试时间是2023年12月9日-10日。 值得一提的是如果考生对成绩有异议的话&#xff0c;还可以在成绩公布…

Python操作Hive数据仓库

Python连接Hive 1、Python如何连接Hive&#xff1f;2、Python连接Hive数据仓库 1、Python如何连接Hive&#xff1f; Python连接Hive需要使用Impala查询引擎 由于Hadoop集群节点间使用RPC通信&#xff0c;所以需要配置Thrift依赖环境 Thrift是一个轻量级、跨语言的RPC框架&…

LeetCode-496-下一个更大元素

题目描述&#xff1a; 题目链接&#xff1a;LeetCode-496-下一个更大元素 解题思路&#xff1a; 方法一&#xff1a;暴力 方法二&#xff1a;单调栈 方法一代码实现&#xff1a; class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {// 最笨的方法&am…

京东数据报告:2023年儿童面膜行业数据分析

如今&#xff0c;儿童面膜在不少家长群体中受到追捧。有的家长称自家孩子3岁开始敷面膜&#xff0c;而在某电商平台上&#xff0c;一位母婴博主称自己的女儿才2岁&#xff0c;“已经深知护肤的重要性了&#xff0c;每天洗完澡就嚷嚷着要敷面膜”。 而从市场角度看&#xff0c;…

Godot 添加Nuget 引用

前言 我的Godot 专栏 我在之前的文章中&#xff0c;解决了Visual Studio 如何去调试正在运行的Godot 程序。Godot 对于C# 的支持只剩下一个&#xff0c;那就是Nuget 添加。 Godot VisualStudio外部编辑器设置 添加Nuget Nuget 添加还是非常的容易的。我们直接添加一个最常用的…

(5)SpringMVC处理携带JSON格式(“key“:value)请求数据的Ajax请求

SpringMVC处理Ajax 参考文章数据交换的常见格式,如JSON格式和XML格式 请求参数的携带方式 浏览器发送到服务器的请求参数有namevalue&...(键值对)和{key:value,...}(json对象)两种格式 URL请求和表单的GET请求会将请求参数以键值对的格式拼接到请求地址后面form表单的P…

使用wireshark解析ipsec esp包

Ipsec esp包就是ipsec通过ike协议协商好后建立的通信隧道使用的加密包&#xff0c;该加密包里面就是用户的数据&#xff0c;比如通过的语音等。 那么如何将抓出来的esp包解析出来看呢&#xff1f; 获取相关的esp的key信息. 打开wireshark -> edit->preferences 找到pr…