高效數據傳輸: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;
 }

樣本數據如下:

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中的工作表、單元格或表格進行連接。這樣,在保存數據時,只需要根據數據源的綁定關係自動填充數據,而無需手動循環寫入。這種實現方式簡化了代碼,提高了代碼的可維護性和可擴展性。同時,通過設置自動生成列、設置綁定路徑以及處理數據源變化等操作,還可以進一步增強導出功能的靈活性和適應性。總的來說,這種數據源綁定的方法爲數據導出提供了一種優雅而高效的解決方案。

擴展鏈接:

從表單驅動到模型驅動,解讀低代碼開發平臺的發展趨勢

低代碼開發平臺是什麼?

基於分支的版本管理,幫助低代碼從項目交付走向定製化產品開發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章