日常在做后臺系統的時候會很頻繁的遇到Excel導入導出的問題,正好這次在做一個后臺系統,就想著寫一個公用工具來進行Excel的導入導出。
一般我們在導出的時候都是導出的前端表格,而前端表格同時也會對應的在后臺有一個映射類。
所以在寫這個工具時我們先理一下需要實現的效果:
- 導出方法接收一個list集合,和一個Class類型,和HttpServletResponse 對象
- 導出是可能會有下拉列表,所以需要一個map存儲下拉列表數據源,傳入參數后只需一行代碼即可導出
- 導入方法需要傳入file文件,以及一個Class類型,導入之后將會返回一個list集合,里面的對象就是傳入類型的對象,傳入參數后只需一行代碼即可導入
實現過程:
首先需要創建三個注解 一個是EnableExport ,必須有這個注解才能導出
/** *設置允許導出 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExport{ StringfileName(); } 然后就是EnableExportField,有這個注解的字段才會導出到Excel里面,并且可以設置列寬。
/** *設置該字段允許導出 *并且可以設置寬度 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExportField{ intcolWidth()default100; StringcolName(); } 再就是ImportIndex,導入的時候設置Excel中的列對應的序號
/** *導入時索引 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceImportIndex{ intindex(); } 注解使用示例
三個注解創建好之后就需要開始操作Excel了
首先,導入方法。在后臺接收到前端上傳的Excel文件之后,使用poi來讀取Excel文件。擴展:接私活 我們根據傳入的類型上面的字段注解的順序來分別為不同的字段賦值,然后存入集合中,再返回 代碼如下:
/** *將Excel轉換為對象集合 *@paramexcelExcel文件 *@paramclazzpojo類型 *@return */ publicstaticList
- 建立一張sheet表
- 設置標的行高和列寬
- 繪制標題和表頭
這兩個方法是自定義方法,代碼會貼在后面
- 寫入數據到Excel
- 創建下拉列表
- 寫入文件到response
到這里導出工作就完成了
colNames){ //插入標題行 hssfRow=hssfsheet.createRow(1); for(inti=0;ireturn */ publicstaticvoidcreateDataValidation(Sheetsheet,MapselectListMap){ if(selectListMap!=null){ selectListMap.forEach( //第幾列校驗(0開始)key數據源數組value (key,value)->{ if(value.length>0){ CellRangeAddressListcellRangeAddressList=newCellRangeAddressList(2,65535,key,key); DataValidationHelperhelper=sheet.getDataValidationHelper(); DataValidationConstraintconstraint=helper.createExplicitListConstraint(value); DataValidationdataValidation=helper.createValidation(constraint,cellRangeAddressList); //處理Excel兼容性問題 if(dataValidationinstanceofXSSFDataValidation){ dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); }else{ dataValidation.setSuppressDropDownArrow(false); } dataValidation.setEmptyCellAllowed(true); dataValidation.setShowPromptBox(true); dataValidation.createPromptBox("提示","只能選擇下拉框里面的數據"); sheet.addValidationData(dataValidation); } } ); } }
下面是一些自定義方法的代碼
/** *獲取一個基本的帶邊框的單元格 *@paramworkbook *@return */ privatestaticHSSFCellStylegetBasicCellStyle(HSSFWorkbookworkbook){ HSSFCellStylehssfcellstyle=workbook.createCellStyle(); hssfcellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); hssfcellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); hssfcellstyle.setWrapText(true); returnhssfcellstyle; } /** *獲取帶有背景色的標題單元格 *@paramworkbook *@return */ privatestaticHSSFCellStylegetTitleCellStyle(HSSFWorkbookworkbook){ HSSFCellStylehssfcellstyle=getBasicCellStyle(workbook); hssfcellstyle.setFillForegroundColor((short)HSSFColor.CORNFLOWER_BLUE.index);//設置背景色 hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); returnhssfcellstyle; } /** *創建一個跨列的標題行 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramallColNum *@paramtitle */ privatestaticvoidcreateTitle(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,intallColNum,Stringtitle){ //在sheet里增加合并單元格 CellRangeAddresscra=newCellRangeAddress(0,0,0,allColNum); hssfsheet.addMergedRegion(cra); //使用RegionUtil類為合并后的單元格添加邊框 RegionUtil.setBorderBottom(1,cra,hssfsheet,workbook);//下邊框 RegionUtil.setBorderLeft(1,cra,hssfsheet,workbook);//左邊框 RegionUtil.setBorderRight(1,cra,hssfsheet,workbook);//有邊框 RegionUtil.setBorderTop(1,cra,hssfsheet,workbook);//上邊框 //設置表頭 hssfRow=hssfsheet.getRow(0); hssfcell=hssfRow.getCell(0); hssfcell.setCellStyle(getTitleCellStyle(workbook)); hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING); hssfcell.setCellValue(title); } /** *設置表頭標題欄以及表格高度 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramcolNames */ privatestaticvoidcreateHeadRow(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,List
使用實例
導出數據
導入數據(返回對象List)
源碼地址:
https://github.com/xyz0101/excelutils
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Excel
+關注
關注
4文章
218瀏覽量
55518 -
代碼
+關注
關注
30文章
4780瀏覽量
68529
原文標題:注解+反射優雅的實現Excel導入導出(通用版),飄了!
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
SOLIDWORKS高級BOM及屬性批量導入工具
SOLIDWORKS BOM插件-SolidKits.BOMs工具可以準確、規范、便捷的一鍵完成各種結構BOM導出,匯總BOM生成,批量導入屬性,自動建立結構,實現規范化管理,并自定義
如何導入Altium Designer的原理圖和PCB?
其它導入器那樣,必須要求先把AD文件另存為ASCII的格式。 ” 導入原理圖 1. 首選打開KiCad, 創建一個新的工程,并打開原理圖。 2.點擊“文件->
Kali Linux常用工具介紹
Kali Linux 虛擬機中自帶了大量滲透測試工具,涵蓋了信息收集、漏洞利用、口令破解、漏洞掃描等多個方面。 以下是按分類簡要介紹一部分常用工具的使用方法: 使用方法只能當做參考,**詳細
dubbo3.0 服務導入導出原理
不管是服務導出還是服務引入,都發生在應用啟動過程中,比如:在啟動類上加上 @EnableDubbo 時,該注解上有一個 @DubboComponentScan 注解
立創商城導出來的CAE和PCB封裝用PADS導入遇到的問題
能導入的低版本DXP格式
如果采用第一種方法導入,就出現了分配CAE封裝的時候,管腳不能自動識別的問題,請問這個問題有解嗎?只不過不想自己畫CAE封裝而已,在pads里面,想直接導入立
發表于 09-21 17:17
使用cmsis-dap燒錄器對芯片cy8c4148azi-s455進行燒錄,一直失敗的原因?
我使用的燒錄器是通用型的cmsis-dap燒錄器,可以對6系芯片進行燒寫,但是這個芯片為什么一直出錯,是工具必須專用工具么?
發表于 07-24 06:07
數據分析的工具有哪些
數據分析是一個涉及收集、處理、分析和解釋數據以得出有意義見解的過程。在這個過程中,使用正確的工具至關重要。以下是一些主要的數據分析工具,以及
怎么用fatfs寫excel?
開始新建一個文件,寫了幾個漢字,存盤后用UE打開,全是亂碼,漢字不見了。
但是,公司的讀卡器插上U盤就能把考勤表都出來啊,EXCEL的。
然后,把考勤表文件拿到,用UE打開,XML的格式,雖然不懂
發表于 05-11 07:59
LabVIEW模板匹配位置信息導出
大家好,我在利用ni vision assistant生成的模板匹配界面時,想要將每一個匹配物體的位置信息導出到word或者Excel,但是他這個匹配個數不確定,怎么樣把匹配到的所有物體信息導
發表于 03-11 20:22
求助,如何在Micrium uc探針中導出REF_BGT60LTR11AIP_M0雷達原始數據?
我剛剛從 REF BGT60LTR11AIP M0 開始。那么官方的數據包只有一個基于 Micrium 的 GUI 界面,而這個 GUI 界面只有數據圖表,沒有導出數據開關。
右邊的exce
發表于 01-26 06:11
甲骨文發布VirtualBox 7.0.14版本,支持NVMe存儲導入導出
此次升級帶來了多項重要功能,例如支持導入與導出自帶NVMe存儲控制器的虛擬機;初始引入Red Hat Enterprise Linux 9.4的內置核心技術支持等等。同時,也涵蓋了多個bug修正,如
如何利用Excel輕松創建任意波形?
在從零開始創建任意波形時,大多數工程師要么采用工程編程環境,比如Matlab、LabVIEW或VEE,要么采用免費或收費的定制任意波形軟件套件。這些是很好的工具,但如果你不常用的話,它們的價格就顯得比較昂貴,并且學會使用也比較耗時。多數工程師未曾想到的另
評論