天天看點

Svelte架構結合SpreadJS實作純前端類Excel線上報表設計

作者:葡萄城GrapeCity
Svelte架構結合SpreadJS實作純前端類Excel線上報表設計

在上篇文章中介紹了,如何在Svelte架構中使用SpreadJS完成填報功能。這次我們來看看,如何實作類Excel報表設計吧。首先看下在svelte架構中如何引入Designer元件。

1、在pageage.json檔案中引入相關designer資源

"devDependencies": { 
 "svelte": "^3.52.0",
 "vite": "^3.2.3",
 "@grapecity/spread-excelio": "15.2.5",
 "@grapecity/spread-sheets": "15.2.5",
 "@grapecity/spread-sheets-barcode": "15.2.5",
 "@grapecity/spread-sheets-charts": "15.2.5",
 "@grapecity/spread-sheets-designer": "15.2.5",
 "@grapecity/spread-sheets-designer-resources-cn": "15.2.5",
 "@grapecity/spread-sheets-languagepackages": "15.2.5",
 "@grapecity/spread-sheets-pdf": "15.2.5",
 "@grapecity/spread-sheets-pivot-addon": "15.2.5",
 "@grapecity/spread-sheets-pivots": "^14.0.0",
 "@grapecity/spread-sheets-print": "15.2.5",
 "@grapecity/spread-sheets-resources-zh": "15.2.5",
 "@grapecity/spread-sheets-shapes": "15.2.5",
 "@grapecity/spread-sheets-tablesheet": "15.2.5",
 "file-saver": "^2.0.5"
}           

2、接着我們在lib檔案夾下建立Designer.svelte,在此檔案中建立Designer的目标DOM元素:

<div id="designerHost" class="designer-host"></div>           

3、接着為此容器設定寬高,以及引入css資源

<style scoped>
 @import "@grapecity/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css";
 @import '@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css';
 .designer-host {
 width: 100%;
 height: 100Vh;
 }
</style>           

4、接着引入js相關資源

<script> 
 import {onMount} from 'svelte';
 //列印相關資源
 import '@grapecity/spread-sheets-print';
 //圖表相關資源
 import "@grapecity/spread-sheets-charts";
 //形狀、圖檔相關資源
 import '@grapecity/spread-sheets-shapes';
 //資料透視表相關資源(按需引入)
 import '@grapecity/spread-sheets-pivot-addon';
 //集算表相關資源(按需引入)
 import '@grapecity/spread-sheets-tablesheet';
 import '@grapecity/spread-sheets-designer-resources-cn';
 import '@grapecity/spread-sheets-designer';
 import * as GC from '@grapecity/spread-sheets';
 import * as GCDesigner from '@grapecity/spread-sheets-designer';
</script>           

5、最後在omMount生命周期鈎子函數中,初始化Designer容器,并設定資料,添加圖表

<script> 
 let designer = null;
 onMount(async () => {
 designer = new GCDesigner.Spread.Sheets.Designer.Designer(document.getElementById("designerHost"));
 let spread = designer.getWorkbook();
 let sheet = spread.getActiveSheet();
 //設定列寬
 sheet.setColumnWidth(2, 100);
 sheet.setColumnWidth(4, 100);
 // 建立資料數組
 var dataArray =
 [
 ['Region', 'Subregion', 'country', 'Population'],
 ['Asia', 'Southern', 'India', 1354051854],
 [, , 'Pakistan', 200813818],
 [, , 'Bangladesh', 166368149],
 [, , 'Others', 170220300],
 [, 'Eastern', 'China', 1415045928],
 [, , 'Japan', 127185332],
 [, , 'Others', 111652273],
 [, 'South-Eastern', , 655636576],
 [, 'Western', , 272298399],
 [, 'Central', , 71860465],
 ['Africa', 'Eastern', , 433643132],
 [, 'Western', , 381980688],
 [, 'Northern', , 237784677],
 [, 'Others', , 234512021],
 ['Europe', , , 742648010],
 ['Others', , , 1057117703]
 ];
 // 設定數組
 sheet.setArray(1, 1, dataArray);
 sheet.charts.add('chart1',
 GC.Spread.Sheets.Charts.ChartType.treemap, 450, 0, 500, 500, "B2:E18");
 });
</script>            

6、完成Designer.svelte檔案的編輯後,在app.svelte檔案中進行引入。最後實作效果如下:

Svelte架構結合SpreadJS實作純前端類Excel線上報表設計

從上圖中可以看出,設計器Designer元件包括功能區、公式欄、狀态欄、側面闆和上下文菜單。通過這些功能,可線上/離線設計報表模闆、編輯、計算、分析資料并與資料庫綁定,滿足填報系統開發需求。

介紹完在svelte架構中初始化designer元件及建立圖表相關功能後,接下來介紹下什麼是類Excel報表設計以及如何實作在svelte架構實作類Excel線上報表設計。

使用類 Excel 模式設計各類報表,既可以保留使用者的使用習慣,又可以輕松實作資料從本地到線上的平滑遷移。通過嵌入 SpreadJS 純前端表格控件,企業可迅速搭建出一系列符合 Excel 使用習慣、功能布局高度類似 Excel 、可直接讀寫 Excel 文檔的資訊系統,充分滿足企業各類複雜報表的設計需求,進一步提高企業資料管理效率。

