highcharts圖表及報表展示、導出數據

来源:https://www.cnblogs.com/folyh/archive/2022/07/21/16500953.html
-Advertisement-
Play Games

@(文章目錄) 提示:本文僅供學習交流,請勿用於非法活動! 前言 本文大概內容: 在官網展現圖表及報表(含導出) 一、使用highcharts前後端交互展示圖表,及使用報表導出 如下圖,我們在首頁如何將折線圖、柱狀圖結合報表,並實現根據不同的倉庫實時刷新不同的數據,最後可以選擇導出圖表及報表。 二、 ...


@

目錄

提示:本文僅供學習交流,請勿用於非法活動!


前言

本文大概內容:
在官網展現圖表及報表(含導出)


一、使用highcharts前後端交互展示圖表,及使用報表導出

如下圖,我們在首頁如何將折線圖、柱狀圖結合報表,並實現根據不同的倉庫實時刷新不同的數據,最後可以選擇導出圖表及報表。
在這裡插入圖片描述 

二、實現思路

1.圖表可以選擇echarts、highcharts,我們這裡選擇highcharts(echarts使用差不多),使用很簡潔方便,並自帶導出圖表、列印等功能。

2.報表導出我們選擇apache的HSSFWorkbook進行報表導出。

 

三、實現步驟

1.ElementUI代碼

我們使用將頁面分成上、左下、右下,再分別將折線圖、柱狀圖、報表填充進去。
代碼如下:

// 前面公司的搜索框省略....
				<el-row>
					<el-col :span="24">
						<div  class="grid-content bg-purple-dark">
							<div style="height: 270px" id="container11"></div>
						</div>
					</el-col>
				</el-row>
				<el-row :gutter="20">
					<el-col :span="16">
						<div  class="grid-content bg-purple-light">
							<div style="height: 300px" id="container13"></div>
						</div>
					</el-col>
					<el-col :span="1"><div>&nbsp;</div></el-col>
					<el-col :span="6">
						<div class="grid-content bg-purple-light">
							<div style="height: 320px">
								<el-table ref="table" :data="tableData"  border size="mini"
										  :summary-method="getSummaries" show-summary>
									<el-table-column prop="twoTypeName" label="菜類名稱" width="125px" height="10px"></el-table-column>
									<el-table-column prop="quantity" label="數量" width="145px" height="10px"></el-table-column>
									<el-table-column prop="tickets" label="小票數" width="130px" height="10px"></el-table-column>
								</el-table>
							</div>
						</div>
					</el-col>
					<el-col :span="1"><div>&nbsp;</div></el-col>
				</el-row>

2.js代碼:

2.1 首先要使用mounted鉤子函數掛載調用圖表及報表方法:

	mounted() {
		this.moreChart1();
		this.moreChart3();
		this.getDayTicketsQuantity();
	},

2.2 然後要創建methods調用圖表方法及報表方法

		methods: {
			// 折線圖方法
			moreChart1(warehouseid) {
			// 這裡帶上倉庫id,到時就可以根據不同倉庫切換數據
				var param = {"warehouseid":warehouseid};
				axios.get("url1",{params:param})
						.then(function (r) {
							var list = r.data.data;
							console.log(list);
							let titles = [];
							let values = [];
							// 將後端獲得的數據放入折線圖的下麵X、Y軸定義的變數中
							for(let i=0;i<list.length;i++){
								titles[i] = list[i].createDay;
								values[i] = list[i].totalDayTickets;
							}
							var chart = Highcharts.chart('container11', {
								chart: {
									type: 'line'
								},
								title: {
									text: '每日小票總數'
								},
								subtitle: {
									text: '每日小票總數'
								},
								xAxis: {
									categories: titles
								},
								yAxis: {
									title: {
										text: '小票數(張)'
									}
								},
								plotOptions: {
									line: {
										dataLabels: {
											// 開啟數據標簽
											enabled: true
										},
										// 關閉滑鼠跟蹤,對應的提示框、點擊事件會失效
										enableMouseTracking: true
									}
								},
								series: [{
									name: '',
									data: values
								},]
							});
						})
			},
			
			// 柱狀圖方法
			moreChart3(warehouseid) {
				var param = {"warehouseid":warehouseid};
				axios.get("url2",{params:param})
					.then(r=>{
						var list = r.data.data;
						console.log(list);
						let titles = [];
						let values = [];
						for(let i=0; i<list.length;i++){
							titles[i] = list[i].twoTypeName;
							values[i] = list[i].tickets;
						}
						var chart = Highcharts.chart('container13',{
							chart: {
								type: 'column'
							},
							title: {
								text: '今日小票數'
							},
							subtitle: {
								text: '今日小票數'
							},
							xAxis: {
								categories: titles,
								crosshair: true
							},
							yAxis: {
								min: 0,
								title: {
									text: '小票數(張)'
								}
							},
							tooltip: {
								// head + 每個 point + footer 拼接成完整的 table
								headerFormat: '<span style="font-size:10px">{point.key}</span><table>',
								pointFormat: '<tr><td style="color:{series.color};padding:0">{series.name}: </td>' +
										'<td style="padding:0"><b>{point.y:1f}</b></td></tr>',
								footerFormat: '</table>',
								shared: true,
								useHTML: true
							},
							plotOptions: {
								column: {
									borderWidth: 0
								}
							},
							series: [{
								name: '',
								data: values
							}]
						});
					})
			},
			
			// 報表方法			
			getDayTicketsQuantity(warehouseid){
				this.doGetData(url3,{warehouseid:warehouseid},function (r) {
					if(r.success){
						this.tableData = r.data;
					}
				})
			},
			
			// 這裡會根據頁面上選擇不同的倉庫後觸發該方法,圖表和報表數據就會跟著改變
			getChangeData(warehouseid){
				this.moreChart1(warehouseid);
				this.moreChart3(warehouseid);
				this.getDayTicketsQuantity(warehouseid);
			},
		}
	});

