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


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

    前言

    数据导出至 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;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    样本数据如下:

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    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");
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    实现效果如下:

    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");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    实现效果如下:

    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");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    实现效果如下:

    总结

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

    扩展链接:

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

    低代码开发平台是什么?

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

  • 相关阅读:
    Vue从入门到精通
    对主流网络威胁情报标准应用的比较研究
    为了提高出图效率,我做了一款可视化制作气泡图谱的小工具
    [NAS] Synology (群晖) DSM相关服务及套件安装
    BERT深度学习基准模型特点与应用
    Node.js 实战 第2章 Node 编程基础 2.1 Node 功能的组织及重用
    Java Spring框架 (底层原理+入门)
    Linux命令记录
    Docker | redis安装及测试
    遇到的问题java和mysql篇
  • 原文地址:https://blog.csdn.net/powertoolsteam/article/details/133693791