下文通過在Designer中設計模闆,綁定字段,綁定資料,導出excel等功能為例來介紹如何線上報表設計。

1、設計模闆

通過菜單欄标題進行設計:對A1到E3區域單元格合并,并設定居中,設定字型為楷體18号;設定頁眉字型為11号字型。同時Designer元件還支援表單設計,如複選框,單選框,下拉框,日期選擇等。

結果如下圖所示:

Svelte架構結合SpreadJS實作純前端類Excel線上報表設計

2、綁定字段

設計模闆後,就可以進行綁定字段了。在”資料“頁簽中,選擇工作表綁定,出現字段清單這個側邊欄,然後右鍵,然後滑鼠懸浮在Source根字段附件,出現“+”圖示,此時點選“+”,新增字段或者table,最後設計的字段清單如下圖所示:

Svelte架構結合SpreadJS實作純前端類Excel線上報表設計

設計字段清單後,可以通過拖拽方式放入指定位置:

如下圖所示:

Svelte架構結合SpreadJS實作純前端類Excel線上報表設計

至此建議模闆及字段綁定工作就完成了。

3、資料綁定

資料綁定有兩種方式:

第一種是将目前設計好的模闆與字段清單儲存為json檔案,在後端GcExcel中進行解析,并且填充資料。

第二種方在前端調用一個http請求,擷取傳回資料後,進行setDataSource()操作。

此兩種方式都需要在菜單欄中添加一個按鈕,讓使用者可以點選操作

下面先介紹下如何自定義菜單欄。介紹之後再分别介紹下如何實作這兩種資料綁定。

var config = JSON.parse(JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig))
config.commandMap = {
 BindData: {
 title: "BindData data to server",
 text: "資料綁定",
 iconClass: "ribbon-button-welcome",
 bigButton: "true",
 commandName: "BindData",
 execute: async (context, propertyName, fontItalicChecked) => {},
 },
 "Save": {
 iconClass: "ribbon-button-download",
 text: "儲存",
 commandName: "save",
 execute: async function (context, propertyName) {},
 }
};
config.ribbon[0].buttonGroups[0] = {
 thumbnailClass: "save",
 commandGroup: {
 children: [
 {
 direction: "vertical",
 commands: ["BindData","Save"],
 }
 ],
 },
};
 designer.setConfig(config)           

通過上述代碼就可以實作在菜單欄實作兩個簡易按鈕。

Svelte架構結合SpreadJS實作純前端類Excel線上報表設計

實作按鈕之後,可以重寫execute方法。

上面講到的第一種方法是将目前Spread與字段清單合并為同一個json ,然後發送給後端,GcExcel接收json資料,

前端代碼為:

execute: async (context, propertyName, fontItalicChecked) => {
 let spread = context.Spread;
 let formData = new FormData();
 let json = spread.toJSON({
 includeBindingSource: true
 })

 var designerBindingPathSchema = designer.getData("treeNodeFromJson") || designer.getData("updatedTreeNode") || designer.getData("oldTreeNodeFromJson");
 json.schema = designerBindingPathSchema
 formData.append('json',JSON.stringify(json))
 $.ajax({
 type: "post",
 url: "http://localhost:8080/excel",
 data: formData,
 processData: false, //必須
 contentType: false, //必須
 success: function (data) {
 console.log(data)
 spread.fromJSON(JSON.parse(data))
 },
 error: function () {
 alert("請求失敗");
 }
 });
 },           

後端代碼為:

@PostMapping (value = "/excel")
@CrossOrigin
public String greeting(@RequestParam(name="json") String json, Model model) {
 
 Workbook workbook = new Workbook();
 System.out.print(json.toString());
 workbook.fromJson(json);
 StationInfo stationInfo = new StationInfo();
 stationInfo.name = "實驗站";
 stationInfo.date = String.valueOf(new Date());
 stationInfo.rainFalls = new ArrayList<RainFall>();
 
 RainFall rainFall = new RainFall();
 rainFall.time = "03:12";
 rainFall.precipitation = "21.23";
 rainFall.rain = "0.23";
 rainFall.record_person = "李四";
 rainFall.remark = "";
 stationInfo.rainFalls.add(rainFall);
 IWorksheet worksheet = workbook.getWorksheets().get(0);
 worksheet.setDataSource(stationInfo);
 
 workbook.save("json/test.pdf");
 workbook.save("json/test.xlsx");
 String jsonWithOption = workbook.toJson();
 
 return jsonWithOption;
 }           

後端将處理号的json傳回給前端,前端fromJSON就可以看到相關資料啦。

接下來介紹下第二種方式,第二種方式較為簡單,第一種方式适用于大資料量及大量公式的場景,在後端處理資料可以大大提升性能。第二種方法在前端發送一個http請求,接收後端傳回的資料,然後setDataSource()即可。

4、導入導出

最後介紹下designer的導入導出功能,designer支援導入ssjson檔案、excel檔案、csv檔案;支援導出ssjson檔案、excel檔案、csv檔案、pdf檔案。滿足各種導入導出場景。

以上就是使用Svelte架構結合SpreadJS實作純前端類Excel線上報表設計的全部内容啦,其實關于線上報表設計還有超級多的功能等待大家去發現,歡迎大家搜尋并通路葡萄城官網,快來體驗一下吧。

繼續閱讀