2.4 著重要講一點:下麵是直接在報表多生成一行並計算總票數

			getSummaries: function (param) {
				const { columns, data } = param;
				const sums = [];
				columns.forEach((column, index) => {
					var flag = false;
					if(index === 0){
						sums[index] = '合計';
						return;
					}
					if( index != 2){
						sums[index] = '';
						return;
					}
					const values = data.map(item => Number(item[column.property]));
					if(!values.every(value => isNaN(value))){
						sums[index] = values.reduce((prev,curr) => {
							const value = Number(curr);
							if(!isNaN(value)){
								return prev + curr;
							} else {
								return prev;
							}
						}, 0);
					}
					if(index === 2){
						sums[index] = sums[index].toFixed(0);
					}
				});
				return sums;
			},

2.5 導出報表方法

	function ticketsQuantityExportExcel(){
		var str="";
		if(app.filterParams.warehouseid!=null){
			str+="warehouseid="+app.filterParams.warehouseid;
		}
		window.location.href = "url3"+str;
	}

 

3.後端HSSFWorkbook的java代碼

	@RequestMapping("/ticketsQuantityExportExcel")
	@ResponseBody
	public void ticketsQuantityExportExcel(HttpServletResponse response,String warehouseid){
		try{
			String docName = "今日小票及數量";
			OutputStream outputStream = response.getOutputStream();
			response.setContentType("application/vnd_ms-excel");
			response.setHeader("Content-disposition","attachment;filename="
					+new String(docName.getBytes("gb2312"),"ISO8859-1")+".xls");
			List<DayTicketsQuantityDto> list = reportService.listDayTicketsQuantity(warehouseid);
			ticketsQuantityExcelOutPut(list,outputStream,docName);
			outputStream.flush();
			outputStream.close();
		} catch (Exception e) {
			logger.error("導出失敗!params:" + warehouseid, e);
		}
	}

	public void ticketsQuantityExcelOutPut(List<DayTicketsQuantityDto> list, OutputStream ouputStream,
												String docName) throws IOException {
								
		// 初始化表格及字體邊框				
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet(docName);
		HSSFRow row = null;
		HSSFCell cell = null;
		sheet.setDefaultRowHeightInPoints(20);

		row = sheet.createRow((int) 0);
		HSSFCellStyle style = wb.createCellStyle();
		HSSFFont font1 = wb.createFont();
		font1.setFontName("宋體");
		font1.setFontHeightInPoints((short) 14);
		font1.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下邊框
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上邊框
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		style.setFillForegroundColor(IndexedColors.WHITE.getIndex());
		style.setFont(font1);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

		HSSFFont font2 = wb.createFont();
		font2.setFontName("宋體");
		font2.setFontHeightInPoints((short) 12);

		HSSFCellStyle ji = wb.createCellStyle();
		ji.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		ji.setFillForegroundColor(IndexedColors.WHITE.getIndex());
		ji.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		ji.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		ji.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下邊框
		ji.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左邊框
		ji.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上邊框
		ji.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右邊框
		ji.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		ji.setFont(font2);

		// 增加表格表頭倉庫名稱及報表日期(報表裡面沒有)
		DayTicketsQuantityDto dto = list.get(0);
		if(dto!=null){
			row = sheet.createRow((int)0);
			cell = row.createCell(0);
			cell.setCellValue("倉庫名稱");
			cell.setCellStyle(style);
			sheet.autoSizeColumn(0);
			sheet.setColumnWidth(0,20*356);

			cell = row.createCell(1);
			cell.setCellValue(dto.getWarehouseName());
			cell.setCellStyle(style);
			sheet.autoSizeColumn(0);
			sheet.setColumnWidth(0, 20 * 356);

			row = sheet.createRow((int) 1);
			cell = row.createCell(0);
			cell.setCellValue("報表日期");
			cell.setCellStyle(style);
			sheet.autoSizeColumn(0);
			sheet.setColumnWidth(0, 20 * 356);

			cell = row.createCell(1);
			cell.setCellValue(dto.getCreateDay());
			cell.setCellStyle(style);
			sheet.autoSizeColumn(0);
			sheet.setColumnWidth(0, 20 * 356);
		}

		// 正式構建表格正文表格並將查詢的數據填充進去
		String[] excelHeader = {"菜類名稱","數量","小票數"};
		row = sheet.createRow((int)2);

		for (int i = 0; i < excelHeader.length; i++) {
			cell = row.createCell(i);
			cell.setCellValue(excelHeader[i]);
			cell.setCellStyle(style);
			sheet.autoSizeColumn(i);
			sheet.setColumnWidth(i, 20 * 356);
		}
		if (list != null && list.size() > 0) {
			Integer totalTickets = 0;
			for (int i = 0; i < list.size(); i++) {
				row = sheet.createRow(i + 3);
				DayTicketsQuantityDto trn = list.get(i);
				if (trn != null) {
					HSSFCell cell1 = row.createCell(0);
					if (trn.getTwoTypeName() != null) {
						cell1.setCellValue(trn.getTwoTypeName());
					}

					HSSFCell cell2 = row.createCell(1);
					if (trn.getQuantity() != null) {
						cell2.setCellValue(Integer.valueOf(trn.getQuantity()));
					}
					HSSFCell cell3 = row.createCell(2);
					if (trn.getTickets() != null) {
						cell3.setCellValue(Integer.valueOf(trn.getTickets()));
						totalTickets += Integer.valueOf(trn.getTickets());
					}
					cell1.setCellStyle(ji);
					cell2.setCellStyle(ji);
					cell3.setCellStyle(ji);
				}
			}
			// 增加末行合計一行
			row = sheet.createRow(list.size() + 3);
			HSSFCell cell1 = row.createCell(0);
			cell1.setCellValue("合計");
			HSSFCell cell2 = row.createCell(1);
			cell2.setCellValue("");
			HSSFCell cell3 = row.createCell(2);
			cell3.setCellValue(totalTickets);
			cell1.setCellStyle(ji);
			cell2.setCellStyle(ji);
			cell3.setCellStyle(ji);
		}
		wb.write(ouputStream);
	}

}

 


四、最後的頁面如下:

在這裡插入圖片描述


隨心所往,看見未來。Follow your heart,see night!

歡迎點贊、關註、留言,一起學習、交流!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Postico for Mac是Mac平臺上一款功能強大的PostgreSQL客戶端,Postico Mac版憑藉著簡單易用的操作界面深受專業人員和新手的喜愛。 詳情:Postico for Mac(超好用的PostgreSQL客戶端) 功能特色 1、查看你的資料庫,然後根據需要編輯 Postico ...
  • 本文包含SQL基礎語法、函數、索引、sql編程、事務、事務原則、備份恢復,許可權資料庫設計、三大範式、JDBC、SQL註入、資料庫連接池等所有知識都在這裡了 ...
  • 原文地址:Kotlin學習快速入門(8)—— 屬性委托 - Stars-One的雜貨小窩 委托其實是一種設計模式,但Kotlin把此特性編寫進了語法中,可以方便開發者快速使用 委托對應的關鍵字是by 屬性委托 先講下屬性委托吧,首先,複習下kotlin中設置set和get方法 預設的set和get我 ...
  • 華為應用內支付服務(In-App Purchases)通過簡便的接入流程為用戶提供良好的應用內支付體驗,然而在實際接入過程中,有一些開發者反饋測試時會無法正常拉起支付頁面,下文將詳細分析問題出現的5種情形,並給出解決方案,希望給遇到類似問題的開發者提供參考。 情形1:AGC控制臺上API管理中的支付 ...
  • JavaScript進階內容——BOM詳解 在上一篇文章中我們學習了DOM,接下來讓我們先通過和DOM的對比來簡單瞭解一下BOM 首先我們先來複習一下DOM: 文檔對象模型 DOM把文檔當作一個對象來看待 DOM的頂級對象是document DOM的主要學習是操作頁面元素 DOM是W3C標準規範 然 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、Git 1. git 和 svn 的區別 git 和 svn 最大的區別在於 git 是分散式的,而 svn 是集中式的。因此我們不能再離線的情況下使用 svn。如果伺服器出現問題,就沒有辦法使用 svn 來提交代碼。 svn 中的分 ...
  • ES6 class中的一些問題 記錄下class中的原型,實例,super之間的關係 //父類 class Dad { constructor(x, y) { this.x = 5; this.y = 1; this.state = 789 } static x = 521 state1 = 666 ...
  • 在早期的隨筆就介紹過,把常規頁面的內容拆分為幾個不同的組件,如普通的頁面,包括列表查詢、詳細資料查看、新增資料、編輯資料、導入資料等頁面場景,這些內容相對比較獨立,而有一定的代碼量,本篇隨筆介紹基於Vue3+Typescript+Setup語法方式,來拆分頁面模塊內容為組件,實現分而治之的處理。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...