excel導出_SpringBoot實現快速導出Excel

d20508be9e48da04309b33cdfe115e70.pngf86ef807d219aa8e2f6a8719d52cb22c.gif

?閱讀本文約需要6分鐘?

大家好,我是你們的導師,我每天都會在這里給大家分享一些干貨內容(當然了,周末也要允許老師休息一下哈)。上次老師跟大家分享了下MyBatis 幾種通用的寫法的相關知識,今天跟大家分享SpringBoot實現快速導出Excel的知識。

1?SpringBoot實現快速導出Excel

工作中經常遇到導出Ecxel功能,這里就給出完整示例代碼,可以直接使用。

1.引入依賴

<dependency> <groupId>org.apache.poigroupId> <artifactId>poi-ooxmlartifactId> <version>3.17version>dependency>

2. ExcelSheetSettingEnum

定義Excel的一些配置信息

public enum ExcelSheetSettingEnum { REPORT_TEST("report_test", "Excel文件名稱", new String[]{"Sheet名稱1", "Sheet名稱2"}, new String[]{"標題1", "標題2"}, new String[][]{ {"字段名稱A", "字段名稱B", "字段名稱C", "字段名稱D"}, {"字段名稱A", "字段名稱B", "字段名稱C", "字段名稱D"} }), REPORT_TEST2("report_test2", "Excel文件名稱", new String[]{"標題1", "標題2"}), REPORT_TEST3("report_test3", "Excel文件名稱") ; ExcelSheetSettingEnum(String code, String filename) { this.code = code; this.filename = filename; } ExcelSheetSettingEnum(String code, String filename, String[] titles) { this.code = code; this.filename = filename; this.titles = titles; } ExcelSheetSettingEnum(String code, String filename, String[] sheetnames, String[] titles, String[][] headers) { this.code = code; this.filename = filename; this.sheetnames = sheetnames; this.titles = titles; this.headers = headers; } /** 代碼標識(必選) */ private String code; /** 代碼標識(必選) */ private String filename; /** Sheet名稱(可選) */ private String[] sheetnames; /** Sheet標題(可選) */ private String[] titles; /** 表頭名稱(可選) */ private String[][] headers; // Getter & Setter}

3. ExcelView

定義Excel視圖,繼承自AbstractXlsxView或者AbstractXlsView, 需要實現一個abstract方法buildExcelDocument用于創建Sheet,構造Excel數據。

繼承關系如下:

9a5cf018059d29725db7a10ef4bb269f.png

/** * Excel視圖 * * 支持多個Sheet, Sheet名稱、標題和表頭不是必須的 * AbstractPdfView和AbstractXlsxView原理大致相同 * * @author mengday zhang */public class ExcelView extends AbstractXlsxView { @Override protected void buildExcelDocument(Map<String, Object> map, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { ExcelSheetSettingEnum setting = (ExcelSheetSettingEnum) map.get("ExcelSheetSetting"); // 設置文件名稱 String filename = setting.getFilename(); filename = new String(filename.getBytes("UTF-8"),"ISO8859-1"); response.setHeader(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename=" + filename + ".xlsx"); ListString>>> sheets = (List for (int i = 0; i < sheets.size(); i++) { // 創建sheet String[] sheetNames = setting.getSheetnames(); String sheetName = "Sheet" + (i + 1); if (sheetNames != null && sheetNames.length > 0) { sheetName = sheetNames[i]; } Sheet sheet = workbook.createSheet(sheetName); // 如果標題不為空的話,將表格的第一行作為標題行,并合并第一行的N個單元格 int index = 0; String[] titles = setting.getTitles(); String[][] headerss = setting.getHeaders(); ListString>> rowsForTable = sheets.get(i); if (titles != null && titles.length > 0) { // 合并標題單元格 下標從0開始 起始行號,終止行號, 起始列號,終止列號 CellRangeAddress region = new CellRangeAddress(0, 0, 0, rowsForTable.get(0).size() - 1); sheet.addMergedRegion(region); Row titleRow = sheet.createRow(index++); Cell titleCell = titleRow.createCell(0); CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setAlignment(HorizontalAlignment.CENTER); Font font = workbook.createFont(); font.setFontName("黑體"); font.setBold(true); font.setFontHeightInPoints((short) 15); cellStyle.setFont(font); titleCell.setCellStyle(cellStyle); titleCell.setCellValue(titles[i]); } // 創建表頭行 if (headerss != null && headerss.length > 0) { Row headerRow = sheet.createRow(index++); String[] headers = headerss[i]; for(int j = 0; j < headers.length; j++) { headerRow.createCell(j).setCellValue(headers[j]); } } // 創建數據行 AtomicInteger rowIndex = new AtomicInteger(index); rowsForTable.forEach(rowList -> { Row row = sheet.createRow(rowIndex.getAndIncrement()); AtomicInteger x = new AtomicInteger(); rowList.forEach(cell -> row.createCell(x.getAndIncrement()).setCellValue(cell) ); }); } }}

d20508be9e48da04309b33cdfe115e70.png

4.controller

mvc方法中方法的返回值是ModelAndView, 當代碼執行new ModelAndView(excelView, map)時會執行ExcelView#buildExcelDocument的方法

@RestController@RequestMapping("/excel")public class ExcelController { @RequestMapping("/export") public ModelAndView export(){ ListString>> sheet1 = Arrays.asList( Arrays.asList("1", "11", "111", "1111"), Arrays.asList("2", "22", "222", "2222"), Arrays.asList("3", "33", "333", "3333") ); ListString>> sheet2 = Arrays.asList( Arrays.asList("4", "44", "444", "4444"), Arrays.asList("5", "55", "555", "5555"), Arrays.asList("6", "66", "666", "6666") ); ListString>>> sheets = Arrays.asList(sheet1, sheet2); Map<String, Object> map = new HashMap<>(); map.put("ExcelSheetSetting", ExcelSheetSettingEnum.REPORT_TEST2); map.put("data", sheets); ExcelView excelView = new ExcelView(); return new ModelAndView(excelView, map); }}
參考來源:toutiao.com/i6818009760873316875/

今天就分享這么多,于SpringBoot實現快速導出Excel會了多少歡迎在留言區評論,對于有價值的留言,我們都會一一回復的。如果覺得文章對你有一丟丟幫助,請點右下角【在看】,讓更多人看到該文章。

d20508be9e48da04309b33cdfe115e70.png

????dbfd032f1f4267958f66cdaaf5ea20e0.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SignalR Self Host+MVC等多端消息推送服務(4)

由于工作太忙&#xff0c;一直沒時間更新博客&#xff0c;之前有很多朋友一直問我什么時候將后續的代碼發上來&#xff0c;一直沒時間&#xff0c;今天就長話短說&#xff0c;不寫文章了&#xff0c;直接上demo&#xff0c;里面將正式項目中用到的一些敏感信息修改了&#xff0…

項目中需要總結的內容

1.鐵塔項目的硬件總結 2.傳感器項目的硬件總結 3.燈控項目的硬件總結 控制燈閃爍的電路&#xff0c;SIM卡板子復位電路&#xff0c;繼電器控制電路轉載于:https://www.cnblogs.com/yuesheng/p/6086647.html

計算機應用計算機電算化題庫,2014年浙江省會計電算化客觀題題庫

第一套試題一、單選題1.在會計軟件初始設置中&#xff0c;錄入期初余額時(C)A&#xff0e;只要求錄入一級科目的期初余額 B.只要求錄入中間級科目的期初余額C&#xff0e;每級科目均需錄入期初余額 D.只要求錄入最末級科目的期初余額2.在總賬系中&#xff0c;要求能夠進行上下級…

使用一些我喜歡的東西開始使用ES6

by Todd Palmer托德帕爾默(Todd Palmer) 使用一些我喜歡的東西開始使用ES6 (Getting started with ES6 using a few of my favorite things) This tutorial walks you through some easy steps to get started learning the newest version of JavaScript: ES6.本教程將引導您…

A 子類繼承父類,子類的構造函數會覆蓋父類的構造函數

//子類 沒有定義 構造 函數時&#xff0c;默認繼承父類的構造方法&#xff1a;輸出結果為 Class A... // 子類 定義了 構造 函數時&#xff0c;就不會繼承父類的構造方法&#xff1a;輸出結果是 Class B... <?php class A{ public function __construct(){ echo &qu…

fifo算法_緩存算法FIFO、LFU、LRU

閱讀文本大概需要3分鐘。0x01&#xff1a;FIFO算法FIFO(First in First out)&#xff0c;先進先出。其實在操作系統的設計理念中很多地方都利用到了先進先出的思想&#xff0c;比如作業調度(先來先服務)&#xff0c;為什么這個原則在很多地方都會用到呢&#xff1f;因為這個原則…

Pile 0009: Vim命令梳理

正常模式&#xff08;按Esc或Ctrl[進入&#xff09; 左下角顯示文件名或為空插入模式&#xff08;按i鍵進入&#xff09; 左下角顯示--INSERT--可視模式&#xff08;按v鍵進入&#xff09; 左下角顯示--VISUAL-- i 在當前位置生前插入 I 在當前行首插入 a 在當前位置后插入 A 在…

Introduction of Version Control/Git, SVN

Introduction of Version Control/Git, SVN 什么是版本控制&#xff1f; 你可以把一個版本控制系統&#xff08;縮寫VCS&#xff09;理解為一個“數據庫”&#xff0c;在需要的時候&#xff0c;它可以幫你完整地保存一個項目的快照。當你需要查看一個之前的快照&#xff08;稱之…

怎樣設置計算機遠程桌面,電腦如何設置遠程連接,手把手教你如何遠程

說起遠程桌面很多用戶都認為是從WIN2000 SERVER才開始引入的&#xff0c;實際上我們可以在WIN98甚至是DOS中看到他的身影。遠程桌面采用的是一種類似TELNET的技術&#xff0c;他是從TELNET協議發展而來的。那么如何設置自動開機&#xff0c;下面&#xff0c;我們就來看看如何設…

查看這些有用的ECMAScript 2015(ES6)提示和技巧

by rajaraodv通過rajaraodv 查看這些有用的ECMAScript 2015(ES6)提示和技巧 (Check out these useful ECMAScript 2015 (ES6) tips and tricks) EcmaScript 2015 (aka ES6) has been around for couple of years now, and various new features can be used in clever ways. I…

inputstream轉fileinputstream對象_FileInputStream類:文件字節輸入流

API ----IO ----字節輸入輸出流練習 java.lang.Object 繼承者 java.io.InputStream 繼承者 java.io.FileInputStreampublic FileInputStream類速查速記&#xff1a;直接包裝File用于從記事本中讀數據 in是針對java來說的&#xff0c;從記事本讀入到java* 構造方法&#xff1a;…

IBM將推NVMe存儲解決方案

先前&#xff0c;IBM曾對外宣稱將開發新的NVMe解決方案&#xff0c;并推動行業參與者進一步探索新協議&#xff0c;以支持更快的數據傳輸。周日&#xff0c;IBM表示新的語言協議——NVMe&#xff08;非易失性存儲器&#xff09;正在逐步取代SAS和SATA等舊有的固態硬盤存儲標準。…

html5中3個盒子怎樣設置,Web前端開發任務驅動式教程(HTML5+CSS3+JavaScript)任務10 盒子模型及應用.pptx...

第五單元 盒子模型任務10 盒子模型及應用學習目標盒子模型的概念掌握邊框的設置內邊距的設置外邊距的設置學習目標了解:利用盒子模型布局網頁的優勢任務目標實戰演練——制作古詩文欣賞網頁強化訓練——制作散文賞析網頁知識準備1. 盒子模型的概念知識準備1. 盒子模型的概念CSS…

SQL手工注入入門級筆記(更新中)

一、字符型注入 針對如下php代碼進行注入&#xff1a; $sql"select user_name from users where name$_GET[name]"; 正常訪問URL:http://url/xxx.php?nameadmin 此時實際數據庫語句: select user_name from users where nameadmin 利用以上結果可想到SQL注入構造語句…

materialize_使用Materialize快速介紹材料設計

materialize什么是材料設計&#xff1f; (What is Material Design?) Material Design is a design language created by Google. According to material.io, Material Design aims to combine:Material Design是Google創建的一種設計語言。 根據material.io &#xff0c;Mate…

python處理完數據導入數據庫_python 將execl測試數據導入數據庫操作

import xlrd import pymysql # 打開execl表 book xlrd.open_workbook(XXXX測試用例.xlsx) sheet book.sheet_by_name(Sheet1) # print(sheet.nrows) # 創建mysql連接 conn pymysql.connect( host127.0.0.1, userroot, password123456, dbdemo1, port3306, charsetutf8 ) # 獲…

增刪改查類

<?php // 所有數據表的基類 abstract class Model {protected $tableName "";protected $pdo "";protected $sql"";function __construct() {$pdo new PDO( "mysql:host" . DB_HOST . ";dbname" . DB_NAME, DB_USERN…

html網頁和cgi程序編程,CGI 編程方式學習

1.大家都知道CGI是通用網關接口&#xff0c;可以用來編寫動態網頁。而且CGI可以用很多種語言來寫&#xff0c;用perl來編寫最常見&#xff0c;我這里就是用perl來編寫做例子。講到編寫CGI編程方式&#xff0c;編寫CGI有兩程編程風格。(1)功能型編程(function-oriented style)這…

20175305張天鈺 《java程序設計》第四周課下測試總結

第四周課下測試總結 錯題 某方法在父類的訪問權限是public&#xff0c;則子類重寫時級別可以是protected。 A .true B .false 正確答案&#xff1a;B 解析&#xff1a;書P122&#xff1a;子類不允許降低方法的訪問權限&#xff0c;但可以提高訪問權限。 復雜題&#xff08;易錯…

強化學習q學習求最值_通過Q學習更深入地學習強化學習

強化學習q學習求最值by Thomas Simonini通過托馬斯西蒙尼(Thomas Simonini) 通過Q學習更深入地學習強化學習 (Diving deeper into Reinforcement Learning with Q-Learning) This article is part of Deep Reinforcement Learning Course with Tensorflow ??. Check the syl…