摘要:本文由葡萄城技術團隊於部落格園原創並首發。轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。
前言
把資料匯出至 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中的工作表、單元格或表格進行連線。這樣,在儲存資料時,只需要根據資料來源的繫結關係自動填充資料,而無需手動迴圈寫入。這種實現方式簡化了程式碼,提高了程式碼的可維護性和可擴充套件性。同時,透過設定自動生成列、設定繫結路徑以及處理資料來源變化等操作,還可以進一步增強匯出功能的靈活性和適應性。總的來說,這種資料來源繫結的方法為資料匯出提供了一種優雅而高效的解決方案。
擴充套件連結: